물론,BasicErrorController
를 확장하여 JSON 형식으로 응답할 수 있지만, 스프링은 API에서 오류가 발생했을 때 제공하는 기능들이 있어 이에 대해 알아보자 !
ExceptionResolver
는 다음과 같다.ExceptionHandlerExceptionResolver
→ 우선순위이 가장 높음
ResponseStatusExceptionResolver
DefaultHandlerExceptionResolver
우선순위가 높은
ExceptionHandlerExceptionResolver
를 일반적으로 사용하여 이번 포스트에서는 해당 예외처리 기능과@ControllerAdvice
를 알아보자 !
같은 예외 상황이라도 컨트롤러에 따라 다른 예외 응답을 내려줘야 할 수 있기에 보다 자세한 API 예외처리를 @ExceptionHandler
을 통해 가능하다.
@ExceptionHandler(부모예외.class)
public String 부모예외처리() (부모예외 e) {
... 생략 ...
}
@ExceptionHandler(자식예외.class)
public String 자식예외처리() (자식예외 e) {
... 생략 ...
}
@ExceptionHandler
에 지정한 부모 클래스는 자식 클래스까지 예외처리 가능 O
자식예외
가 우선순위가 더 높다.
@ExceptionHandler
예외를 지정하지 않을 경우, 메서드 파라미터의 예외가 지정.
: 대상으로 지정한 컨트롤러에 @ExceptionHandler
,@InitBinder
기능 부여 !
위 @ExceptionHandler
애노테이션을 사용하였을 때는, 오류코드와 정상 코드가 한 컨트롤러에 섞여있는 모습을 볼 수 있다. 그럴 경우, @ControllerAdvice
, @RestControllerAdvice
을 사용해보자 !
@ControllerAdvice(annotations = RestController.class)
public class testControllerAdvice1 {} // 특정 애노테이션 클래스 지정
@ControllerAdvice("org.example.testControllers")
public class testControllerAdvice3 {} // 특정 패키지 지정
@ControllerAdvice(assignableTypes = {Interface.class, Abstract.class})
public class testControllerAdvice3 {} // 특정 클래스 지정 가능
> 대상 컨트롤러 지정을 생략하면 모든 컨트롤러 적용
앞서, @ExceptionHandler
와 @ControllerAdvice
알아보았다. 해당 기능을 학습하고 정리한 생각은 다음과 같다.
@ExceptionHandler
: 메서드 단위로 예외에 따른 각기 다른 응답을 제공하고자 할 경우@ControllerAdvice
: Controller 단위로 공통으로 예외를 처리할 경우정리하자면 로직을 구현하면서 예외처리를 해야할 때 위 애노테이션을 적절히 조합하여 코드의 중복을 막고, 보다 클린한 코드로 구현하는 것이 중요하다고 생각한다 !
@RestControllerAdvice
는@ResponsoBody
기능이 추가
📌 본 포스트는 스프링 MVC 2편 - 백엔드 웹 개발 핵심 기술 통해 학습한 내용을 요약 및 정리한 것입니다.
화이팅입니다