티스토리 뷰

 

고객사 마다 다른 오류를 주고 싶을 때도 있다. 사실 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 데이터를 만들어도 된다.

또한 사용할 수 있으니 위의 코드를 보고 응용해도 좋을 것 같다.

 

인프런 - 김영한의 스프링 MVC 2편 강의에서

반환 값에 따른 동작 방식

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
링크
«   2026/01   »
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
글 보관함