[TIL] Springboot의 ExceptionHandler

phdljr·2023년 11월 4일
0

TIL

목록 보기
24/70

간단한 프로젝트를 진행하던 도중, 예외 처리를 적용하는 시간을 갖게 되었다.

이론적으로는 많이 들어봤지만, 실제로 코딩해보거나 적용시킨 적은 별로 없었던 것 같다.

커스텀 예외를 직접 생성해서 적용하는 부분에 대해 정리해보는 시간을 가져보려고 한다.


@RestControllerAdvice

  • 컨트롤러 계층에서 예외를 처리할 수 있도록 도와주는 어노테이션
  • 응답 페이로드에 담긴 데이터를 반환한다.
  • 뷰를 반환하고 싶다면, @ControllerAdvice를 사용하면 된다.

@ExceptionHandler

  • 등록된 예외 클래스를 처리하는 메소드를 지정해주는 역할
  • 하나의 어노테이션에 여러 개의 예외 클래스도 등록시킬 수 있다.
@ExceptionHandler(WrongPasswordException.class)
public ResponseEntity<ExceptionResponseDto> handleWrongPasswordException() {
   return ResponseEntity.badRequest().body(CustomException.WRONG_PASSWORD.toDto());
}

나는 이것을 이렇게 사용해보았다.

구조

  • 커스텀 예외 클래스와 내용을 전달시킬 DTO 클래스, Handler 클래스를 생성
  • 커스텀 예외 클래스들은 RuntimeException을 상속받으며, 내용은 비어있다.
  • 예외 클래스들을 enum으로 생성해서 관리한다.
  • 예외 내용을 전달해주기 위해 DTO 클래스를 활용한다.
  • @RestControllerAdvice를 선언한 클래스에서 ResponseEntity를 활용해 상태 코드를 설정한 뒤, 예외 내용에 대한 DTO를 반환한다.

테스트

존재하지 않는 게시글을 조회할 시

  • 상태 코드와 본문 내용이 잘 표현되는 것을 볼 수 있다.

비밀번호가 일치하지 않을 시

  • 상태 코드와 본문 내용이 잘 표현되는 것을 볼 수 있다.

후기

사실, 커스텀 예외 클래스를 생성하는 것이 과연 옳은 판단일까라는 생각이 들어서 @ExceptionHandler에 대해 생각해보는 시간을 잘 갖지 못했던 것 같다. 이미 존재하는 예외 클래스를 잘 활용하면 되지 않을까라는 생각이 존재했기 때문이다.

이번 프로젝트를 진행하면서, 이미 존재하는 예외 클래스만으론 상황에 따른 예외 처리를 제대로 해주지 못한다는 것을 깨달았다.

예를 들어, 게시글이 존재하지 않는 것과 비밀번호를 제대로 입력하지 않은 경우엔 둘 다 IllegalArgumentException으로 처리하면 될거라는 생각을 가졌었다. 하지만, 생각이 짧았다는 것을 다음과 같은 이유를 통해 깨달았다.

  • 만약 그렇게 한다면, 두 예외 처리에 대한 각각의 로직을 어떻게 분기시키는가?
  • 또한, 다른 예외 클래스를 사용한다한들, 그러한 예외들은 이미 다른 곳에서 잘 사용되고 있지 않는가?
  • 그러한 클래스를 내 마음대로 처리하는게 과연 옳은 방법인가?
  • 기본 예외 클래스는 한정적이다. 예외 상황이 기본 예외 클래스의 개수보다 많다면 어떡할 것인가?

그렇기에 커스텀 예외가 팔요한 것 같다.
이를 잘 활용하자.

profile
난 Java도 좋고, 다른 것들도 좋아

0개의 댓글