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를 반환하여 뷰를 렌더링 하지 않고 정상 흐름으로 서블릿을 리턴한다.
<실행 결과>
'BackEnd > 스프링 MVC' 카테고리의 다른 글
@ExceptionHandler (0) | 2025.01.09 |
---|---|
스프링 부트 - ExceptionResolver (0) | 2025.01.09 |
스프링 오류페이지 (0) | 2025.01.07 |
스프링 인터셉터 - 인증 체크 (0) | 2025.01.05 |
서블릿 필터 - 인증 체크 (0) | 2025.01.04 |