BackEnd/스프링 MVC

HandlerExceptionResolver

연향동큰손 2025. 1. 7. 16:57

HandlerExceptionResolver을 통해 발생하는 예외에 따라서 400,404등등 다른 상태 코드로 처리하는 방법에 대해서 공부했다.

 

@GetMapping("/api/members/{id}")
public MemberDto getMember(@PathVariable("id") String id) throws IllegalAccessException {
    if(id.equals("ex")){
        throw new RuntimeException("잘못된 사용자");
    }

    if(id.equals("bad")){
        throw new IllegalArgumentException("잘못된 입력 값");
    }
    return new MemberDto(id,"hello"+id);
}

 

이 경우 http://localhost:8080/api/members/bad 로 호출하면 500에러가 뜨는게 정상이다.

 

하지만 여기서 HandlerExceptionResolver 를 적용하여 http://localhost:8080/api/members/bad를 400에러로 변경 가능하다.

 

 

HandlerExceptionResolver 적용

 

<MyHandlerExceptionResolver>

package com.example.exception.api;

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.HandlerInterceptor;
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()); //400에러
                return new ModelAndView(); //새로운 ModelAndView를 반환하여 정상 흐름처럼 변경
            }
        }catch (IOException e){
            e.printStackTrace();
        }

        return null;
    }
}

 

400오류 반환 과정

1. IllegalArgumentException 발생

2. response.sendError를 통해 HTTP 상태 코드를 400으로 변경

3. 빈 ModelAndView를 반환하여 뷰를 렌더링 하지 않고 정상 흐름으로 서블릿을 리턴한다.

 

 

<실행 결과>

400에러로 변경된것을 확인 할 수 있다..

 

'BackEnd > 스프링 MVC' 카테고리의 다른 글

@ExceptionHandler  (0) 2025.01.09
스프링 부트 - ExceptionResolver  (0) 2025.01.09
스프링 오류페이지  (0) 2025.01.07
스프링 인터셉터 - 인증 체크  (0) 2025.01.05
서블릿 필터 - 인증 체크  (0) 2025.01.04