반응형
인터셉터를 탄 컨트롤러에서 redirect 시키는 경우 어떻게 될까? 🧐
✅ 인터셉터 흐름
preHandle -> 컨트롤러 -> postHandle -> afterCompletion
고민
- URL /test1로 들어온 요청이 어느 인터셉터를 타게 된다면, 다음과 같이 진행될 것이다.
- 일단 preHandle를 탄다.
- 그 다음 /A를 RequestMapping한 컨트롤러의 로직을 타게 된다.
- 하지만 컨트롤러에서 /test2로 redirect를 시킨다면..? postHandle 메서드를 타게 될까?
결론
결론은 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
(인프런 QnA 게시판을 이용해 질문해봤다.)
postHandle 메서드를 타는 별다른 이유는 없다. redirect 처리는 인터셉터의 모든 로직 후에 처리되기 때문이다.
추가적으로, postHandle 메서드에서는 response의 상태코드가 200이지만 afterCompletion에서는 302 (리다이렉트)로 변하는 부분을 볼 수 있는데 이유는 다음과 같다.
응답의 상태코드가 바뀌는 것은 뷰(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가 나옵니다.
추가 고민
- redirect시에는 postHandle이 호출되지 않게 하는 방법은 없을까?
- 딱히 별다른 방법은 없고, view 이름이 redirect: 를 포함하면 postHandle에서 return 시키는 정도가 적절해보인다고 하신다!
👍 Reference
더보기
반응형