(스프링) @ControllerAdvice를 이용한 공통 익셉션 처리

컨트롤러 클래스에 @ExceptionHandler 애노테이션을 적용하면 해당 컨트롤러에서 발생한 익셉션만을 처리한다. 그런데 다수 컨트롤러에서 동일 타입의 익셉션을 발생시킬 수 있고,
이 때 익셉션 처리 코드가 동일하다면 어떻게 해야 할까? 각 컨트롤러 클래스마다 익셉션 처리 메소드를 구현하는 것은 불필요한 코드 중복을 발생시킨다.

이럴경우, @ControllerAdvice애노테이션을 이용해서 익셉션 처리 메소드 중복을 없앨 수 있다.




@ControllerAdvice애노테이션이 적용된 클래스는 지정한 범위의 컨트롤러에서 공통으로 사용될 설정을 지정할 수 있다. 위 코드의 경우 "chap13.spring"패키지 및 그 하위 패키지에 속한 컨트롤러 클래스를 위한 공통기능을 정의하였다.
이 패키지 및 하위 패키지에 속한 컨트롤러에서 RuntimeException이 발생하면
handleRuntimeException()메소드를 통해서 익셉션을 처리한다.


@ControllerAdvice 적용 클래스가 동작하려면 해당 클래스를 스프링에 빈으로 등록해주엉 한다.
<bean class="chap13.common.CommonExceptionHandler"/>


@ControllerAdvice클래스에 있는 @ExceptionHandler메소드와 컨트롤러 클래스에 있는 @ExceptionHandler 메소드 중 우선순위를 갖는 것은 컨트롤러 클래스에 적용된 @ExceptionHandler클래스이다. 즉, 컨트롤러의 메소드를 실행하는 과정에서 익셉션이 발생하면 다음의 순서로 익셉션을 처리할 @ExceptionHandler메소드를 찾는다.

1. 같은 컨트롤러에 위치한 @ExceptionHandler 메소드 중 해당 익셉션을 처리할 수 있는 메소드를 검색
2. 같은 클래스에 위치한 메소드가 익셉션을 처리할 수 없을 경우, @ControllerAdvice클래스에 위치한 @ExceptionHandler메소드를 검색

댓글

이 블로그의 인기 게시물

(ElasticSearch) 결과에서 순서 정렬

(네트워크)폴링방식 vs 롱 폴링방식

(18장) WebSocekt과 STOMP를 사용하여 메시징하기