본문 바로가기
개발/Spring FW

@RestControllerAdvice

by Devsong26 2023. 11. 16.

@RestControllerAdvice는 스프링 프레임워크에서 제공하는 어노테이션(Annotation)으로 전역적인 예외 처리 및 특정 컨트롤러에 대한 공통의 처리 로직을 정의할 때 사용됩니다. `@RestControllerAdvice`는 `@ControllerAdvice`에 추가적으로 RESTful 서비스에 특화된 기능을 제공하는데, 이 어노테이션이 적용된 클래스는 예외 처리와 데이터 바인딩, 모델 속성 추가와 같은 여러 가지 역할을 수행할 수 있습니다.

주요 특징 및 사용법

  • 전역 예외 처리
    • @ExceptionHandler 어노테이션과 함께 사용하여 애플리케이션에서 발생하는 예외를 전역적으로 처리할 수 있습니다.
    • 이를 통해 컨트롤러 내부에서 개별적으로 예외 처리를 구현하는 것보다 효율적이고 일관된 예외 처리가 가능합니다.
  • RESTful 응답
    • @RestControllerAdvice는 REST 서비스에서 발생하는 예외에 대해 JSON이나 XML 형태의 응답을 반환합니다.
    • 이는 REST API의 일관된 응답 형식을 유지하는 데 유용합니다.
  • 응답 바디 커스터마이징
    • 예외 발생 시 클라이언트에 전달할 HTTP 응답의 바디를 커스터마이징할 수 있습니다.
    • 예외 유형에 따라 다른 에러 메시지나 상태 코드를 반환하는 것이 가능합니다.
  • 특정 컨트롤러 또는 패키지 범위 지정
    • @RestControllerAdvice에는 `basePackages` 또는 `basePackageClasses` 속성을 사용하여 특정 패키지 또는 컨트롤러 클래스에 대해서만 적용되도록 범위를 제한할 수 있습니다.
  • 데이터 바인딩 설정
    • @InitBinder 어노테이션을 사용하여 모든 컨트롤러에 공통적인 웹 요청 매개변수 바인딩 설정을 정의할 수 있습니다.
  • 모델 속성 추가
    • @ModelAttribute 어노테이션을 사용하여 모든 컨트롤러의 모델 객체에 속성을 자동으로 추가할 수 있습니다.

 

아래는 예시 코드입니다.

@RestControllerAdvice
@RequiredArgsConstructor
public class GlobalControllerAdvice {

    private final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    private final Logger log = LoggerFactory.getLogger(GlobalControllerAdvice.class);
    private final SlackNotiBot notiBot;

    @InitBinder
    public void initBinder(WebDataBinder binder) {
        binder.registerCustomEditor(LocalDate.class, new PropertyEditorSupport() {
            @Override
            public void setAsText(String text) throws IllegalArgumentException {
                try {
                    setValue(sdf.parse(text));
                } catch (ParseException e) {
                    setValue(null);
                }
            }
        });
    }

    @ExceptionHandler(value = Exception.class)
    public ResponseEntity<Object> handleException(
            final Exception cause, final ServerHttpRequest request){
        log.error(cause.getMessage());
        notiBot.notify(cause.getMessage());

        return new ResponseEntity<>(cause.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
    }

}

 

@InitBinder 어노테이션은 value 속성으로 특정 파라미터 명을 대상으로 바인딩 설정을 할 수 있습니다.

해당 어노테이션이 지정 시 매 요청마다 메서드가 호출되며 PropertyEditorSupport 객체는 yyyy-MM-dd 문자열의 파라미터를 대상으로 파싱을 수행하여 LocalDate 타입으로 변환합니다.

 

@ExceptionHandler의 value에 특정 예외 타입을 지정할 수 있습니다. Exception.class로 지정할 경우 Exception 클래스의 자식 클래스들이 발생하면 해당 메서드가 수행됩니다.

위의 final ServerHttpRequest request는 webflux를 사용하기 때문에 추가한 것 입니다. webflux가 아닌 기존 스프링 mvc를 사용시 HttpServletRequest 객체를 파라미터로 입력받아 사용하면 됩니다.

'개발 > Spring FW' 카테고리의 다른 글

Feign Client  (2) 2023.11.25
JPA N+1 문제  (0) 2023.11.17
[Spring F/W] Spring Batch  (0) 2023.10.23
WebFlux  (0) 2023.10.22
How do I set up the OS system variables in Spring Boot Application Properties?  (0) 2019.08.04