서블릿에서 sendRedirect와 RequestDispatcher로 페이지 이동 처리

서블릿에서 sendRedirect와 RequestDispatcher로 페이지 이동 처리

웹 애플리케이션에서 클라이언트의 요청을 처리한 후 다른 페이지로 이동해야 할 때가 있습니다. 이때 서블릿에서는 두 가지 주요 방법을 제공합니다: sendRedirectRequestDispatcher를 통한 포워드입니다. 이 글에서는 리다이렉트와 포워드의 차이점과 각각의 사용 방법을 알아보겠습니다.

1. sendRedirect를 통한 리다이렉트

sendRedirect 메서드는 클라이언트의 요청을 다른 페이지로 리다이렉트할 때 사용됩니다. 리다이렉트를 할 경우, 서버는 클라이언트에게 새로운 URL로 다시 요청을 보내도록 응답하고, 클라이언트는 새로운 URL로 다시 요청을 보냅니다.

  • 클라이언트가 새로운 URL로 요청을 다시 보냄.
  • URL이 변경됩니다.
  • 서버 간의 요청이 아닌 클라이언트-서버 간의 새로운 요청.

sendRedirect 예제

package com.bluesharehub;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/redirectExample")
public class RedirectServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws IOException {
        // "/newPage"로 리다이렉트
        response.sendRedirect("newPage.jsp");
    }
}

newPage.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>New Page</title>
</head>
<body>
    <h1>이 페이지는 리다이렉트 후 도착한 페이지입니다!</h1>
</body>
</html>

위 예제에서 클라이언트가 /redirectExample에 접근하면 서버는 클라이언트에게 /newPage로 다시 요청을 보내도록 응답합니다.

sendRedirect 예제 코드 실행 결과 화면

2. RequestDispatcher를 통한 포워드

RequestDispatcher를 사용한 포워드는 서버 내부에서 요청을 다른 서블릿이나 JSP로 전달할 때 사용됩니다. 포워드는 클라이언트에게 요청을 다시 보내지 않고, 서버 간에 요청을 전달하는 방식입니다.

  • 클라이언트는 다른 페이지로 포워드되었음을 알지 못함.
  • URL이 변경되지 않음.
  • 서버 내부에서 요청이 전달됨.

RequestDispatcher 포워드 예제

package com.bluesharehub;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/forwardExample")
public class ForwardServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // "/targetPage"로 요청을 포워드
        RequestDispatcher dispatcher = request.getRequestDispatcher("/targetPage.jsp");
        dispatcher.forward(request, response);
    }
}

targetPage.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>Target Page</title>
</head>
<body>
    <h1>이 페이지는 포워드된 요청을 처리한 결과입니다!</h1>
</body>
</html>

위 예제에서는 서버 내부에서 /forwardExample로 들어온 요청을 /targetPage로 전달합니다. 클라이언트는 포워드된 페이지로 이동했지만 URL은 여전히 /forwardExample입니다.

RequestDispatcher 포워드 예제 코드 실행 결과 화면

3. 리다이렉트와 포워드의 차이점

리다이렉트포워드
클라이언트가 새로운 URL로 요청을 다시 보냄.서버 내부에서 요청을 처리함.
URL이 변경됨.URL이 변경되지 않음.
클라이언트-서버 간의 새로운 요청.서버 간의 요청 처리.

결론

리다이렉트와 포워드는 각각 다른 시나리오에서 사용됩니다. 리다이렉트는 클라이언트에게 새로운 페이지로 이동하게 할 때, 포워드는 서버 간 요청 처리가 필요할 때 사용됩니다. 이 두 가지 방법을 적절히 활용하면 웹 애플리케이션에서 더욱 유연한 요청 처리가 가능합니다.

함께 보면 좋은 이전 게시글

위로 스크롤