바로 전 글에서 @ExceptionHandler를 사용하여 예외처리를 깔끔하게 처리했다. 하지만 컨트롤러의 정상 처리와 예외 처리 코드가 하나의 컨트롤러에 섞여있다. 이를 @ControllerAdvice를 사용하여 둘을 분리할 수 있다.
ExControllerAdvice
ExControllerAdvice라는 클래스를 하나 만들어보자.
그 후, 기존 ApiExceptionV2Controller에서 예외처리를 하던 코드를 ExControllerAdvice에다가 옮기고 실행했다.
@Slf4j
@RestControllerAdvice
public class ExControllerAdvice {
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(IllegalArgumentException.class)
public ErrorResult illegalExHandler(IllegalArgumentException e) {
log.error("[exceptionHandler] ex", e);
return new ErrorResult("BAD", e.getMessage());
}
@ExceptionHandler(UserException.class)
public ResponseEntity<ErrorResult> userHandler(UserException e){
log.error("[exceptionHandler] ex", e);
ErrorResult errorResult = new ErrorResult("USER-EX", e.getMessage());
return new ResponseEntity(errorResult, HttpStatus.BAD_REQUEST);
}
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ExceptionHandler
public ErrorResult exHandler(Exception e) {
log.error("[exceptionHandler] ex", e);
return new ErrorResult("EX", "내부 오류");
}
}
기존에 있던 코드를 옮기고, @RestControllerAdvice 애노테이션을 붙여줬다. @RestControllerAdvice는 @ControllerAdvice와 @ResponseBody가 합쳐진 것이다.
@RestController가 @Controller와 @ResponseBody가 합쳐진 것과 같이 말이다.
지금과 같이 ControllerAdvice에서 대상을 지정하지 않으면 모든 컨트롤러에 적용된다.
대상을 지정하는 방법은 3가지가 있다.
1. 애노테이션 설정
첫번째는 애노테이션으로 대상을 지정하는 것이다.
@RestControllerAdvice(annotations = RestController.class)
이렇게 지정한다면, @RestController가 붙은 클래스들의 예외를 처리한다.
2. 패키지 경로 설정
@RestControllerAdvice(basePackages = "review.exception.api.controller")
이렇게 한다면, api 패키지 속 컨트롤러 패키지 안에 있는 컨트롤러 들에 한해서 예외를 처리한다. 패키지 지정의 경우 해당 패키지와 그 하위에 있는 컨트롤러가 대상이 된다.
3. 클래스명 기입
@RestControllerAdvice(assignableTypes = {
ApiExceptionController.class, ApiExceptionV2Controller.class
})
gg이렇게 한다면, ApiExceptionController와 ApiExceptionV2Controller 클래스에 대해 예외를 처리한다. 지금까지 예외처리에 있어서 학습했다. 실무에서는 @ExceptionHandler와 @ControllerAdvice를 활용하여 대부분의 예외처리를 해결한다.
코드링크
https://github.com/toychip/StudySpring/commit/641c6f273250fd53e73e41782b6768631c9f4df9
Feat: Spring-mvc2-exception @ControllerAdvice · toychip/StudySpring@641c6f2
toychip committed Sep 4, 2023
github.com
김영한님 mvc2 - Exception 강의로 학습하였습니다.
공부한 내용을 상기시키고 해당 내용을 몰랐을 때의 입장에서 쉽게 배울 수 있지 않을까 해서 작성한 글입니다. 잘못된 내용이 있을 경우 말씀해 주세요. 피드백 환영합니다.
'Spring > Spring Exception' 카테고리의 다른 글
Spring Exception 9. Spring이 제공하는 @ExceptionHandler (0) | 2023.08.21 |
---|---|
Spring Exception 8. Spring이 제공하는 @ResponseStatus, DefaultHandler (0) | 2023.08.19 |
Spring Exception 7. Api에서 ExceptionResolver 활용 (0) | 2023.08.18 |
Spring Exception 6. ExceptionResolver (HandlerExceptionResolver) (0) | 2023.08.17 |
Spring Exception 5. 스프링 부트 Api 오류처리 (BasicErrorController) (0) | 2023.08.16 |