728x90

JSP & Servlet을 활용한 WEB 개발에 대해서 전체적으로 학습을 진행하는 와중,  Redirect와 foward 개념에 대해서 정리해보고자 한다. 또한 간단한 코드를 통해서 동작 방식이 어떻게 다른지 역시 알아보고자 한다.

 

1. Forward 방식


[ Forward 방식 ]

Forward 방식을 적절한 비유를 통해서 간단하게나마 이해해보자. 

고객을 클라이언트, 상담원을 서버, URL을 통해서 서버의 자원에 접근한다고 생각하시면 된다.

 

 

  1. 고객이 고객센터로 상담원에게 100번으로 전화를 건다.
  2. 상담원은 해당문의 사항에 대해서 전문적인 지식을 갖춘 상담원에게 문의해 답을 얻는다.
  3. 상담원은 고객에게 문의사항을 처리해준다.

 

Forward는 Web Container 차원에서 페이지의 이동만 존재한다. 실제로 웹 브라우저는 다른 페이지로 이동했음을 알 수 없다. 그렇기 때문에 웹 브라우저에는 최초에 호출한 URL이 표시되고, 이동한 페이지의 URL 정보는 확인할 수 없다. 또한 현재 실행중인 페이지와 forward에 의해 호출될 페이지는 Request 객체와 Response 객체를 공유한다. 

 

위와 같이 Foward는 다음으로 이동 할 URL로 요청정보를 그대로 전달한다. 그렇기 때문에 사용자가 최초로 요청한 요청정보는 다음 URL에서도 유효하다. 예를 들어 게시판을 작성하는 과정이라고 할 때, 사용자가 보낸 요청 정보를 이용하여 글쓰기 기능을 수행한다고 할 때, forward를 사용하여 응답 페이지를 부르면 다음과 같은 문제가 발생하게 된다. 만약 사용자가 실수 혹은 고의로 글쓰기 응답 페이지에서 새로고침을 누른다면, 요청 정보가 그대로 살아있기 때문에 요청이 여러 번 전달되어 동일한 게시물이 여러 번 등록될 수 있다. 그렇기 때문에 게시판을 제작하는 과정에서는 시스템에 변화가 생기지 않는 단순 조회 요청(글 목록 보기, 검색)의 경우 forward로 응답하는 것이 바람직하다.

package controller;
 
import java.io.IOException;
 
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 model.MockDAO;
 
@WebServlet("/ForwardTestServlet")
public class ForwardTestServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
       protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //Model과 연동 
           MockDAO dao=new MockDAO();
           dao.register("상품정보");
           //forward 방식으로 이동 
           String path="forward-result.jsp";
           //forward 방식은 기존 request와 response 가 유지된 상태로 이동된다 
           //아래와 같이 request에 정보를 할당할 수 있다 
           request.setAttribute("shareInfo", "검색정보");
           request.getRequestDispatcher(path).forward(request, response);
    }
}

 

 

 

 

2. Redirect 방식


[ Redirect 방식 ]

Redirect를 잘 설명해주는 적절한 비유로 이해를 해보자.

고객을 클라이언트, 상담원을 서버, URL을 통해서 서버의 자원에 접근한다고 생각하시면 된다.

 

  1. 고객이 고객센터로 상담원에게 100번으로 전화를 건다. 
  2. 상담원은 고객에게 다음과 같이 이야기한다. "고객님 해당 문의 사항은 200번으로 다시 문의해주세요"
  3. 고객은 다시 200번으로 문의해 일을 처리한다.

Redirect는 Web Container로 명령이 들어오면, 웹 브라우저에게 다른 페이지로 이동하라고 명령을 내린다. 그러면 웹 브라우저는 URL을 지시된 주소로 바꾸고 해당 주소로 이동한다. 다른 웹 컨테이너에 있는 주소로 이동하며 새로운 페이지에서는 Request와 Response객체가 새롭게 생성된다.

 

Redirect의 경우 최초 요청을 받은 URL1에서 클라이언트에게 redirect할 URL2를 반환하고, 클라이언트에서는 새로운 요청을 생성하여 URL2에 다시 요청을 보낸다. 그러므로 처음 보냈던 최초의 Request와 Response 객체는 유효하지 않고 새롭게 생성되는 것이다. 예를 들어 게시판을 작성하는 과정이라고 할 때, 사용자가 보낸 요청 정보를 이용하여 글쓰기 기능을 수행한다고 할 때, redirect를 사용하여 응답 페이지를 부르면 사용자가 실수 혹은 고의로 글쓰기 응답 페이지에서 새로고침을 누른다고 하더라도, 처음의 요청 정보는 존재하지 않으므로 게시물이 여러 번 등록되지 않는다. 그렇기 때문에시스템에 변화가 생기는 요청(회원가입, 글쓰기 등)의 경우에는 redirection을 사용하는 것이 바랍직하다.

 

package controller;
 
import java.io.IOException;
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 model.MockDAO;
 
 
@WebServlet("/RedirectTestServlet")
public class RedirectTestServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;           
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //모델 연동 
        MockDAO dao=new MockDAO();
        dao.register("상품정보");
        //redirect 방식으로 이동 
        //redirect 방식은 응답시에 클라이언트에게 이동할 url 을 지정해서 클라이언트가 view로 요청하게 하는 방식으로
        //기존 request와 response는 유지되지 않는다 
        //아래 코드와 같이 정보를 공유할 수는 없다 
        request.setAttribute("shareInfo", "검색정보");
        response.sendRedirect("redirect-result.jsp");
    }
}

 

3. 정리


 

우선 Redirect의 경우 URL에 변화가 생긴다. 처음에는 /RedirectTestServlet으로 URL 요청을 하였다면 응답으로 받은 경로인 /redirect-result.jsp로 요청을 다시 보낼 것이다. 따라서 새로운 request, response가 생성이 된다.

 

반면에 Forward의 경우 /ForwardTestServlet으로 URL 요청을 하였다면 서버 내부적으로 Controller가 View에게 작업을 넘기고 View가 JSP 파일을 렌더링하여 결과 페이지로써 클라이언트에게 넘긴다. 이는 클라이언트가 알지 못한다. 따라서 URL 요청이 바뀌는것이 없다. 

 

결론!

DB에 변화를 주는 작업 (회원가입, 게시판 글쓰기등)의 경우 Redirect 방식으로 사용하고,

시스템에 변화가 생기지 않는 작업 (단순 조회, 검색)의 경우 forward 방식이 적합하다.

728x90

'Spring' 카테고리의 다른 글

HttpMessageConverter란?  (0) 2023.02.23
[Spring] Thymeleaf 와 jsp 비교  (0) 2023.02.05
[JAVA] JDBC란?  (0) 2023.01.29
Spring과 SpringBoot 의 정의와 사용 이유  (0) 2023.01.29
스프링이란?  (1) 2023.01.05

+ Recent posts