인프런 커뮤니티 질문&답변

aole님의 프로필 이미지
aole

작성한 질문수

스프링 MVC 2편 - 백엔드 웹 개발 활용 기술

스프링이 제공하는 ExceptionResolver2

ExceptionResolver 에러 해결에 관하여 질문이 있습니다!

작성

·

91

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에 exceptionmessage 필드가 포함되어 있습니다. 이는 스프링 부트의 기본 에러 처리 메커니즘이 작동하여 예외 정보를 포함한 에러 응답을 생성하기 때문입니다.

즉, HandlerExceptionResolver를 사용하여 예외를 처리했다고 해서 모든 예외 정보가 응답에서 제외되는 것은 아닙니다. 예외를 ‘해결’하는 방식은 개발자가 구현하는 HandlerExceptionResolver에 따라 다르며, sendError 메서드의 사용은 서블릿 컨테이너에게 특정 HTTP 상태 코드로 응답을 내보내도록 하면서 기본 에러 페이지나 JSON 응답 등을 자동으로 생성하도록 합니다.

학습에 도움이 되셨기를 바랍니다. 좋은 질문 감사드립니다.

aole님의 프로필 이미지
aole

작성한 질문수

질문하기