스프링 부트에서 API 예외처리
- DefaultHandlerExceptionResolver : 스프링 내부 기본 예외 처리
- ResponseStatusExceptionResolver : 상태코드가 적용된 예외 처리
- ExceptionHandlerExceptionResolver :
@ExceptionHandler
처리
- 글로벌하게 처리하기 위해서
@ExceptionHandler
+@ControllerAdvice
||@RestControllerAdvice
사용
@ResponseStatus(code = HttpStatus.BAD_REAQUEST, reason = "badError")
public class BadRequestException extends RuntimeException {
}
개발자가 직접 변경할 수 없는 예외에는 적용할 수 없거나(라이브러리의 예외 코드 같은 곳), 조건에 따라 동적으로 변경하기 어려울 때 ResponseStatusException 사용
@GetMapping("/api/error-ex")
public String errorEx() {
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "ResponseStatusException Error", new IllegalArgumentException());
}
기본으로 제공하는 ExceptionResolver 중에 우선순위도 가장 높으며, 실무에서 API 예외 처리에서 가장 많이 사용
@RestController
public class ApiExcetpionController {
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler
public ErrorResult errorHandler1(Exception e) {
return new ErrorResult("code", "message"); // 예외가 발생했을 때 API 응답 객체
}
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(IllegalArgumentException.class)
public ErrorResult errorHandler2(IllegalArgumentException e) {
return new ErrorResult("code", e.getMessage());
}
@GetMapping("/api/error")
public ResponseEntity<> ex() {
if ()
throw new RuntimeException("");
if ()
throw new IllegalArgumentException("");
return new ResponseEntity.status(HttpStatus.CREATED).build();
}
}
@RestControllerAdvice
= @ControllerAdvice
+ @ResponseBody
@ExceptionHandler
, @InitBinder
기능을 부여해주는 역할
@RestControllerAdvice(annotations = RestConroller.class)
: 특정 어노테이션이 있는 컨트롤러 대상@RestControllerAdvice(assignableTypes = {ControllerInterface.class, AbstractController.class})
: 특정 클래스에 할당할 수 있는 모든 컨트롤러 대상@RestControllerAdvice(basePackages = "")
: 특정 패키지 내의 모든 컨트롤러 대상@RestControllerAdvice
: 대상을 지정하지 않으면 모든 컨트롤러에 적용 (글로벌 적용)
@RestControllerAdvice
public class CustomExceptionHandler {
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler
public ErrorResult errorHandler1(Exception e) {
return new ErrorResult("code", "message");
}
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(IllegalArgumentException.class)
public ErrorResult errorHandler2(IllegalArgumentException e) {
return new ErrorResult("code", e.getMessage());
}
}
참고