본문 바로가기

📚Study Note/JSP Servlet

[ JSP & SERVLET] 포워딩(Forwarding) 과 리다이렉트(Redirect) │ jsp의 두 가지 페이지 전환 기능의 차이

● 포워딩(forwarding)

요청을 포워딩할 때 해당 요청은 서버의 다른 자원에 전달된다.
이 때에는 다른 자원에서 이 요청을 처리할 것을 클라이언트에게 알리지 않는다.
이와 같은 방식의 처리는 웹 컨테이너 안에서만 일어나고
클라이언트는 이와 같이 처리되고 있다는 것을 알 수 없게 된다.

포워딩은 리다이렉트와 달리
객체를 요청에 담고 해당 요청을 사용할 다음 자원에 전송한다.
따라서 클라이언트는 포워딩이 발생한 사실을 알지 못하는 것이다.
포워딩은 클라이언트와 통신 없이 서버에서만 처리되기 때문에
리다이렉트보다 나은 성능을 갖는다고 할 수 있다.


  • 최초 호출한 url 만 보인다 .
  • 동일 웹 컨테이너에 있는 페이지만 접근 가능하다
  • 클라이언트가 최초 요청한 정보는 다음 url에서도 유효

● 리다이렉트(Redirect)

클라이언트의 요청을 처리한 후
컨테이너는 『sendRedirect()』 메소드가 호출되면 브라우저에 응답을 보낸다.
이 응답에는 브라우저가 웹 컨테이너의 응답을 받은 후
다시 요청을 보낼 새로운 URL 이 포함되어 있다.
여기에서 하나의 요청이 종결된다.
새로 부여받은 URL 로 브라우저가 완전히 새롭게 요청하기 때문에
이전의 요청 스코프에 저장되어 있던 객체는
새로운 요청이 이루어지기 전에 소멸된다,
리다이렉트는 추가적으로 발생한 왕복 처리 때문에
포워딩보다 느리다고 할 수 있다.

기억해야 할 것은...
최종적으로 수행해야 하는 작업은 새로운 요청에 의한 것이고
이것을 클라이언트가 알고 있기 때문에
브라우저 창의 주소가 처음 요청한 주소가 아니고
최종 주소 값으로 변하게 된다.
또한, 하나의 요청에 담겨있던 객체들은 소멸되고
다음작업까지 전달되지 않는다.

※ 기본적으로 클라이언트의 입장에서 편한 것은 포워딩이지만
DB에서 작업이 이루어지고 다시 그에 대한 응답을 받은 클라이언트가
요청하게끔 만들어야 하는 경우는 리다이렉트로 해야 한다.


  • 브라우저는 sendRedirect() 메서드에 의해 새로운 url 을 받게 되고, 새로운 url로 이동하게 된다.
  • 다른 웹 컨테이너에 있는 주소로 이동이 가능하다.
  • 새로운 페이지에서는 Request와 Response 객체가 새롭게 생성한다. 즉 클라이언트는 전혀 다른 요청을 생성하여 두 번째 url에 요청을 내는 것이다. 처음 보냈던 요청은 소멸한다.

 

 

 

아래에서는 둘의 차이를 알아보려는 실습이다.

코드 1                코드 2

 

코드 3          코드4

코드 1,2,3,4 즉 현재 4개의 jsp 파일, 즉 페이지가 있다고 하면

1에서 이름을 입력하고 리다이렉트 버튼을 클릭하면 2번 페이지를 거쳐 리다이렉트 방식으로 4번 페이지에 도착할 것이고

1에서 이름을 입력하고 포워드 버튼을 클릭하면 3번 페이지를 거쳐 포워드 방식으로 4번 페이지에 도착하게 될 것이다. 

 

쉽게 이해하자면 1에서 이름이 적힌 쪽지를 가지고 리다이렉트 버튼을 눌러서 2에 갔다 . 그런데 2에서 쪽지에 이름 밑에 "반갑습니다." 라는 메세지를 적었다. 그런 후 그 쪽지를 자기가 갖고 1에게 여기는 너가 찾는 것이 없으니 4로 가쇼~ 하고 새로운 주소(4의 주소) 가 적힌 쪽지를 주고 1을 보냈다. 1은 4에게 갔다. 4는 1에게 혹시 이름하고 메세지 없니? 물어봤는데 이미 1은 기존에 이름하고 메세지가 적은 쪽지는 두고 왔고  새로운 주소가 적인 쪽지만을 가지고 있을 뿐이다.

1이 새로 가져온 쪽지에는 이름과 메세지가 적혀있지 않으므로 4페이지에서는 이름과 내용이 모두 null 이다.
게다가 주소도 1이 처음 가지고 있었던 쪽지에는 2의 주소가 있었는데 지금은 4의 주소가 주소창에 적혀있다.  

 

그렇다면 1이 3을 거쳐 4로 갔을 때는 어떨까?

1은 이름이 적힌 쪽지를 가지고 포워드 버튼을 눌러서 3으로 갔다. 그곳에 있던 3은 1이 가지고 있던 쪽지에 "안녕하세요" 라는 메세지를 추가한 후 1을 바로 4로 보내줬다!(쪽지도 그냥 쥐어서 바로 4로 쏴준 것이다.) 4에서는 1에게 혹시 이름하고 메세지 가지고 있는 거 있으세요? 라고 물어보고 1은 쪽지를 내민다. 거기에는 처음 적은 이름과 3이 적어준 메세지가 있고 3으로 가기 위한 url 이 적혀있다. 그렇다면 위의 경우와 달리 브라우저에서는 어떻게 보일까?

 

위의 경우와 달리 처음 쪽지가 그대로 1의 손에 들려있기 때문에 이름과 메세지도 있고, 현재 보고 있는 페이지는 4이지만 4의 주소가 아니라 1이 처음에 요청했던 3의 주소가 적혀있는 것을 볼 수 있다. 

 

 

전반적인 내용은 이렇고 위에서 봤던 Redirect와 Forward를 위한 코드들에서

수정되거나 변경될 수 있는 내용들을 추가로 넣었다. 

2의 스크립릿 영역에서 

response.sendRedirect("○○○.jsp"); 를 통해서 redirect 하게 된다.

	// ※  response 객체의 주요 메소드 중 하나인
	// sendRedirect(String location)
	// : 지정된 url(location) 로 요청을 재전송한다.

	(만약 여기서 기존의 request 객체에서 보냈던 name  속성들과 그 값들을 받아서
	response.sendRedirect("○○○.jsp?num1=99&num2=100");
	이렇게 해주게 되면 최종 도착 페이지에도 값을 받을 수 있게 된다.



3에서는 <jsp:forward page="○○○.jsp"></jsp:forward> 를 통해서 하게되는데
jsp 가 아닌 servlet 만으로 (즉, 아래 html 코드들을 모두 지우고도) forward 를 하기 위해서는
스크립릿 영역에 
코드 두 줄을 쓰면 된다.

	RequestDispatcher dispatcher = request.getRequestDispatcher("Receive11.jsp"); /*dispatcher는 하수인 , 파견근무자 라는 뚯이다  */
	dispatcher.forward(request, response);