요즘 이것 저것 하느냐고 손이 부족해서 오랜만에 포스팅을 쓰네요 !! 분발하자 !!!! (살려주세요...)
@ControllerAdvice와 @RestControllerAdvice 우선 순위에 대해 알아보다 Advice에 대해 같이 정리하면 좋을 것 같아 같이 정리해보려고 합니다🫠
❓@ControllerAdvice란 ?
@ControllerAdvice는 Spring 3.2에서 도입된 어노테이션이고, 모든 @Cotroller 클래스가 공유하는 공통 로직을 정의할 때 사용합니다.
주로 예외 처리와 바인딩 설정, 모델 객체 등에 사용됩니다. 아래 예제 코드를 통해 간단히 알아보겠습니다 !
예제코드
NotFoundException이 발생할 경우 error라는 이름의 뷰로 이동하고 메세지를 출력합니다.
반환되는 타입을 보면 ModelAndView로 반환되고 있는 것을 확인하실 수 있습니다.
즉, @ControllerAdvice는 ModelAndView 객체를 통해 HTML 뷰를 렌더링할 수 있습니다 !
@ControllerAdvice
public class GlobalControllerExceptionHandler {
@ExceptionHandler(NotFoundException.class)
public ModelAndView handleNotFoundException(NotFoundException ex) {
ModelAndView mav = new ModelAndView("error");
mav.addObject("message", ex.getMessage());
return mav;
}
}
❓@RestControllerAdvice란 ?
@RestControllerAdvice는 @ControllerAdvice와 매우 흡사하지만 해당 어노테이션을 사용하면 @RequestBody가 암시적으로 추가된다는 차이점이 있습니다. 따라서 JSON 형태로 바로 응답을 보낼 수 있습니다 ! 예제 코드를 간단하게 보고 넘어가겠습니다.
예제코드
위 예제와 동일하게 NotFoundException이 발생했을 때 Http 상태코드와 Body에 에러 메세지를 담아 응답하도록 되어있습니다 !
여기서의 반환값은 ReseponseEntity로 반환하고 있습니다.
@RestControllerAdvice
public class GlobalRestControllerAdvice {
@ExceptionHandler(NotFoundException.class)
public ResponseEntity<?> handleNotFoundException(NotFoundException ex) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ex.getMessage());
}
}
🔄작동원리
Spring의 @ControllerAdvice와 @RestControllerAdvice는 AOP의 원리를 기반으로 동작합니다. 즉, 이러한 어노테이션은 공통 관심사인 예외 처리 로직을 분리하여 관리합니다. 이를 통해 코드의 중복을 줄이고 유지보수성을 향상시킵니다. 또한 스프링 부트는 내부적으로 클래스패스를 스캔하여 이러한 어노테이션을 가진 클래스를 자동으로 등록하고 적용합니다.
@ControllerAdvice와 @RestControllerAdvice의 차이점
위에서 언급한 것과 같이 @ControllerAdvice의 경우 ModelAndView 객체를 반환하여 HTML 뷰를 렌더링 할 수 있는데 그렇다면 당연히 @ControllerAdvice는 주로 전통적인 Spring MVC와 함께 사용됩니다.
@ResetControllerAdvice의 경우 ResponseEntity나 POJO 객체를 반환하여 JSON 형태로 응답할 수 있고, 주로 RESTful 웹 서비스에서 주로 사용됩니다.
물론 @ControllerAdvice 어노테이션도 @ResponseBody를 명시적으로 추가해 JSON으로 반환할 수 있다는 점 참고해주세요 !
💭응용하기
특정 패키지 또는 클래스에 적용하기
@ControllerAdvice나 @RestControllerAdvice를 사용할 때 basePackages 속성을 사용해서 아래와 같이 특정 패키지나 클래스에만 적용할 수 있습니다.
@ControllerAdvice(basePackages = "com.example.controller")
public class GlobalControllerExceptionHandler {
// ...
}
우선 순위 설정하기
@Order 어노테이션을 사용해서 여러 개의 @CotrollerAdvice나 @RestControllerAdvice 클래스 중 어떤 것이 먼저 실행될지 설정할 수 있습니다.
@Order(1)
@ControllerAdvice
public class GlobalControllerExceptionHandler {
// ...
}
예외 분류 및 커스터 마이징
여러 종류의 예외를 처리하기 위해 @ExceptionHandler에 예외 타입을 배열로 지정할 수 있습니다.
@ControllerAdvice
public class GlobalControllerExceptionHandler {
@ExceptionHandler({NotFoundException.class, AnotherException.class})
public ModelAndView handleMultipleExceptions(Exception ex) {
ModelAndView mav = new ModelAndView("error");
mav.addObject("message", ex.getMessage());
return mav;
}
}
정리
모든 Controller 클래스가 공통 로직을 정의할 때 @ControllerAdvice와 @RestControllerAdvice을 사용할 수 있고, @ControllerAdvice는 ModelAndView를 @RestController는 ResponseEntity로 데이터를 반환합니다.
예외 처리 로직에서 대부분 사용되며, log를 기록할 때 @ControllerAdvice나 @RestControllerAdvice를 통해 공통 로직을 만들어 효율적으로 사용할 수 있습니다 !!
'프로그래밍 > Java' 카테고리의 다른 글
[Spring, Swagger] Swagger 적용하기 및 기본 경로 변경하기 (2) | 2024.09.21 |
---|---|
[Java, 자바] Mybatis Map foreach로 반복하기 (0) | 2024.09.10 |
[Java, 자바] 예외 처리란 ? (0) | 2024.07.31 |
[Java, 자바] 중첩 클래스와 내부 클래란 ? (1) | 2024.07.29 |
[Java, Spring] Logging, @Slf4j란 ? (0) | 2024.07.29 |
개발의 모든 것 !
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!