Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

[API예외] Spring제공 ExceptionResolver 본문

인프런/[인프런] 스프링 MVC 2

[API예외] Spring제공 ExceptionResolver

Seung__ 2021. 9. 29. 23:19

1. Spring에 제공하는 ExceptionResolver


  • HandlerExceptionResolverComposite 에 다음 순서로 등록
    • ExceptionHandlerExceptionResolver
      • @ExceptionHandler 을 처
      • API 예외 처리는 대부분 이 기능으로 해결
    • ResponseStatusExceptionResolver
      • HTTP 상태 코드를 지정해준다.
      • 예) @ResponseStatus(value = HttpStatus.NOT_FOUND)
    • DefaultHandlerExceptionResolver 우선 순위가 가장 낮다.
      • 스프링 내부 기본 예외를 처리한다

 

 

2. ResponseStatusExceptionResolver


  • ResponseStatusExceptionResolver 는 예외에 따라서 HTTP 상태 코드를 지정
  • 처리 대상
    • @ResponseStatus 가 달려있는 예외
    • ResponseStatusException 예외
  • BadRequestException을 만들다
    • @ResponseStatus로 Http 상태 코드를 지정.
    • reason에 message 입력 가능.
@ResponseStatus( code = HttpStatus.BAD_REQUEST, reason = "잘못된 요청 오류")
public class BadRequestException extends RuntimeException{
    
}
  • Controller
    @GetMapping("/api/response-status-ex1")
    public String responseStatusEx1(){
        throw new BadRequestException();
    }
  • 원래대로 Exception이 터지면 WAS는 500으로 처리한다.
  • 하지만  ResponseStatusExceptionResolver가 BadRequestException이 터진 경우
  • sendError()에 Http상태코드를 400으로 세팅.
  • ModelAndView를 반환하여 정상 응답으로 처리함.
  • sendError가 호출되었기 때문에 WAS에서 "/error" 오류페이지 호출.
  • BasicController에 의해 Accept 에 맞는 method실행.

  • ResponseStatusExceptionResolver 코드를 확인해보면 
  • 결국 response.sendError(statusCode, resolvedReason) 를 호출 함.
  • sendError(400) 를 호출했기 때문에 WAS에서 다시 오류 페이지( /error )를 내부 요청한다.
  • BasicController가 호출되고 Accept가 json이기 때문에 json형태로 dataa를 반환.
  • Exception이 발생했지만 WAS가 500으로 던지지 않음.

 

2.1 메시지 기능


  • reason 을 MessageSource 에서 찾는 기능도 제공한다. reason = "error.bad"라고 해보자.
@ResponseStatus( code = HttpStatus.BAD_REQUEST, reason = "error.bad")
public class BadRequestException extends RuntimeException{

}
  • messages.properties
    • error.bad=잘못된 요청 오류 입니다. 메시지 사용
  • 실행

  • 만약 reason에 넣은 값이 messagesources에 없으면 해당 data를 message로 사용.

 

 

2.2 ReasonStatusException


  • @ResponseStatus 는 개발자가 직접 변경할 수 없는 예외에는 적용할 수 없다. 
  • 애노테이션을 직접 넣어줘야 함..
  • 내가 만든 Exception만 가능?
  • 추가로 애노테이션을 사용하기 때문에 조건에 따라 동적으로 변경하는 것도 어려움.
  • 이때는 ResponseStatusException 예외를 사용!!
  • ResponseStatusException에 HttpStatus, Reason, Exception을 넣어주면 
  • ResponseStatusExceptionResolver가 처리해줌. @ResponseStatus 처럼 동작.
  • sendError(httpStatus)를 세팅하고, 정상적으로 ModelAndView 반환함.
  • sendError가 호출되었기 때문에 WAS에서 "/error" 오류페이지 호출.
  • BasicController에 의해 Accept 에 맞는 method실행.
  • Exception이 발생했지만 WAS가 500으로 던지지 않음.
    @GetMapping("/api/response-status-ex2")
    public String responseStatusEx2(){
        throw new ResponseStatusException(HttpStatus.NOT_FOUND, "error.bad", new IllegalArgumentException());
    }

 

 

 

3.  GitHub : 210929 ResponseStatusExceptionResolver


 

GitHub - bsh6463/Exception

Contribute to bsh6463/Exception development by creating an account on GitHub.

github.com

 

Comments