컨트롤러에서 뷰로 넘겨줄 때 총 세가지 경우가 있다.
- 일반적으로 뷰이름을 반환하는 경우
- redirect를 반환하는 경우
- 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. DispatcherServlet
가 RedirectView
에게 전달
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. DispatcherServlet
가 InternalResourceView
에게 전달
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 |
댓글