Spring MVC | redirect와 forward
redirect와 foward 처리 과정 비교
Redirect
클라이언트가 /ch2/write/jsp를 요청했다. write.jsp가 302번으로 응답을 했다.
상태 코드 300번대는 리다이렉트(다른 URL로 재요청)를 의미한다.
상태코드가 300번대인 리다이렉트는 응답 헤더만 있고 바디는 없다.
>> 어디로 요청해야할지 location을 헤더 정보에 준다.
브라우저가 자동으로 이 location에서 알려준대로 새로운 요청을 한다.
1번 요청은 클라이언트가 요청한 것이고, 3번 요청은 브라우저가 자동으로 요청한 것이다.
1번 요청이 GET/POST 상관없이 리다이엑트에서 자동으로 요청되는 3번은 GET으로 요청된다.
Forward
클라이언트가 write.jsp한테 요청을 한다.
write.jsp가 자기가 처리해야 할 게 아닌 경우거나 일부만 처리해야 할 때,
그 내용을 login.jsp한테 전달을 해준다.
>> 사용자가 요청한 내용을 그대로 전달해준다.
write.jsp에서 어떤 값의 속성을 저장할 수 있는데, 그 정보도 같이 login.jsp한테 forward한다.
login.jsp가 요청을 받아 처리한 후 응답한다.
전달할 때 request 뿐만 아니라 response도 같이 전달을 한다.
login.jsp가 이 reponse를 이용해서 응답할 수 있다.
redirect는 요청이 2번 간 것이고, forward는 요청이 한 번 간 것이다.
Spring은 forward를 이용해서 MVC를 구현하고 있다.
request는 M(model)의 역할, write.jsp는 C(controller)역할, login.jsp는 V(view)역할을 하고 있다.
controller가 처리를 하고 그 결과를 model(request객체)에 담아서 view한테 전달하면
view가 이 모델을 받아서 최종적으로 결과를 만들어 응답한다.
RedirectView
/ch2/register/save 요청
-> DispatcherServlet이 요청을 처리할 수 있는 Controller 메소드 호출
-> 유효성 검사에 실패하여 redirect의 문자열이 반환
-> Controller는 DispatcherServlet에게 view이름 대신 문자열을 반환
-> DispatcherServlet은 RedirectView에게 문자열을 전달
-> RedirectView는 응답헤더를 만들어 냄
-> 응답을 받은 클라이언트는 상태코드 302번을 보고
-> 브라우저가 location에 나와있는 url로 자동 요청
jstlView : jsp standard tag library view
/ch2/register/add 요청
-> DispatcherServlet이 Controller 메소드 호출
-> /register/add와 연결되어 있는 register 메서드에 접근하여 registerForm을 반환
-> DispatcherServlet이 view이름을 받아 Internal Resource View Reslove에게 registerForm문자를 보낸다.
-> Internal Resource View Reslove가 받은 view에 대해서 해석한 뒤 이름(/WEB-INF/views/registerForm.jsp)을 DispatcherServlet에게 반환
-> DispatcherServlet은 받은 이름을 jstlView에게 넘겨준다.
-> jstlView가 해당 jsp에게 모델을 넘겨준다.
-> registerForm.jsp가 그 데이터를 가지고 최종응답을 만들어 응답한다.
InternalResourceView
/ch2/register/save 요청
-> DispatcherServlet이 Controller 메소드 호출
-> Controller 메소드가 "forward:/register/add" 문자열 반환
-> DispatcherServlet이 전달받은 문자열을 InternalResourceView에게 전달
-> InternalResourceView는 DispatcherServlet에게 /register/add 호출 명령 >> forwarding은 InternalResourceView가 처리한다.
-> DispatcherServlet은 /register/add와 연결된 메소드 호출
-> 그 메서드가 registerForm 반환
-> DispatcherServlet이 view이름을 받아 Internal Resource View Reslove에게 registerForm문자를 보낸다.
-> Internal Resource View Reslove가 받은 view에 대해서 해석한 뒤 이름(/WEB-INF/views/registerForm.jsp)을 DispatcherServlet에게 반환
-> DispatcherServlet은 받은 이름을 jstlView에게 넘겨준다.
-> jstlView가 해당 jsp에게 모델을 넘겨준다.
-> registerForm.jsp가 그 데이터를 가지고 최종응답을 만들어 응답한다.