최종 프로젝트 기능 작업
cs 공부
기술면접 바로가기 // 작성 예정
이번에 새로운 프로젝트를 하게 되면서 지금까지 GlobalExceptionHandler
에 대한 방법과 개념을 착각한 채 사용하고 있었다는 것을 깨달았다.
1. GlobalExceptionHandler
가 주가 되어 독자적인 역할을 하는 줄 알았다. :개념
2. Controller
안에서 처리해야 GlobalExceptionHandler
에 잡히는 줄 알았다. :방법
이 두 가지 사고의 오류가 있었는데,
기존 코드에서는 이처럼 GlobalExceptionHandler
가 이미 존재하는데도 불구하고 try-catch
로 감싸 IllegalArgumentException
을 처리해주고 있었다.
GlobalExceptionHandler
이 Controller
에서 발생한 예외를 처리해준다는 것을 잘못 이해해 Controller
에서 무조건 처리해주어야 하는 줄 알았던 것.
저런 try-catch
를 메서드마다 달아줬으니 코드의 중복이 엄청나게 늘어난 셈이다.
비효율적이라고 생각했던 게 사실은 내가 잘못 사용하고 있던 거였다니...
새 프로젝트에서 똑같이
GlobalExceptionHandler
를 적용하고Controller
를 수정했다.
그렇다면 제대로 된 GlobalExceptionHandler
의 개념은 무엇일까?
전역에서 예외를 처리하기 위해 사용하는 것은 @ControllerAdvice
혹은 @RestControllerAdvice
이다.
이 애너테이션은 AOP(Aspect Oriented Programming) 방식이고, Application 전역에 발생하는 모든 컨트롤러의 예외를 한 곳에서 관리할 수 있게 해준다.
// ex) @RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(LineException.class) public ResponseEntity<ErrorResponse> handleLineException(final LineException error) { // ... } // ... }
컨트롤러에서 발생하는 모든 예외는 @RestControllerAdvice
가 잡고, @ExceptionHandler
가 개별적으로 예외를 잡아 처리한다.