작성
·
98
0
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오) 네!
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 네!
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 네!
[질문 내용]
여기에 질문 내용을 남겨주세요.
안녕하세요!
mvc2 9chapter (API 예외 처리)
API 예외 처리 - API 예외 처리 - HandlerExceptionResolver 시작
에서의 의문점 입니다.
해당 부분에서는 IllegalArgumentException이 컨트롤러단에서 발생할 경우 Resolver를 이용해 정상흐름으로 만든 뒤 sendError를 호출하고 있는데요
@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);
return new ModelAndView();
}
} catch (IOException e) {
log.error("resolver ex", e);
}
return null;
}
}
그에 따른 api 호출 결과는 다음과 같습니다.
{
"timestamp": "2024-08-31T18:06:36.410+00:00",
"status": 400,
"error": "Bad Request",
"exception": "java.lang.IllegalArgumentException",
"message": "잘못된 입력 값",
"path": "/api/members/bad"
}
resolver는 컨트롤러 단에서 예외가 발생했을 때 그 예외를 해결하고 새로운 결과를 만드는 것 이라고 학습하였습니다.
'IllegralArgumentException 예외를 해결' 하고 'sendError(400)'으로 새로운 결과를 만들어 내었다고 생각하였는데
json 결과에서 status가 400으로 바뀌긴 하였지만, IllegralArumentException에 대한 exception과 message가 나와있는 것을 확인해 볼 수 있었습니다.
resolver에서 '예외를 해결' 하였으니 exception 필드과 message 필드는 없어야 한다고 생각하는데 어떤 메커니즘에 의해 저 json 결과가 나왔는지가 궁금합니다.
좋은 강의 만들어 주셔서 항상 감사드립니다.
답변 2
0
안녕하세요. aole님
서블릿은 예외가 발생하거나 또는 resonse.sendError()가 호출된 경우에 별도의 예외 처리가 작동합니다.
이 경우 sendError를 호출하기 대문에 별도의 예외 처리가 작동하게 됩니다.
자세한 내용은 앞서 학습한 서블릿 예외 처리 - 시작 섹션을 참고해주세요.
감사합니다.
0
안녕하세요, 인프런 AI 인턴입니다.
aole님의 질문에 답변 드리겠습니다.
MyHandlerExceptionResolver
에서 IllegalArgumentException
예외가 발생했을 때, response.sendError(HttpServletResponse.SC_BAD_REQUEST);
를 호출함으로써 클라이언트에게 HTTP 400 상태 코드와 함께 에러 응답을 전송하고 있습니다. 이때 sendError
메소드는 응답으로 에러 정보를 포함하여 보내도록 서블릿 컨테이너에 지시합니다. 그 결과로 status
, error
, exception
, message
, path
등의 에러 정보를 포함한 JSON 응답이 생성됩니다.
HandlerExceptionResolver
는 예외를 ‘해결’하는 역할을 하긴 하지만, 그 처리 방식은 구현에 따라 다를 수 있습니다. 여기서 ‘해결’한다는 것은 반드시 예외를 사라지게 하는 것이 아니라, 예외 상황을 개발자가 원하는 방식으로 처리할 수 있게 하는 것을 의미합니다. 예를 들어, 예외를 로깅하고 사용자에게 친절한 에러 메시지를 보내는 등의 처리를 할 수 있습니다.
sendError
를 호출함으로써 예외의 ‘처리’는 이루어졌지만, 실제로 IllegalArgumentExcepiton
에 대해 JVM 레벨에서 예외가 사라진 것은 아니기 때문에, 응답 JSON에 exception
과 message
필드가 포함되어 있습니다. 이는 스프링 부트의 기본 에러 처리 메커니즘이 작동하여 예외 정보를 포함한 에러 응답을 생성하기 때문입니다.
즉, HandlerExceptionResolver
를 사용하여 예외를 처리했다고 해서 모든 예외 정보가 응답에서 제외되는 것은 아닙니다. 예외를 ‘해결’하는 방식은 개발자가 구현하는 HandlerExceptionResolver
에 따라 다르며, sendError
메서드의 사용은 서블릿 컨테이너에게 특정 HTTP 상태 코드로 응답을 내보내도록 하면서 기본 에러 페이지나 JSON 응답 등을 자동으로 생성하도록 합니다.
학습에 도움이 되셨기를 바랍니다. 좋은 질문 감사드립니다.