작성
·
496
0
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)
[질문 내용]
안녕하세요! 스프링 인터셉터 작동 순서에 대해 공부하다 의문이 생겨 문의 드립니다~
일부 생략해서 말씀드리면, 대충 이런 흐름으로 인터셉터내의 메서드가 작동한다고 알고 있는데요.
preHandle -> 컨트롤러 -> postHandle -> afterCompletion
이때 컨트롤러에서 redirect 처리를 하는 경우, postHandle과 afterCompletion까지 모두 작동하고 나서 새로운 URL로 preHandle가 호출되기 시작하더라구요. 단순히 생각했을 땐 redirect 처리가 되는 경우 postHandle은 실행되지 않고 afterCompletion만 실행될 줄 알았는데.. 아니더라구요!
밑에는 제가 테스트 해본 나온 로그입니다. (실제 로그는 아니고 조금 생략했어요!)
[uri : /test1] preHandle
[uri : /test1] controller , redirect
[uri : /test1] postHandle , response status : 200, modelAndView.getViewName : redirect:/test2
[uri : /test1] afterCompletion , response status : 302
[uri : /test2] preHandle
[uri : /test2] postHandle , response status : 200, modelAndView.getViewName : test2
[uri : /test2] afterCompletion , response status : 200
아무튼 질문은 다음과 같습니다!
redirect 처리에도 postHandle이 호출되는 이유가 궁금합니다.
postHandle은 컨트롤러 이후에 호출되는 메서드라 response status code가 302이어야 할 것 같은데, afterCompletion이 되서야 302로 나오는 이유가 궁금합니다.
redirect시에는 postHandle이 호출되지 않게 하는 방법은 없을까요? 단순히 생각하면 modelAndView의 viewName으로 거를 수 있을 것 같은데.. 다른 방법은 없나 해서요!
답변 1
1
안녕하세요. gggg후후후후님, 공식 서포터즈 David입니다.
이해하고 계신대로 postHandle은 핸들러의 메서드 실행 후 동작하는 메서드이기 때문입니다.
응답의 상태코드가 바뀌는 것은 뷰(RedirectView)를 렌더링할 때입니다. 아래 링크 코드를 참고해 주세요. https://github.com/spring-projects/spring-framework/blob/main/spring-webmvc/src/main/java/org/springframework/web/servlet/view/RedirectView.java#L627 postHandle은 뷰를 렌더링하기 전, afterCompletion은 뷰를 렌더링하고 난 후 동작합니다. 따라서, postHandle에서는 응답의 상태코드가 200, afterCompletion에서는 302가 나옵니다.
딱히 방법이 보이진 않네요. 말씀하신대로 view 이름이 redirect:
를 포함하면 postHandle에서 return 시키는 정도가 적절해 보입니다.
감사합니다.