본문 바로가기
Spring

[Spring] redirect와 forward

by eunoo 2022. 8. 9.

컨트롤러에서 뷰로 넘겨줄 때 총 세가지 경우가 있다.

  1. 일반적으로 뷰이름을 반환하는 경우
  2. redirect를 반환하는 경우
  3. forward를 반환하는 경우

총 세 가지 경우의 차이점에 대해 알아보도록 하자.

1. 일반적으로 뷰이름을 반환하는 경우

1. "/register/add"로 요청

2. DispatcherServlet이 입력부분 처리하고 Controller에게 전달

3. Controller가 "registerForm"(뷰이름)을 반환하여 다시 DispatcherServlet에게 전달

 

4. InternalViewResolver가 뷰의 진짜 경로를 반환 (ex) /WEB-INF/views/registerForm.jsp)

5. JstlView에게 전달, JstlView가 모델을 registerForm.jsp에게 전달

6. 응답

2. redirect를 반환하는 경우

1. "/register/save"로 요청

2. DispatcherServlet이 입력부분 처리하고 Controller에게 전달

3. Controller에서 "redirect:register/add" 반환하여 DispatcherServlet에게 전달

4. DispatcherServletRedirectView에게 전달

5. RedirectView은 다음과 같은 응답헤더를 생성하여 응답.300번대 응답코드는 리다이렉트를 의미. 재요청할 location을 전달한다.

HTTP/1.1 302
Location:/register/add?msg=testtest

6. 1번 경우와 동일. /register/add?msg=testest 로 자동 요청함.(이때 요청은 무조건 GET요청)

 

정리 : 결론적으로 redirect는 총 두번의 요청을 하는 것이다. 그래서 내가 처음에 /register/save로 요청을 보내면 자동으로 /register/add?msg=testtest로 재요청을 하기 때문에 브라우저의 url이 /register/add?msg=testtest으로 변한다.

주의할 점은 처음 요청과 두 번째 요청(자동)에서 모델은 같은 것이 아니라는 것~~

3. forward를 반환하는 경우

1. "/register/save"로 요청

2. DispatcherServlet이 입력부분 처리하고 Controller에게 전달

3. Controller에서 "forward:register/add" 반환하여 DispatcherServlet에게 전달

4. DispatcherServletInternalResourceView에게 전달

5. InternalResourceView가 "/register/add"로 내부적으로 요청을 함.

6. 1번 경우와 동일

 

정리: forward는 한 번만 요청하는 것이다. 브라우저의 url은 처음에 요청한 경로 /register/save이고, 화면은 forward로 요청한 결과를 보여준다.

'Spring' 카테고리의 다른 글

[Spring] ObjectMapper  (0) 2023.01.17
[Spring]쿠키(Cookie)  (0) 2022.08.09
[Spring] @RequestParam과 @ModelAttribute  (0) 2022.08.04
[Spring] 요청 URL 경로 출력하기(feat. Filter)  (0) 2022.07.14
[Spring] DispatcherServlet 구현하기  (0) 2022.07.05

댓글