본문 바로가기
Dev. Cookbook/Java, JSP

[java] jsp에서 forward vs redirect, 포워드와 리다이렉트 비교

by breezyday 2023. 11. 28.

Java 기반의 웹 애플리케이션에서 JSP는 forward 혹은 redirect의 두 가지 방법을 사용하여 한 서블릿(Servlet)에서 다른 서블릿 혹은 JSP로 제어를 전달합니다. forward와 redirect는 요청을 전달하지만 완전히 다른 흐름 제어를 사용하고 있습니다. 아래에서 좀 더 상세하게 살펴보겠습니다. 

 

1. Forward와 Redirect 기본 개념

Forward 메서드는 웹 애플리케이션의 한 서블릿에서 다른 리소스로 요청을 전달하며, 이 리소스는 다른 서블릿, JSP 페이지 또는 HTML 파일이 될 수 있습니다. 브라우저로 요청을 전달을 하는 것이 아니라 서버 내의 다른 리소스를 호출합니다.

 

Redirect 메서드는 요청을 브라우저로 전달하여 다른 웹 애플리케이션을 요청합니다. Redirect는 같은 URL을 호출하더라도 request에 있는 정보를 사용하지 않고 새롭게 요청합니다.

 

두 개념을 이해하려면 아래 그림을 보고 이해하는 것이 가장 좋습니다.

 

 

JSP forward 통신

 

Forward는 요청 정보를 WAS 내에서 다른 리소스로 전달합니다. 요청 정보를 함께 전달하여 다른 리소스에서 이를 처리할 수 있습니다. 페이지 이동이 없이 WAS 내부에서 다른 리소스를 호출하기에 속도가 Redirect보다 빠릅니다. 내부에서 forward 하기 때문에 최초 요청한 URL이 변경되지 않습니다.

 

@WebServlet("/myView.do")
public class MyViewServlet extends HttpServlet {
    ...
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
                   throws ServletException, IOException {
        String url = "myViewPage.jsp";  // forward할 url
        
        // 사용자 처리
        
        RequestDispatcher rd = request.getRequestDispatcher(url);
        rd.forward(request, response);
    }
    ...
}

 

Java 서블릿에서 forward 처리를 한 코드입니다.

 

브라우저에서 myView.do로 WAS에 요청을 하면, 해당 요청을 처리하는 MyViewServlet에서 사용자 요청을 처리하고 그 처리 결과를 보여주는 페이지로 forward 하여 추가 request 없이 처리 결과 페이지를 전송합니다.

 

위 코드는 아래와 같이 한 줄로도 작성할 수 있습니다.

 

request.getRequestDispatcher("myViewPage.jsp").forward(request, response);

 

Redirect는 요청을 Web Browser에게 전달하여 새로 요청하게 만듭니다. 덕분에 forward와 달리 WAS 서버와 Web Browser 간에 두 번의 통신이 일어나게 되어 forward보다 속도가 느립니다. 그리고 새로운 URL로 요청하기 때문에 request 정보가 기본적으로 전달되지 않습니다. 그러나 forward와 달리 아래처럼 외부에 있는 다른 서버나 혹은 같은 서버에서도 콘텍스트가 다른 URL에 요청을 redirect 할 수 있습니다.

 

그림은 WAS 서버로 한정하였습니다만, 다른 서비스에 있는 리소스로 요청할 수 있습니다.

 

JSP redirect 통신 : 다른 서버


 

조금 더 Redirect 과정을 상세히 들여다보면 Web Browser에서 WAS로 check.jsp를 요청합니다.

 

처리 결과에 따라서 응답으로 main.jsp로 Redirect 하라고 Response를 보냅니다. 그러면 HTTP 응답 코드 302를 받은 Web Browser는 함께 받은 Location인 main.jsp를 다시 요청합니다.

 

마지막으로 요청을 받은 서버에서 main.jsp를 Response로 결과를 돌려보냅니다.

 

<!-- check.jsp -->
<%
    // 사용자 처리
    
    response.sendRedirect("main.jsp");  // main.jsp로 redirect
    
    // 사용자 처리 계속
%>

 

위의 코드는 redirect의 예제로 그림의 check.jsp 파일에서 처리 과정에서 다른 페이지로 redirect 하는 코드입니다.

 

한 가지 주의할 점은 jsp 코드에서 response.sendRedirect를 호출하더라도 남은 페이지는 계속 실행이 됩니다. 따라서 조건문을 사용하여 남은 코드 수행 중 오류가 발생하지 않도록 처리하거나 페이지 마지막 부분에서 호출해야 합니다.

 

<!-- check.jsp -->
<%
    // 사용자 처리
    
    if (조건식) {
        response.sendRedirect("main.jsp");  // main.jsp로 redirect
    } else {
        // 사용자 처리 계속
    }
%>

 

2. Forward vs Redirect

Forward Redirect
Response 처리의 주체는 WAS
WAS가 Request를 컨텍스트 내부에서 변경하고 다른 리소스에서 응답을 처리. 
Response 처리의 주체는 Web Browser
WAS에서 받은 Response로 새로운 URL을 Request.
One Resource(URL기반: 컨텍스트 내의 JSP, Servlet)
to Other Resource(URL기반: 컨텍스트 내의 JSP, Servlet, HTML 등)
URL기반의 모든 주소
RequestDispatcher.forward( ); HttpServeltResponse.SendRedirect( );
브라우저의 영향을 받지 않음.
웹 컨테이너 내부에서 동작.
request정보가 유지되어 조회할 수 있음.
클라이언트 혹은 브라우저가 처리
URL을 기반으로 새롭게 서버에 요청
비즈니스 로직 처리에 주로 사용 페이지 요청을 다른 페이지로 전환
서버에서 처리하므로 지연이 일어나지 않으며 redirect보다 더 빠름 브라우저가 요청을 처리하므로 상황에 따라 지연이 발생할 수 있음. 
처음 요청 URL이 변경되지 않음 요청 변환에 따라 다른 URL로 변경될 수 있음
같은 컨텍스트에 있는 Resource만 사용 가능 다른 컨텍스트, 다른 서버로 변경 가능

 

 

 

 

참고

http://www.differencebetween.net/technology/difference-between-forward-and-redirect/

https://doublesprogramming.tistory.com/63

 

 

 

댓글