# 개념 정리
🔎 포워딩(Forwarding, 포워드)
요청을 포워딩 할 때 해당 요청은 서버의 다른 자원에 전달된다.
(길동이가 둘리에게 양파 많이, 계란후라이 추가 한 김치볶음밥을 주문한다.)
이 때에는 다른 자원에 이 요청을 처리할 것을 클라이언트에게 알리지 않는다.
(둘리 : 아~ 나 볶음밥 이제 졸업해서 안만드는디~ 희동아 너가 이거 만들어라!! 너한테 넘긴다!)
이와 같은 방식의 처리는 웹 컨테이너 안에서만 일어나고 클라이언트는 알 수 없게 된다.
(길동이는 둘리가 만들어 준 김치볶음밥이라고 알고 있다.
왜? 길동이가 희동이에게 따로 요청한 내용이 없고 둘리에게만 요청했는데 김치볶음밥이 나왔다.
또한, 둘리도 길동이에게 희동이가 만들었다고 알리지 않았고 김치볶음밥에 희동이가 만들었음이라고 써있지도 않으니까 알 방법이 없음!)
포워딩은 리다이렉트와 다르게 객체를 요청에 담고 해당 요청을 사용할 다음 자원에 전송한다.
따라서 클라이언트는 포워딩이 발생한 사실을 알지 못하는 것이다.
포워딩은 클라이언트와 통신 없이 서버에서만 처리되기 때문에 리다이렉트보다 나은 성능을 갖는다고 할 수 있다.
🔎 리다이렉트(Redirect, 리다이렉팅, 리디렉션)
클라이언트의 요청을 처리한 후, 컨테이너는 [sendRedirect()] 메소드가 호출되면 브라우저에 응답을 보낸다.
이 응답에는 브라우저가 웹 컨테이너의 응답을 받은 후 다시 요청을 보낼 새로운 URL 이 포함되어 있다.
여기에서 하나의 요청이 종결된다.
새로 부여받은 URL 로 브라우저가 완전히 새롭게 요청하기 때문에 이전의 요청 스코프에 저장되어 있던 객체는 새로운 요청이 이루어지기 전에 소멸✨된다.
리다이렉트는 추가적으로 발생한 왕복 처리 때문에 포워딩보다 느리다고 할 수 있다.
(둘리 : 길동아 나 이제 볶음밥 안만들어! 내 담당이 아니얌^^ 볶음밥 담당인 희동이한테 가서 만들어달라고 다시 요청해! 너가 말한 요청사항을 나는 희동이에게 전달하지 않을거야! 그럼 수고^^7
길동 : 흑흑 알겠어 내가 다시 희동에게 요청할게.
(희동이= 새로운 URL 한테 가서) 희동아~! 나 길동이인데 김치볶음밥에 양파 많이, 계란후라이 추가해서 부탁해! )
최종적으로 수행해야 하는 작업은 새로운 요청에 의한 것이고 이것을 클라이언트가 알고 있기 때문에
브라우저 창의 주소가 처음 요청한 주소가 아니고 최종 주소값으로 변하게 된다.
또한, 하나의 요청에 담겨 있던 객체들은 소멸되고 다음 작업까지 전달되지 않는다.
※ 기본적으로 클라이언트의 입장에서 편한 것은 포워딩이지만
DB에서 작업이 이루어지고, 다시 그에 대한 응답을 받은 클라이언트가 새로운 요청을 하게끔 만들어야 하는 경우는 리다이렉트를 사용해야 한다.
# 포워딩&리다이렉트 실습
# Send09.jsp
<body>
<!-- Send09.jsp → Send09_re.jsp → Receive09.jsp -->
<!-- Send09.jsp → Send09_for.jsp → Receive09.jsp -->
<!-- 사용자 최초 요청 페이지 -->
<!-- http://localhost:3306/WebApp07/Send09.jsp -->
<div>
<!-- action 처리에 대한 분기~!!! -->
<form action="" method="post" id="testForm">
이름
<input type="text" name="userName" class="txt">
<br><br>
<button type="submit" class="btn" style="width: 150px;"
onclick="this.form.action='Send09_re.jsp'">리다이렉트</button>
<button type="submit" class="btn" style="width: 150px;"
onclick="this.form.action='Send09_for.jsp'">포워드</button>
</form>
</div>
</body>
# Receive09.jsp (받은 데이터 최종 수신 페이지)
<%@ page contentType="text/html; charset=UTF-8"%>
<%
// 이전 페이지(Send09_re.jsp 또는 Send09_for.jsp)로부터 넘어온 데이터 수신
// → userName, message
request.setCharacterEncoding("UTF-8");
String userName = request.getParameter("userName");
String message = (String)request.getAttribute("message");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Receive09.jsp</title>
</head>
<body>
<div>
<p> 이름: <%=userName %></p>
<p> 내용: <%=message %></p>
</div>
</body>
</html>
# Send09_for.jsp - 포워드 처리
1) 스크립릿 영역 구성
<%
// ① 이전 페이지(Send09.jsp)로부터 넘어온 데이터 수신
// → userName
request.setCharacterEncoding("UTF-8");
String userName = request.getParameter("userName");
// ② 이 페이지에서 수행한 추가 작업
request.setAttribute("message", "안녕하세요.");
%>
➰ 체크할 내용 ➰
1) request.setAttribute("message", "안녕하세요.")
- request 객체의 key(message)의 값 안에 "안녕하세요."를 value 로 넣는 작업
2) html 영역 구성
<div>
<p>이름: <%=userName %></p>
</div>
<!-- ③ 포워드 -->
<jsp:forward page="Receive09.jsp"></jsp:forward>
다음에는 <jsp:forward> 태그가 아닌 [RequestDispatcher] 사용하여 처리해 볼 예정
# 포워딩ver. 최종 수신 페이지
➰ 체크할 내용 ➰
- 포워딩 처리에서는 이름과 내용이 모두 잘 넘어가는 것을 확인할 수 있다. 하지만 리다이렉트는 아닐걸~
# Send09_re.jsp - 리다이렉트 처리
1) 스크립릿 영역 구성
<%
// ① 이전 페이지(Send09.jsp)로부터 넘어온 데이터 수신
// → userName
request.setCharacterEncoding("UTF-8");
String userName = request.getParameter("userName");
// ② 이 페이지에서 수행한 추가 작업
request.setAttribute("message", "반갑습니다.");
// ※
// ③ 리다이렉트
response.sendRedirect("Receive09.jsp");
%>
➰ 체크할 내용 ➰
- 리다이렉트를 하는 순간 이전 데이터 소멸 → 최종 수신 페이지에서 null 값이 나오는 것을 확인할 수 있다.
앗, 미안! 나는 이제 볶음밥을 만들지 않아~! 희동이한테 가서 다시 요구사항을 전달해. 내가 들은건 전달하지 않을거니까 길동이 너가 다시 전달해^^
2) html 영역 구성
<div>
<p>이름: <%=userName %></p>
</div>
# 리다이렉트ver. 최종 수신 페이지