트러블 슈팅이라 쓰고 뻘짓이라 읽는다.
@ControllerAdvice 우선순위 설정하기
돌건
2022. 1. 9. 23:15
공백 기간 동안 어떤 플랫폼에서 블로그를 운영해야 하나 고민하였는데, 결국 다시 여기로 돌아오게 되었다. 2022년에도 많은 뻘짓을 하며 훌륭한 주니어 개발자, 시니어 개발자가 되어 보자.
오늘의 Trouble
여러개의 RestControllerAdvice를 사용하는 환경에서 우선순위를 설정해주지 않아 특정 예외를 Exception을 처리하는 공통 예외 처리용 RestControllerAdvice의 메서드가 처리하는 상황
해결 방법
공통 예외 처리 RestControllerAdvice를 제외한 RestControllerAdvice 클래스에 @Order 어노테이션을 추가해 해당 어노테이션이 적용된 컴포넌트의 정렬 순서를 설정.
@Order
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
@Documented
public @interface Order {
/**
* The order value.
* <p>Default is {@link Ordered#LOWEST_PRECEDENCE}.
* @see Ordered#getOrder()
*/
int value() default Ordered.LOWEST_PRECEDENCE;
}
@Order 어노테이션의 구현체를 보면, value 값을 가지고 default 값은 Ordered.LOWEST_PRECEDENCE이다. Ordered 인터페이스는 HIGHEST_PRECEDENCE와 LOWEST_PRECEDENCE 2개의 필드 값을 가지고 있다. value은 값이 낮을 수록 높은 우선 순위를 지니기 때문에 각각 Integer.MIN_VAULE, Integer.MAX_VALUE의 값으로 설정되어 있다.
@Order 어노테이션의 주석 내용에 의하면 Spring 4.1부터 @Priority (javax.annotation.Priority) 어노테이션을 대신 사용할 수 있다고 나와있다. 실제로 이 2개의 어노테이션을 모두 사용해본 결과, 내가 원하는 대로 잘 작동해주었다.