Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 스프링 핵심 원리
- 스프링
- kotlin
- 그리디
- Proxy
- transaction
- db
- Thymeleaf
- Android
- 자바
- jpa
- Exception
- AOP
- JPQL
- http
- 백준
- 스프링 핵심 기능
- 알고리즘
- 김영한
- Servlet
- JDBC
- Greedy
- SpringBoot
- pointcut
- QueryDSL
- Spring Boot
- spring
- java
- 인프런
- springdatajpa
Archives
- Today
- Total
개발자되기 프로젝트
[API예외] Spring제공 ExceptionResolver 본문
1. Spring에 제공하는 ExceptionResolver
- HandlerExceptionResolverComposite 에 다음 순서로 등록
- ExceptionHandlerExceptionResolver
- @ExceptionHandler 을 처
- API 예외 처리는 대부분 이 기능으로 해결
- ResponseStatusExceptionResolver
- HTTP 상태 코드를 지정해준다.
- 예) @ResponseStatus(value = HttpStatus.NOT_FOUND)
- DefaultHandlerExceptionResolver 우선 순위가 가장 낮다.
- 스프링 내부 기본 예외를 처리한다
- ExceptionHandlerExceptionResolver
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
'인프런 > [인프런] 스프링 MVC 2' 카테고리의 다른 글
[API예외] @ExceptionHandler (0) | 2021.10.01 |
---|---|
[API예외] Spring제공 ExceptionResolver2 (0) | 2021.10.01 |
[API예외] HandlerExceptionResolver 활용 (0) | 2021.09.28 |
[API예외] HandlerExceptionResolver (0) | 2021.09.28 |
[API예외] SpringBoot 기본 오류 처리 (0) | 2021.09.28 |
Comments