스프링은 API예외처리를 하기위해 @ExceptionHandler 어노테이션을 제공해준다.
ExceptionResolver 3개중 가장 우선순위가 높다.
애노테이션을 선언하고, 해당 컨트롤러에서 처리하고 싶은 예외를 지정해주면 된다.
해당 컨트롤러에서 예외가 발생하면 이 어노테이션이 달린 메서드가 실행된다.
참고로 지정한 예외 또는 그 예외의 자식클래스는 모두 잡을 수 있다.
이것도 마찬가지로 자식클래스가 더 우선순위가 높다.
여러 컨트롤러에 같은 에러를 하나의 클래스로 한번에 관리하기 위해 사용한다.
대상을 지정하지 않으면 모든 컨트롤러에 적용이된다.
@Slf4j
@RestControllerAdvice
public class ExControllerAdvice {
@ExceptionHandler(IllegalArgumentException.class)
public ResponseEntity<String> userExHandle(IllegalArgumentException e) {
log.error("[exceptionHandle] ex", e);
return new ResponseEntity<>("사용자 입력오류", HttpStatus.BAD_REQUEST);
}
@ExceptionHandler
public ResponseEntity<String> exHandle(Exception e) {
log.error("[exceptionHandle] ex", e);
return new ResponseEntity<>("서버 오류", HttpStatus.INTERNAL_SERVER_ERROR);
}
}
아이디나 이메일을 사용하여 회원을 DB에서 조회할때 해당 값이 일치하지 않으면 IllegalArgument 예외를 발생시키고 있었다. 그래서 컨트롤러를 지정하지 않고 모든 컨트롤러에서 입력이 잘못받아져 왔을떄는 400 코드를 보내주었다. 그 이외의 모든 예외를 잡기위에 가장 상위의 Exception도 잡아주었다.