GlobalExceptionHandler

이동훈·2023년 6월 14일
0

SSAFY에서 진행되는 세 개의 프로젝트 동안,
GlobalExceptionHandler를 사용하여 에러 처리를 진행하였다.


폴더 구조


구조 맥락

  1. exception을 담당할 패키지를 만들고,

  2. 예외를 중앙화하여 관리할 Handler인 GlobalExceptionHandler를 작성한다.

우선 눈여겨 볼 것은, @RestControllerAdvice이다!
이는 @ControllerAdvice + @ResponseBody와 같다.

@ControllerAdvice와 마찬가지로 모든 @Controller에 대하여 전역적으로 발생할 수 있는 예외를 잡아서 처리할 수 있음에 더해, 응답으로 객체를 리턴(@ResponseBody)할 수 있다.

위의 사진처럼, 처리되는 예외는 크게 두 가지로 나눌 수 있다.

1) 기존에 Spring에 의해 정의된 예외
2) 기존에 Spring에 의해 정의되지 않은 예외 (Custom)

공통점이라면, Client에 반환 시 식별하기 용이하게끔 ErrorCode를 같이 보내주게끔 설계했다는 것이다.

차이점이라면,
Spring에서 이미 정의되어 있는 예외의 경우에는 해당 예외의 이름과 메세지를 가져와 즉시 반환하고,
Custom 예외의 경우에는 수동으로 작성한 에러 클래스를 타고(예시 사진의 MemberAlreadyExistException 클래스)CustomExceptionReturn으로 보내진다.


2. 사용자 작성 예외 클래스


모든 사용자 예외가 상속을 받을 박스를 만들고,


개개의 작성된 사용자 예외는 박스(CoffeebrewServerException)를 상속받아 에러코드를 주입한다.


  1. CustomExceptionReturn

커스텀 예외는 위와 같이 최종적으로 반환한다.


정리

각 클래스의 이름은 내가 진행하였던 프로젝트의 클래스 명일 뿐이니 참고할 때에 주의를 당부드린다.

CoffeebrewServerException: 커스텀 예외. 개발자가 이 예외를 발생시키면, 최종적으로 ErrorCode와 함께 커스텀된 HTTP 상태 코드와 에러 메시지를 제공한다.

CustomExceptionReturn: return받은 CoffeebrewServerException을 처리하고 ErrorResponseDTO를 반환하는 메서드를 제공한다. 이 메서드는 에러 로깅을 담당하며, ErrorResponseDTO를 생성한 다음 이를 ResponseEntity에 담아 반환한다. 이 과정을 통해 HTTP 상태 코드와 에러 메시지가 응답에 포함된다.

ErrorResponseDTO: ResponseDTO외에 Error용으로 별개로 작성한 response용 DTO. HTTP 상태 코드와 에러 메시지를 담아 반환하게끔 설계하였다.

GlobalExceptionHandler: 이 클래스는 @RestControllerAdvice 어노테이션을 사용하여 모든 컨트롤러에서 발생하는 예외를 중앙화 하여 처리한다. 각각의 @ExceptionHandler 메서드는 맞이한 예외를 처리하고, 매칭되는 ErrorResponseDTO를 생성하여 반환한다.

ErrorCode: enum 클래스. 커스텀 예외 및 에러 메시지와 관련된 여러 가지 정보를 미리 작성하여 모아두는 클래스이다.


결론

이 방식이 가지는 이점은, 예외 처리를 중앙화하여, 코드를 작성할 때에 예외 처리 구문으로 인해 중복 및 가독성이 떨어지는 것을 최소화하기 위한 것에 있다.
즉, 비즈니스 로직을 개발할 때에는 그에만 집중할 수 있도록, 최대한 분리하여 분리해 낸 것이다.

이렇게 함으로서 코드를 더 깔끔하게 유지하고, 에러 코드의 추가/삭제 등 유지보수를 쉬이 진행할 수 있는 장점이 생긴다.

profile
Fool Snack Developer

0개의 댓글