JSP

Forwarding이란?

jaycheol 2025. 1. 30. 23:30
반응형
 

Forwarding은 웹 애플리케이션에서 한 서블릿이나 JSP 페이지가 다른 서블릿이나 JSP 페이지로 요청을 전달하는 방식입니다. 이 과정에서 클라이언트에게는 요청이 계속해서 동일하게 보이고 URL도 변경되지 않습니다. 즉, 클라이언트는 요청이 다른 페이지로 전달된 사실을 알 수 없습니다.

Forwarding의 작동 방식

  1. RequestDispatcher:
    • RequestDispatcher 객체는 요청을 다른 서블릿이나 JSP 페이지로 전달하는 데 사용됩니다.
    • 이 객체는 ServletRequest.getRequestDispatcher(String path) 메서드를 통해 생성됩니다.
    • forward() 메서드를 사용하여 요청을 다른 리소스로 전달합니다.
  2. 특징:
    • 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의 개념을 시각적으로 표현한 다이어그램:

  1. 클라이언트 → 서블릿/서버: 클라이언트가 웹 브라우저에서 요청을 보냅니다.
  2. 서블릿이 처리 후 포워딩: 서버에서 서블릿이 요청을 처리하고, 다른 JSP 페이지나 서블릿으로 요청을 포워딩합니다. 이때 클라이언트는 URL이 변경된 것을 알 수 없습니다.
  3. 서블릿 → JSP: 포워딩된 페이지에서 요청을 처리한 결과를 클라이언트에 반환합니다.
  4. 클라이언트: 클라이언트는 처리된 결과를 받으며, URL은 변화하지 않음을 알 수 있습니다.

다이어그램 형태로 설명:

+------------------+             +------------------+             +------------------+
|    클라이언트    |  ----->    |     서블릿        |  ----->    |      JSP         |
| (브라우저)        |             |  (요청 처리 후)   |             |  (응답 처리 후)  |
+------------------+             +------------------+             +------------------+
    | (요청)               포워딩              (응답)
    |---------------------------------------------------->
                       (URL 변경 없음)
  • 클라이언트 → 서블릿: 클라이언트가 웹 브라우저를 통해 request를 서버로 보냅니다.
  • 서블릿 → JSP (Forwarding): 서블릿은 데이터를 처리한 후, RequestDispatcher의 forward() 메서드를 사용해 요청을 JSP 페이지로 전달합니다. 이때 URL은 클라이언트에게 변경되지 않습니다.
  • 서블릿/JSP → 클라이언트: JSP 페이지는 최종적으로 클라이언트에게 응답을 보냅니다.

이 과정에서 클라이언트는 요청을 보낸 페이지 URL이 변경되었다고 느끼지 않으며, 요청이 서버 내에서 포워딩된 것입니다. URL이 그대로 유지되므로 클라이언트는 페이지 이동을 인지하지 못합니다.

반응형