코딩/Java, SpringBoot

[JAVA]예외는 언제 사용해야할까?

way to happiness 2022. 7. 28. 23:24

 

요즘 공모전을 나가면서 하루에 10시간은 개발하는 것 같다.. 방학이라 가능..

점점 프로젝트 규모가 커지면서 예외의 필요성을 느꼇다. 근데 어떤 글에서는 Exception, try-catch는 최적화도 안되고 고비용이다. 그냥 null을 반환하거나 정의된 상수값을 반환하라는 글을 본적이 있다..(예외를 남발하지 말라는 글이었음.) 근데 분명 우린 사용자 정의 예외를 만드는 방법, throw new RuntimeException~을 배웠는데 안쓰는 건 이상하다. 그래서 과연 어떤 상황에서 예외를 쓰면 좋은지 알아보고자 한다.

아래의 블로그 참조하자..꼭꼭 보자!!.. 내가 여러개 보고 엄선한거니까.. 읽을 가치가 있다.

 

https://tecoble.techcourse.co.kr/post/2020-08-17-custom-exception/

 

custom exception을 언제 써야 할까?

우아한테크코스의 두 크루인 오렌지와 우가 싸우고 있다. 왜 싸우고 있는지 알아보러 가볼까? 오렌지 : 아니 굳이 사용자 정의 예외 안 써도 됩니다!! 우 : 아닙니다!! 써야 합니다!!! 사용자 정의

tecoble.techcourse.co.kr

#

아래는 개인 프로젝트의 Service레이어의 코드이다. (앱 서버이다.)

JPA를 사용하면서 StoreEditDTO에서 null이 아닌 멤버만 가져와서 저장하는 함수이다. 기본적으로 findById()가 호출된다. 근데 만약 결과가 없다면??... 없다면 boolean을 return하는 것으로 충분한가? 아니면 null을 던질까? 아니면 예외를 던져야하나?? 처음에는 불린값으로 충분하다고 생각했는데 생각할 수록 예외를 던지는 것이 좋다고 생각들어 바꾸었다. 그렇게 생각한 이유는 다음과 같다.

1. saveOnlyNotNull()은 store엔티티의 null이 아닌 부분만 update하기 위한 함수이다. 즉 첫번째 insert가 아니라 update시점에 호출되는 함수임. 이때 findById를 찾지 못했다는 것은 클라이언트가 잘못된 PK(여기선 UUID가 PK이다.)를 보냈다는 것을 의미한다. (사실 서버 내의 문제가 아니라 클라이언트가 잘못된 uuid를 보내서 발생한 일이니까 예외를 던지면 안될 것 같기도 하다.)

2. 단순 boolean값으로 처리하기에는 생각보다 크게 잘못된 상황이다. 내가 보낸 UUID를 다시 보내는 것인데 조회가 안된다는 것은 서버든 클라이언트든 뭔가가 심각하게 잘못되었다는 것이기 때문.. 그리고 boolean을 반환해도 컨트롤러에서 다시 if문으로 boolean 값을 처리해야한다. 이럴 바에는 깔끔하게 예외를 던지는 것이 낫다고 생각했다.

1번 보다는 2번의 이유로 예외를 던져야 한다고 생각했다. 간단히 말해 생각보다 심각한 상황이라는 점이라고 생각했기 때문이다.

#
위의 코드를 아래와 같이 미리 정의된 예외를 던지고 에러를 잘 찾을 수 있게 수정했다. 리눅스 환경에서 한글이 안나올까봐 한글은 뺐다.