Tech_JINI 2025. 3. 5. 18:23

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가 그 데이터를 가지고 최종응답을 만들어 응답한다.