티스토리 뷰
고객사 마다 다른 오류를 주고 싶을 때도 있다. 사실 api의 경우 오류가 터지면 이게 400이든 500이든 무조건 500으로 발생시켜 오류를 반환해준다.
오류 상태를 바꾸고 싶다면 HandlerExceptionResolver를 이용해준다.
package hello.exception.resolver;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import java.io.IOException;
@Slf4j
public class MyHandlerExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
try {
if(ex instanceof IllegalArgumentException){
log.info("IllegalArgumentException resolver to 400");
response.sendError(HttpServletResponse.SC_BAD_REQUEST,ex.getMessage()); // 오류바꾸기
//response.getWriter().println("{status : fail}"); // 메세지를 그대로 던진다, 직접 json 데이터를 만들어도 된다.
return new ModelAndView(); //새로운 모델앤뷰(빈값)으로 넘기면 정상적으로 에외가 리턴이 된다.
}
} catch (IOException e) {
log.error("resolver ex",e);
}
return null;
}
}
api 요청을 할 경우 원래 was는 500을 던지게 된다.위의 코드 처럼 ex가 IllegalArgumentException(인자를 잘못입력) 오류가 나온다면, 400으로 바꿔준 후 빈값의 ModelAndView를 리턴해준다. ModelAndView를 빈값으로 넣어줘야 view까지 제대로 인식하여 값을 넘겨준다는데 이 부분은 아직 이해가 안된다. 저 ModelAndView를 채워서 보내준다면 오류값으로 view를 디자인 하여 보내 줄 수도 있다고 한다.

이렇게 status를 400으로 받게 되었다.
아 그전에 작동을 안한다면 Webconfig에 등록을 안해서 그런 것이다.
@Override
public void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
resolvers.add(new MyHandlerExceptionResolver());
}
추가로
//response.getWriter().println("{status : fail}"); // 메세지를 그대로 던진다, 직접 json 데이터를 만들어도 된다.
또한 사용할 수 있으니 위의 코드를 보고 응용해도 좋을 것 같다.

반환 값에 따른 동작 방식
HandlerExceptionResolver 의 반환 값에 따른 DispatcherServlet 의 동작 방식은 다음과 같다.
- 빈 ModelAndView: new ModelAndView() 처럼 빈 ModelAndView 를 반환하면 뷰를 렌더링 하지 않고, 정상 흐름으로 서블릿이 리턴된다.
- ModelAndView 지정: ModelAndView 에 View , Model 등의 정보를 지정해서 반환하면 뷰를 렌더링 한다.
- null: null 을 반환하면, 다음 ExceptionResolver 를 찾아서 실행한다. 만약 처리할 수 있는 ExceptionResolver 가 없으면 예외 처리가 안되고, 기존에 발생한 예외를 서블릿 밖으로 던진다.
ExceptionResolver 활용 예외 상태 코드 변환
예외를 response.sendError(xxx) 호출로 변경해서 서블릿에서 상태 코드에 따른 오류를 처리하도록 위임 이후WAS는서블릿오류페이지를찾아서내부호출,예를들어서스프링부트가기본으로설정한 / error 가 호출됨
뷰 템플릿 처리
- ModelAndView 에 값을 채워서 예외에 따른 새로운 오류 화면 뷰 렌더링 해서 고객에게 제공
API 응답 처리
- response.getWriter().println("hello"); 처럼 HTTP 응답 바디에 직접 데이터를 넣어주는
것도 가능하다. 여기에 JSON 으로 응답하면 API 응답 처리를 할 수 있다.
- Total
- Today
- Yesterday
- react실행
- 스프링공부
- 향해99
- 리터럴
- ArgumentResolver
- 인터셉터
- 예외처리
- rejectValue
- 향해플러스백엔드
- 로그인
- 컨트
- BindingResult
- JPA
- thymleaf
- 스프링부트
- 항해99
- SpringBoot
- HTTP
- 백엔드 개발자 공부
- jpa api
- Java
- 항해플러스
- React
- exception
- Intercepter
- 백엔드 개발자 역량
- filter
- 향해플러스
- hypertexttransferprotocol
- reject
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
