- Spring MVC 마스터하기 예외처리 62022년 06월 18일
- starryeye
- 작성자
- 2022.06.18.:40
이전 포스팅에서 확인했을 때,
예외가 발생했을 때, BasicErrorController 에서 제공해주는 Json 응답 기능은 편리하다.
하지만..
아래는 현재까지 문제점이다.
1. 일반 예외의 경우 Http status 조절을 못한다.
(sendError의 경우 조절 가능)
2. 개발자가 정한 사양대로의 응답 데이터로 못 내려준다.
(BasicErrorController가 기본으로 제공하는 응답 json 데이터가 내려감)
(물론 1, 2번 모두 BasicErrorController를 확장하면 가능하다..)
HandlerExceptionResolver를 이용하여 위 문제를 해결해보자
일반 예외가 발생하였을 땐.. 기본적으로 WAS에서는 500 Status 값으로 처리된다.
이를 400으로 바꿔 보겠다..
인터셉터 1 포스팅에서 확인한 인터셉터 구조를 다시 알아보자.
위는 인터셉터가 동작하는 순서이다.
DispatcherServlet이 핸들러 어댑터를 호출하기 전 preHandle이 먼저 호출된다.(인터셉터)
인터셉터 1 포스팅에서도 잠시 알아봤지만..
postHandle 메서드는 컨트롤러에서 예외가 발생되면 호출되지 않는 메서드이다.
따라서..
예외를 처리해주는 다른 무언가가 필요한 시점이다.
-> HandlerExceptionResolver를 등록해놓으면 이를 해결해줌..
위는 HandlerExceptionResolver 인터페이스이다.
컨트롤러에서 일반적인 예외가 발생하면 예외를 해결해주고, 동작을 새로 정의할 수 있다.
(postHandle이 호출 되지 않지만, HandlerExceptionResolver가 호출된다고 생각하면 편하다.)
handler : 호출된 컨트롤러 정보가 담겨있다.
ex : 컨트롤러에서 발생한 예외가 담겨있다.
구현
위와 같이 개발해볼 수 있다.
HandlerExceptionResolver를 구현하였다.
컨트롤러에서 발생된 예외가 IllegalArgumentException 류일 경우에 처리하도록 해보자.
sendError를 통하여 500 status를 새로운 400 status 로 바꾸었으며, 예외의 메세지를 그대로 넣어주었다.
(일반적인 예외를 개발자가 정의한 예외로 바꾸었다.. )
return new ModelAndView()
-> 코드에서 볼 수 있듯이 빈값으로 리턴된다.
-> sendError는 예외가 발생되어 리턴되는게 아니라 정상 리턴이다.
-> resolveException메서드의 리턴 타입이 ModelAndView이므로 구색 맞추기 용이다.
-> null이 아니므로 예외가 처리 되었다는 것을 뜻함.
-> 결국 WAS까지 리턴되는데.. sendError를 넣어줬으므로 WAS는 그에 따른 처리를 해줄 것이다.
-> 현재 개발된걸로는 BasicErrorController가 호출 될 것이다..
return null
-> IllegalArgumentException류 예외가 아닌 다른 일반적인 예외는 WAS까지 예외가 던져진다.
-> 다음 HandlerExceptionResolver가 실행된다.
<return 정리>
ModelAndView가 비어있도록 리턴하면 뷰를 렌더링하지 않으며 정상 흐름을 탄다.
ModelAndView에 View, Model 등의 정보를 넣어준다면.. 뷰가 렌더링 되어버린다.
null로 리턴하면 다음 HandlerExceptionResolver가 호출되며 다른 ExceptionResolver가 호출되었음에도
예외가 처리 안되면 WAS까지 예외가 던져진다.
<활용적인 측면>
1. 개발자가 상태코드를 변경해줄 수 있다.
(sendError 활용하여 BasicErrorController 호출되도록 or response에 직접 셋팅하여 바로 내리도록)
2. 뷰템플릿 처리 (ModelAndView 에 값을 채움, 이것도 바로 내리는 방법)
3. API 응답 (예외처리 7 포스팅에서 다룰 예정, response에 직접 셋팅하여 바로 내리도록)
등록
WebMvcConfigurer을 구현한 Configuration 클래스에서
위와 같이, extendHandlerExceptionResolvers 메서드를 구현하여 등록해주면 된다.
'Spring > MVC' 카테고리의 다른 글
Spring MVC 마스터하기 예외처리 8 (0) 2022.06.19 Spring MVC 마스터하기 예외처리 7 (0) 2022.06.18 Spring MVC 마스터하기 예외처리 5 (0) 2022.06.11 Spring MVC 마스터하기 예외처리 4 (0) 2022.06.11 Spring MVC 마스터하기 예외처리 3 (0) 2022.06.11 다음글이전글이전 글이 없습니다.댓글