@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' 카테고리의 다른 글
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 |