250x250
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
- 코드트리조별과제
- fielderror
- DI
- 참조변수
- 싱글톤
- 서블릿
- 오버라이딩
- 티스토리챌린지
- HttpServletResponse
- 스프링
- html form
- 테스트코드
- java
- 김영한
- equals()
- objecterror
- 인터페이스
- 프록시
- 의존관계
- http 메시지 컨버터
- @configuration
- JSON
- 백준
- 다형성
- 추상클래스
- 오블완
- 스프링컨테이너
- ocp
- 코딩테스트
- 코드트리
Archives
- Today
- Total
minOS
API 예외 처리 - DefaultHandlerExceptionResolver 본문
TIL/김영한의 스프링 MVC 2편 - 백엔드 웹 개발 핵심 기술
API 예외 처리 - DefaultHandlerExceptionResolver
minOE 2024. 10. 9. 17:03728x90
API 예외 처리 - DefaultHandlerExceptionResolver
DefaultHandlerExceptionResolver` 는 스프링 내부에서 발생하는 스프링 예외를 해결한다. 대표적으로 파라미터 바인딩 시점에 타입이 맞지 않으면 내부에서 `TypeMismatchException` 이 발생하는데, 이 경우 예외가 발생했기 때문에 그냥 두면 서블릿 컨테이너까지 오류가 올라가고, 결과적으로 500 오류가 발생한다. 그런데 파라미터 바인딩은 대부분 클라이언트가 HTTP 요청 정보를 잘못 호출해서 발생하는 문제이다. HTTP 에서는이런 경우 HTTP 상태 코드 400을 사용하도록 되어 있다.
`DefaultHandlerExceptionResolver` 는 이것을 500 오류가 아니라 HTTP 상태 코드 400 오류로 변경한다.
public class DefaultHandlerExceptionResolver extends AbstractHandlerExceptionResolver { @Override protected ModelAndView doResolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { try { if (ex instanceof TypeMismatchException) { return handleTypeMismatch((TypeMismatchException) ex, request, response, handler); } // 다른 예외 처리 } catch (Exception handlerException) { logger.warn("Handling of [" + ex.getClass().getName() + "] resulted in Exception", handlerException); } return null; } protected ModelAndView handleTypeMismatch(TypeMismatchException ex, HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException { response.sendError(HttpServletResponse.SC_BAD_REQUEST); return new ModelAndView(); } }
DefaultHandlerExceptionResolver.handleTypeMismatch` 를 보면 다음과 같은 코드를 확인할 수 있다.response.sendError(HttpServletResponse.SC_BAD_REQUEST)` (400)결국 `response.sendError()` 를 통해서 문제를 해결한다.
sendError(400) 를 호출했기 때문에 WAS에서 다시 오류 페이지(`/error` )를 내부 요청한다.
ApiExceptionController - 추가
@GetMapping("/api/default-handler-ex") public String defaultException(@RequestParam Integer data){ return "ok"; }
`Integer data` 에 문자를 입력하면 내부에서 `TypeMismatchException` 이 발생한다.
- 정상요청
Integer data에 문자를 입력하면 내부에서 TypeMismatchException이 발생
.
실행 결과를 보면 HTTP 상태 코드가 400인 것을 확인할 수 있다.
728x90
'TIL > 김영한의 스프링 MVC 2편 - 백엔드 웹 개발 핵심 기술' 카테고리의 다른 글
API 예외 처리 - @ExceptionHandler,@ControllerAdvice (2) | 2024.10.10 |
---|---|
API 예외 처리 - ResponseStatusExceptionResolver (1) | 2024.10.09 |
API 예외 처리 - HandlerExceptionResolver 활용 (0) | 2024.10.07 |
API 예외 처리 - HandlerExceptionResolver 시작 (7) | 2024.10.07 |
API 예외처리 - 스프링 부트 기본 오류 처리 (1) | 2024.10.03 |