스프링에서 클라이언트의 요청을 서버가 처리할 때 발생하는 예외 처리의 방법은 크게 3가지가 있다. 이 방법들의 공통점은 스프링의 핵심 기술인 aop를 사용해 스프링이 로직을 수행할 때 발생하는 error를 대신 catch하고 개발자가 의도한 에러 메세지나 error status 정보로 응답해주기 때문에 개발자는 예외 처리를 비즈니스 로직 내에 작성하지 않아도 되는 관심사의 분리가 가능해진다.
특정 Controller나 RestController에서 발생하는 예외를 catch하는 아노테이션으로 아래의 사용 예시처럼 catch를 할 예외 클래스 지정이 가능하고 해당 아노테이션이 붙은 메소드에서는 예외 처리로 수행할 동작을 구현하면 된다.
@Controller
public class FooController{
@ExceptionHandler({ CustomException1.class, CustomException2.class })
public void handleException() {
//
}
}
특정 컨트롤러에만 적용되는 것이 아닌 빈으로 등록된 모든 컨트롤러에 대한 예외 처리 수행이 가능하게 하는 아노테이션으로 해당 클래스내 @ExcepitionHandler가 붙은 메소드로 예외 처리로 수행할 동작을 구현하면 된다.
@RestControllerAdvice
public class ProductControllerAdvice {
@ExceptionHandler({MyException1.class})
public String handleAllException(MyException1 exception) {
//JSON 포맷의 body에 해당 에러 메세지를 반환 할 수 있다.
return exception.getMessage();
}
//responseEntity 객체로 헤더나 status 정보와 같은 정보를 담은객체를 반환할 수 있다.
@ExceptionHandler({MyException2.class})
public ResponseEntity handleAllException(MyException2 exception) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST)
.body("Error");
}
}
간단한 예외 처리 기능으로 해당 아노테이션이 사용된 예외 클래스가 발생한 경우 개발자가 지정한 error status code 형태로 클라이언트에게 응답할 수 있다.
@ResponseStatus(code = HttpStatus.BAD_REQUEST)
class CustomException extends RuntimeException {
}