spring mvc 를 사용을 하다보면 에러 헨들러에 대한 고민을 하게 된다.
요즘 구글에 검색을 하거나 책을 통해서보면 @ContollerAdvice
를 통해서 에러 헨들러를 할 수 있다는 것을 알 수 있다.
DispatchSevlet 영역에서 발생된 에러들을 헨들링 할 수 있다.
model, view, controller 레이어에서 예외가 발생이 되면 @ControllerAdvice
에 헨들링 하게 되어있다.
특히 위의 레이어 외에도 인터셉터에서 발생이 되는 에러 또한 헨들링 하게된다. 그 이유는 인터셉터의 경우 DispatchSevlet 영역에서 동작을 하기 때문이다. 하지만 우리가 흔히 사용하는 spring security 영역에서의 필터는 DispatchSevlet의 밖의 영역에서 동작이 되기 때문에 필터 헨들링을 만들어서 에러를 헨들링한다.
위와 같이 @ControllerAdvice 의 어노테이션 내부를 살펴보면 @Component가 있기 때문에 SpringBootApplication 어노테이션 안에있는 내부의 Component-Scan에서 읽고 있기에 실행 되면서 ioc 컨테이너에 Bean으로 생성이 된다.
그렇다면 @ControllerAdvice의 선언된 클래스를 알아 보았다면 어떻게 사용하는지 알아 보자
@ContorllerAdvice 의 경우 클래스 레벨에서 설정을 한다.
그리고 추가적으로 @ExceptionHandler 의 경우 UncheckedException을 선언 해주면 된다.
그리고 @ResponseStatus
의 경우 그에 맞는 http status 를 내려주면 된다. ex) 500, 404, etc...
그리고 Response Body 를 내려주면 된다.
기존에 response.reset을 통해서 기존에 남아있는 response가 있는 케이스도 있기에 reset을 시켜준다. 그리고 개발자가 원하는 response format 을 내려주면 된다.
만약 어플리케이션에서 우리가 원하는 excpetion 을 처리를 해주고 싶다고 한다면 RuntimeException 을 상속 받으면 된다.
그리고 enum을 이용해서 type 을 명시를 시켜준다.
위와 같이 타입을 명시를 시켜주면 되는데 속성별로 예외를 나눌 수 도 있고 그게 아니라면 code 별로 나누어 줄 수 도 있다.
어플리케이션 성향에 따라서 사용을 해주면 된다.
위 처럼 커스텀 예외를 만들었다면 그 뒤 에러 헨들링에서 선언을 해주면 된다. 그렇다면 어플리케이션에서 DispatchSevlet 레이어에 있는 모든 AppException의 경우 헨들링 하게 된다.