- Spring MVC 마스터하기 예외처리 92022년 06월 19일
- starryeye
- 작성자
- 2022.06.19.:01
스프링 부트가 기본으로 제공하는(등록하는) ExceptionResolver에 대해 계속 알아보자..
1. ExceptionHandlerExceptionResolver : @ExceptionHandler 처리
2. ResponseStatusExceptionResolver : Http 상태코드 지정할 수 있는 @ResponseStatus 처리
3. DefaultHandlerExceptionResolver : 스프링 내부 기본 예외 처리
위 순서대로 우선순위가 있다.
(1번 return null이면 다음 ExceptionResolver인 2번이 호출되는 식)
이번엔..
DefaultHandlerExceptionResolver에 대해 알아보자.
스프링 내부에서 발생되는 예외를 해결해준다.
BindingResult를 생각해보자.. (Validation 10번 포스팅 참고)
BindingResult는 Http Form POST 방식, Http 쿼리파라미터 GET 방식에서 유용하다..
(@ModelAttribute 사용)
@RequestBody를 사용할 경우에는 HttpMessageConverter가 동작되며
전체 객체 단위로 바인딩 되기 때문에 타입에러가 생길 경우 Validator가 적용되지 않고 바로 예외 리턴 처리가 된다.
(타입에러 : TypeMismatchException)
이를 위한 처리 방법이 DefaultHandlerExceptionResolver 이다.
-> 타입 에러의 경우 ...
-> 컨트롤러 호출전에 예외가 발생되어버리기 때문에 ResponseStatusExceptionResolver를 사용하지 못하며..
-> 이를 위한 예외처리가 필요함..
-> 마찬가지로 서버내부 예외이므로 500을 보내는걸로 처리되지만 사실 클라이언트가 잘못 보낸거기 때문에
-> 400으로 바꾸고 싶은 상황임.
DefaultHandlerExceptionResolver의 코드를 보며 내부 동작에 대해 알아보자.
ResponseStatusExceptionResolver 때와 마찬가지로
HandlerExceptionResolver를 구현하였으며, resolveException 메서드가 호출되면 doResolveException이 호출된다.
발생된 예외가 스프링 내부 예외 중, 타입 에러로 인한 예외가 리턴되면..
ExceptionResolver들이 호출되는데..
DefaultHandlerExceptionResolver가 호출되며..
TypeMisMatcheException 예외 이므로..
handleTypeMismatch 메서드가 호출된다.
위는 handleTypeMismatch 메서드이다.
WAS(서블릿 컨테이너)가 알아볼 수 있도록 sendError를 통해 400 에러를 넣어주며
빈 ModelAndView를 생성하여 리턴한다.(null 리턴이 아니므로 예외가 처리 되었다는 것을 뜻한다.)
(예외가 WAS까지 갔으면 500으로 처리 될 상황이였지만.. sendError 400으로 넣어주고.. 정상 리턴 시킨다.)
결국 컨트롤러에서 만들어진 예외가 DefaultHandlerExceptionResolver를 통해 예외가 먹히고
response.sendError로 처리 되는 것을 알 수 있다.
주의 : sendError로 처리 하였기 때문에 WAS에서 다시 BasicErrorController가 호출될 것이다...
(BasicErrorController에서 accept에 따라 분기 되어 처리 됨)
'Spring > MVC' 카테고리의 다른 글
Spring MVC 마스터하기 예외처리 10 (0) 2022.06.19 Spring MVC 마스터하기 예외처리 8 (0) 2022.06.19 Spring MVC 마스터하기 예외처리 7 (0) 2022.06.18 Spring MVC 마스터하기 예외처리 6 (0) 2022.06.18 Spring MVC 마스터하기 예외처리 5 (0) 2022.06.11 다음글이전글이전 글이 없습니다.댓글