JSP
Forwarding이란?
jaycheol
2025. 1. 30. 23:30
반응형
Forwarding은 웹 애플리케이션에서 한 서블릿이나 JSP 페이지가 다른 서블릿이나 JSP 페이지로 요청을 전달하는 방식입니다. 이 과정에서 클라이언트에게는 요청이 계속해서 동일하게 보이고 URL도 변경되지 않습니다. 즉, 클라이언트는 요청이 다른 페이지로 전달된 사실을 알 수 없습니다.
Forwarding의 작동 방식
- RequestDispatcher:
- RequestDispatcher 객체는 요청을 다른 서블릿이나 JSP 페이지로 전달하는 데 사용됩니다.
- 이 객체는 ServletRequest.getRequestDispatcher(String path) 메서드를 통해 생성됩니다.
- forward() 메서드를 사용하여 요청을 다른 리소스로 전달합니다.
- 특징:
- URL 변경 없음: 요청이 전달되면 클라이언트의 브라우저는 URL을 변경하지 않습니다. 즉, 클라이언트는 페이지 이동을 알 수 없습니다.
- 서버 내 처리: 클라이언트는 서버에서 처리된 결과만 받으며, 중간에 어떤 서블릿이 처리했는지, 어떤 페이지로 요청이 전달되었는지는 알 수 없습니다.
- 서버 자원 공유: 요청이 포워딩되면, 최초의 요청에서 생성된 데이터를 다른 서블릿이나 JSP에서 공유할 수 있습니다. 예를 들어, request.setAttribute()로 데이터를 저장하고, forward()로 전달하면 후속 페이지에서 해당 데이터를 사용할 수 있습니다.
Forwarding 사용 예시
1. 서블릿에서 Forwarding
// 서블릿에서 RequestDispatcher 사용 예시
@WebServlet("/example")
public class ExampleServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 요청 데이터 처리
String message = "Hello from ExampleServlet";
request.setAttribute("message", message);
// 다른 JSP로 요청 포워딩
RequestDispatcher dispatcher = request.getRequestDispatcher("/result.jsp");
dispatcher.forward(request, response); // 포워딩
}
}
2. JSP에서 Forwarding
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%-- JSP에서 RequestDispatcher 사용 예시 --%>
<%
String message = "Hello from JSP!";
request.setAttribute("message", message);
// 다른 JSP로 포워딩
RequestDispatcher dispatcher = request.getRequestDispatcher("/nextPage.jsp");
dispatcher.forward(request, response);
%>
주요 메서드
- getRequestDispatcher(String path): 요청을 전달할 리소스를 지정합니다.
- forward(ServletRequest request, ServletResponse response): 요청을 지정한 리소스로 포워딩합니다.
Forwarding vs Redirect
- Forward:
- 서버 내에서 처리된 후, 클라이언트는 요청이 다른 리소스로 전달된 사실을 모른 채 처리 결과만 받습니다.
- URL은 변경되지 않으며, 요청 데이터(request 객체에 저장된 데이터 등)는 그대로 유지됩니다.
- Redirect:
- 클라이언트에게 새로운 URL로 요청을 보냅니다. 클라이언트는 URL을 변경한 후 새로운 리소스를 요청합니다.
- 클라이언트는 이전 리소스에서 다른 리소스로 이동했음을 알 수 있습니다.
Forwarding의 사용 예
- 서버 내 여러 페이지로의 흐름 제어: 예를 들어, 로그인 후 사용자 정보를 처리하는 서블릿에서 로그인 결과를 다른 JSP로 포워딩하는 경우.
- 데이터 공유: 서블릿에서 request.setAttribute()로 데이터를 저장하고, 해당 데이터를 다른 서블릿이나 JSP에서 활용할 때 포워딩을 사용할 수 있습니다.
요약
forward()는 클라이언트가 URL 변경 없이 다른 리소스로 요청을 전달하는 방식으로, 서버 내부에서 리소스를 이동시키는 방식입니다. RequestDispatcher를 사용하여 포워딩을 처리하고, 클라이언트는 이를 인지하지 못합니다.
Forwarding의 개념을 시각적으로 표현한 다이어그램:
- 클라이언트 → 서블릿/서버: 클라이언트가 웹 브라우저에서 요청을 보냅니다.
- 서블릿이 처리 후 포워딩: 서버에서 서블릿이 요청을 처리하고, 다른 JSP 페이지나 서블릿으로 요청을 포워딩합니다. 이때 클라이언트는 URL이 변경된 것을 알 수 없습니다.
- 서블릿 → JSP: 포워딩된 페이지에서 요청을 처리한 결과를 클라이언트에 반환합니다.
- 클라이언트: 클라이언트는 처리된 결과를 받으며, URL은 변화하지 않음을 알 수 있습니다.
다이어그램 형태로 설명:
+------------------+ +------------------+ +------------------+
| 클라이언트 | -----> | 서블릿 | -----> | JSP |
| (브라우저) | | (요청 처리 후) | | (응답 처리 후) |
+------------------+ +------------------+ +------------------+
| (요청) 포워딩 (응답)
|---------------------------------------------------->
(URL 변경 없음)
- 클라이언트 → 서블릿: 클라이언트가 웹 브라우저를 통해 request를 서버로 보냅니다.
- 서블릿 → JSP (Forwarding): 서블릿은 데이터를 처리한 후, RequestDispatcher의 forward() 메서드를 사용해 요청을 JSP 페이지로 전달합니다. 이때 URL은 클라이언트에게 변경되지 않습니다.
- 서블릿/JSP → 클라이언트: JSP 페이지는 최종적으로 클라이언트에게 응답을 보냅니다.
이 과정에서 클라이언트는 요청을 보낸 페이지 URL이 변경되었다고 느끼지 않으며, 요청이 서버 내에서 포워딩된 것입니다. URL이 그대로 유지되므로 클라이언트는 페이지 이동을 인지하지 못합니다.
반응형