본문 바로가기
개발 공부/Spring

Redirect와 Dispatcher의 차이점 + RequestDispatcher의 사용

by sngynhy 2021. 9. 26.

서블릿에서 특정 URL이나 페이지로 이동하는 두가지 방식

 

1. Redirect 방식 --> sendRedirect()

  • 웹 브라우저(클라이언트)에 재요청하는 방식
    • 클라이언트의 첫번째 요청이 처리되면 서버는 다음 페이지 경로를 클라이언트에게 요청하고,
      클라이언트는 새로운 페이지를 다시 요청
  • 기존 데이터가 모두 지워진 채로 페이지 이동
  • 포워딩될 때 브라우저의 주소 표시줄의 URL이 변경되고,
    포워딩된 jsp페이지에서는 서블릿에서 request영역에 공유한 속성값에 접근 할 수 없음
    (만일 객체를 전달하거나 데이터를 유지하고자 한다면 세션 등의 단위로 저장이 가능하지만 한계 존재)

 

2. Dispatcher 방식 --> forward()

  • 페이지 이동 시 웹 브라우저(클라이언트)를 거치지 않고 서버에서 서버로 바로 포워딩
  • 따라서 브라우저 주소(URL)는 변경되지 않고 페이지만 변경 (같은 request영역을 공유하게 됨)
  • 클라이언트가 요청하면서 전송한 데이터가 그대로 유지되며, 클라이언트 측에서는 포워드의 진행 여부를 알 수 없음

 

 

RequestDispatcher란?

클라이언트로부터 최초에 들어온 요청을 JSP/Servlet 내에서 원하는 자원으로 요청을 넘기는 역할을 수행하거나,

혹은 특정 자원에 처리를 요청하고 처리 결과를 얻어오는 기능을 수행하는 클래스

즉, /a.jsp로 들어온 요청을 /a.jsp 내에서 RepuestDispatcher를 사용하여 b.jsp로 요청을 보낼 수 있음 -> forward

또는 a.jsp에서 b.jsp로 처리를 요청하고 b.jsp에서 처리한 결과 내용을 a.jsp결과에 포함시킬 수 있음 -> include

(참고> https://sngynhy.tistory.com/100)

 

ServletRequest를 통해 RequestDispatcher 생성하기

서블릿 클래스에서는 service() 메소드나 doGet(), doPost() 등에서

ServletRequest의 하위 클래스인 HttpServletRequest를 파라미터로 받으므로 이것을 이용하여 RequestDispatcher 생성

 

예시)

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	doAction(request, response);
}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	doAction(request, response);
}
	
private void doAction(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {

	/* 1. 클라이언트의 "요청"을 분석하는 함수 == String action = request.getParameter("action"); */
	String uri = request.getRequestURI(); // uri : /FrontController/main.do
	String cp = request.getContextPath(); // cp :/FrontController
	String action = uri.substring(cp.length()); // action : /main/do - 실제 액션값만 추출 -> 유지 보수성 증가
		
	/* 2. control을 매핑하는 역할 == if(action.equals("main")) */
	ActionForward forward = null;
		
	if (action.equals("/main.do")) {
		forward = new MainAction().execute(request, response);
	} else { // 만약 잘못된 action값인 경우 즉, null인 경우 에러 페이지로 연결
		forward = new ActionForward();
		forward.setRedirect(false);
		forward.setPath("/error/errer404.jsp");
	}
		
	/* 3. 클라이언트에게 결과 화면 출력 */
	if (forward != null) { // forward==null이면 위의 액션처리가 제대로 되지 않은 것!
		if (forward.isRedirect()) { // redirect 방식
			response.sendRedirect(forward.getPath());
		} else { // forward 방식 - 요청 헤더를 유지하여 페이지 이동
			// Dispatcher
			// : 클라이언트로부터 최초에 들어온 요청을 JSP/Servlet 내에서 원하는 자원으로 요청을 넘기는 역할을 수행하거나,
			//   특정 자원에 처리를 요청하고 처리 결과를 얻어오는 기능을 수행하는 클래스
			RequestDispatcher dispatcher = request.getRequestDispatcher(forward.getPath()); // 최종 경로
			dispatcher.forward(request, response);
		}
	}
}