Spring API 예외 처리

나도잘몰라·2024년 5월 13일
0

spring

목록 보기
3/5

스프링 부트에서 API 예외처리

  • DefaultHandlerExceptionResolver : 스프링 내부 기본 예외 처리
  • ResponseStatusExceptionResolver : 상태코드가 적용된 예외 처리
  • ExceptionHandlerExceptionResolver : @ExceptionHandler 처리
    • 글로벌하게 처리하기 위해서 @ExceptionHandler + @ControllerAdvice || @RestControllerAdvice 사용

DefaultHandlerExceptionResolver

  • 표준 Spring MVC 예외를 해결하고 이를 해당 HTTP 상태 코드로 변환
  • 공통 스프링 디스패처 서블릿에서 기본적으로 활성화



ResponseStatusExceptionResolver

1. @ResponseStatus

@ResponseStatus(code = HttpStatus.BAD_REAQUEST, reason = "badError")
public class BadRequestException extends RuntimeException {

}

개발자가 직접 변경할 수 없는 예외에는 적용할 수 없거나(라이브러리의 예외 코드 같은 곳), 조건에 따라 동적으로 변경하기 어려울 때 ResponseStatusException 사용

2. ResponseStatusException

@GetMapping("/api/error-ex")
public String errorEx() {
	throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "ResponseStatusException Error", new IllegalArgumentException());
}



ExceptionHandlerExceptionResolver

기본으로 제공하는 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();
    }
}



@ControllerAdvice, @RestControllerAdvice

  • @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());
    }

}



참고

0개의 댓글