이번 시간에는 리다이렉트 (redirect) 와 포워드(forward)에 대해서 알아보겠습니다. 이 둘이 어떻게 다른지 간단하게 프로그램을 작성해 보겠습니다.

 


 먼저 home.jsp입니다.

 

 

 form action에 "work"라고 되어 있습니다. submit 버튼이 있고, id와 name이 "name"인 텍스트 폼이 하나 있습니다. 텍스트 폼에 뭔가를 넣고 submit을 누르면, work로 넘어갈 겁니다.

 

 

 그러면, HttpServlet를 extend한 work 클래스로 들어오게 됩니다. 이 클래스 안에는 doGet과 doPost 메서드가 오버라이딩이 되어 있습니다. 이 둘은 각각 Post로 받았을 때와 Get으로 받았을 때 어떻게 처리해야 할지 작성하게 됩니다.

 

 

 post로 들어왔던, get으로 들어왔던, doGet 메서드는 수행하게 되므로, doGet만 보시면 될 듯 싶습니다. 먼저, request에서, name을 parameter로 가지는 값을 뺍니다. 그리고, 응답 객체에 헤더 이름이 "name"인 것에, "name_is"라는 값을 셋팅합니다. 다음에, response 객체에서 "name"을 이름으로 가지는 value 값을 뽑아냅니다. 그러면, "name_is"가 출력될 겁니다.

 

 그리고, work2로 redirect를 합니다. 31번째 줄에, do get!을 출력하라는 문장이 있습니다. 이것은 밑에서 다시 설명해 보겠습니다.

 

 

 work2로 가게 되면, 이 클래스로 들어오게 됩니다.

 

 

 여기에서는, request의 name 파라미터의 값과, request의 name의 값을 뽑아냅니다. 그 다음에, next.jsp로 redirect를 보냅니다.

 

 

 실행 결과가 어떻게 나올까요? sendRedirect를 실행했으니까, do get! 이라는 것은 출력이 안 될 줄 알았는데, 출력이 되었습니다. 이는, sendRedirect가 호출이 되면, 바로 work2로 이동시키는 게 아니라, 302라는 응답 코드와, 어디로 페이지를 이동시킬 것인지에 대한 정보를 보냈다는 의미입니다.

 

 

 redirect하겠다는 정보를 send 한 것이랑, 진짜 페이지를 이동했다는 것은 뉘앙스의 차이가 있어요. 즉, sendRedirect가 호출되었다고 해서, 바로 이동하지는 않기 때문에, do get! 이라는 것이 호출이 될 수도 있어요. 그 다음에 하나 더 중요한 특성이 더 있습니다.

 

 

 노란색을 request라 하고, 보라색을 response라고 해 봅시다. 처음에, id과 name이 "name"인 field에 13311331을 넣었습니다. 그러면, 서블릿 work의 doGet 메서드에서 request.getParameter("name")을 호출했을 때, 13311331이 나왔습니다. 다음에, client에게 응답을 하고 난 다음에, work2를 client가 다시 요청합니다.

 

 

 이 때, response와 request가 새로 만들어집니다. 기존의 응답, 요청 객체는 유효하지 않습니다. 그렇기 때문에, work2에서 출력을 했을 때, null 값이 나왔습니다.

 

 


 work 서블릿 클래스의 doGet 메서드를 다음과 같이 바꿔보겠습니다.

 

 request에는 "uigkjkjkkhjhju"가, response에는 "name_is"가 있습니다. 이를 work2로 forward를 보내봅시다.

 

 

 결과는 위와 같습니다. request와 response에 있던 내용이 그대로 있었음을 알 수 있습니다. 그리고 work2에서는, next.jsp에 리다이렉트를 하는데요. edge에서 F12를 누르고 네트워크를 보면, 다음과 같은 것들이 날라다녔음을 알 수 있어요.

 

 

 POST로 보낸 요청의 결과가 302로 응답이 왔다. 그런데, 302면 리다이렉트를 한다는 의미이고, 저는 work2는 바꾸지 않았기 때문에, next.jsp로 이동한다는 정보를 응답에 보낼 때, 302가 떨어질 겁니다. 그러면, work2로 이동한 상황에서는 302가 떨어지지 않을 거에요. 거기까지의 상황을 그림으로 그려보면 아래와 같을 겁니다.

 

 

 302를 응답할 때 까지 상황입니다. response 객체의 Header에 name이라는 이름을 가지고, name_is라는 값을 가지는 것을 넣었습니다. 그리고 요청 객체에는 123이라는 내용이 들어 있었습니다. 이 내용이 work에서 work2로 포워딩 되는 동안에도 유지가 되었습니다.