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

gggg후후후후님의 프로필 이미지

작성한 질문수

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

스프링 인터셉터 - 소개

controller에서 redirect처리 하는 경우 왜 이렇게 되는지 궁금합니다!

작성

·

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

 

아무튼 질문은 다음과 같습니다!

  1. redirect 처리에도 postHandle이 호출되는 이유가 궁금합니다.

  2. postHandle은 컨트롤러 이후에 호출되는 메서드라 response status code가 302이어야 할 것 같은데, afterCompletion이 되서야 302로 나오는 이유가 궁금합니다.

  3. redirect시에는 postHandle이 호출되지 않게 하는 방법은 없을까요? 단순히 생각하면 modelAndView의 viewName으로 거를 수 있을 것 같은데.. 다른 방법은 없나 해서요!

 

답변 1

1

안녕하세요. gggg후후후후님, 공식 서포터즈 David입니다.

  1. 이해하고 계신대로 postHandle은 핸들러의 메서드 실행 후 동작하는 메서드이기 때문입니다.

  2. 응답의 상태코드가 바뀌는 것은 뷰(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가 나옵니다.

  3. 딱히 방법이 보이진 않네요. 말씀하신대로 view 이름이 redirect: 를 포함하면 postHandle에서 return 시키는 정도가 적절해 보입니다.

감사합니다.