작성
·
29
·
수정됨
0
예외 발생 후 ExceptionResolver
에서 ModelAndView에 값을 주지 않고 반환시 뷰를 랜더링하지 않고 WAS에 정상 응답으로 돌아가고 WAS에서는 sendError()
이 호출됐었으니 ErrorPage를 찾고 그에 맞는 요청을 하고 BasicErrorController에서 다시 뷰를 랜더링 할텐데요.
만약에 ModelAndView에 값을 준다면..
ModelAndView가 그 값에 맞는 뷰를 랜더링 하고 화면에 보여준 후 WAS에서 진행한 ErrorPage의 뷰도 보여주는건가요..?
그럼 제가 보는 입장에서는 두개의 화면이 렌더링되어 보게되는 걸까요?
더해서 이것이 맞다면, ModelAndView에서 뷰를 랜더링 해서 이미 처리 완료했는데
sendError 때문에 또 다시 ErrorPage를 처리하기 위해 뷰를 랜더링하는 상황이 좀 이상하게 느껴지는데 이게 정상인가요?
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
yoon6669님께서 질문하신 ExceptionResolver
와 ModelAndView
에 관련된 내용을 살펴보겠습니다.
ExceptionResolver
는 예외가 발생했을 때 이를 처리하고, ModelAndView
를 반환함으로써 특정 뷰를 렌더링하도록 설정할 수 있습니다. 그러나 중요한 점은 response.sendError()
메서드를 사용하면, 이미 에러 상태가 설정된 것이기 때문에, 이후에 ModelAndView
가 반환되어도 뷰가 정상적으로 렌더링되지 않을 수 있습니다.
sendError()
메서드는 WAS(Web Application Server)에 오류가 발생했음을 명시적으로 알리기 때문에, WAS는 설정된 오류 페이지를 렌더링합니다. 이 과정에서 sendError()
호출 후에 ModelAndView
를 반환하면, 자바 서블릿에서는 이미 응답이 커밋된 후이기 때문에 두 개의 화면이 렌더링되는 것이 아니라 sendError()
에 의해 지시된 오류 페이지가 렌더링됩니다.
정리하자면, ModelAndView
를 주더라도 이미 sendError()
로 커밋한 후에는 해당 뷰의 렌더링이 무시되고 WAS가 오류 페이지를 렌더링하려고 시도합니다. 따라서, 두 개의 화면이 보이는 것이 아니라, 오류 페이지만 보이거나 특정한 에러 응답이 브라우저에 표시될 것입니다.
더 구체적인 설명이 필요하시다면, 기존 질문에서 유사한 내용을 다룬 아래 게시글도 도움이 될 수 있습니다:
이러한 내용들을 참고하시면 기본적인 예외 처리 흐름과 sendError()
호출에 따른 시스템 반응을 이해하는 데 도움이 될 것입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.