본문 바로가기

TIL

예외 처리를 하는 이유

예외는 왜 처리해야 하는걸까?

오늘 예외처리에 관련된 수업을 들었는데 이전에 개발하면서도 try/catch는 많이 써왔지만, 뭔가 관례적으로, 그냥 수동적으로 막 작성한 부분이있어서 이걸 왜 어떤 코드에 작성을해야하는지 명확하지 않았던 경험이있던 만큼

 

예외처리가 무엇인지보단, 왜 사용해야하는지에 대해 조금더 깊게 생각을 해보았습니다.

 

1. 우리가 의도한 동작이 아닐때를 대비하기위해

저는 첫번째 가장 기본적이고 심플한 이유가 이것이라고 생각합니다. 

흔히 버그가 일어날때를 대비해서라고 말하는데 진짜 말 그대로 우리가 의도한 동작은 A인데 사용자가 어떤식으로 갑자기 B처럼 사용을 한다면 우리가 의도한 동작이 아니게될 것 입니다. 이를 방지하기 위해서 예외처리를 하는 것입니다.

try {
    // 1. 위험한 행동 시도
    String member = iveMembers.get(10); 
} catch (IndexOutOfBoundsException e) {
    // 2. 예외가 발생하면 실행되는 구조 로직
    System.out.println("🚨 그런 멤버는 없습니다!");
}

 

2. 수동적이 아닌 능동적인 프로그램을만들기 위해서

이건 무슨 의미냐면 이런 질문을 가져봅시다. "우리가 의도한 동작이 아니면, 그게 아닐때 그냥 -1 , false 같은 것들을 반환하면 되는거 아님?" 이라는 질문은 가져본다면, 저 1번의 논리만으론,,,음...그렇지 사실 그렇게 해도 돌아가긴 잘 돌아가지. 

"해당 코드를 내가 의도한 대로 사용했다면" 저는 이게 가장 중요하고 또 중요하다고 생각이 들었습니다.

public boolean buyTicket(int money) {
    if (money < 10000) {
        return false;
    }
    // ... 예매 로직 ...
}

이런 코드가 있다고 생각해봅시다.

음, 내가 들고있는 금액을 받고, 금액이 만원보다 아래면 예매를 실패 시켜야겠다! 그러니까 false반환!

겉으로 보기에 너무나 잘 작성한 코드같습니다. 이 코드를 그대로 한달이란 시간이 지났습니다.

 

그리고 개발자 B가 새로운 서비스를 만들다가 티겟구매 메서드가 이미있네? 이거 가져다 써야지~ 하고 재사용을 합니다.

...
buyTicket(4000)
// 예매 성공~!!!
...

이런식으로 코드를 작성했고 이 개발자 B는 너무 게으른 개발자였기때문에 아~ 안에서 예외 처리 되어있겠지~ 하고 내부 로직을 확인하지 않습니다. 반환 타입조차도.

그리고 서비스가 배포되었습니다. 

그럼이제 커뮤니티에서 "야 돈없을때 예매해도 티켓나온다ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ ㄱㅇㄷ" 을 외치며 무한 티켓 복사에 되팔이에 난리가 납니다. 

여기서 우리는 1번에서 말한 사용자가 고객뿐만 아니라 내가 아닌 다른 직장 동료 또 다른 개발자가 될 수있다는것을 알아야 합니다.

public void buyTicket(int money) {
    if (money < 10000) {
        throw new RuntimeException("응~ 돈없어~ 나가~");
    }
    // ... 예매 로직 ...
}

이런식으로 코드를 수정한다면 개발자 B가 사용하던 C,D, 알파 오메가 델타 브라보 찰리 누가 사용해도 상관이 없습니다.

개발자가 수동적으로 하나하나 체크하는게 아닌 메서드 자체가 능동적으로 오류를 잡아내고 흐름을 제어할 수 있는것입니다.

 

그리고 이건 웃길짤이 보이길래 가져와봤습니다ㅋㅋㅋㅋㅋㅋㅋㅋ

우리 모두 이런 예외처리가 아닌 try/catch / Multi-catch 같은 기능을 사용해서 깔끔하게 코딩합시다...