본문 바로가기

Backend/JSP & Servlet

[JSP & Servlet] 페이지 이동 방식 forward와 redirect 방식의 차이

728x90

메소드 호출을 통해 페이지를 이동할 수 있는 방법에는 두가지 방법이 존재한다.

 

은행에 가서 업무를 보는 상황에서 만약에 3번창구로 가서 펀드를 구매하려는 업무를 본다고 가정을 하자. 

내가 3번 창구에가서 업무를 보는데 은행직원이 이렇게 말한다. "여기는 입출금 업무만 보는 곳이예요, 저기 펀드 업무 보는 곳에 가서 처리하세요" 그리고 나는 7번창구인 펀드 업무 보러 간다. 이 상황에서 7번창구 직원에게 다시 무슨 일을 해야 할지 말해야 한다. 이 방식이 바로 페이지 이동방식 중 redirect 방식이라고 볼 수 있다.

 

그런데, 3번창구에가서 펀드를 구매하려는데, 직원이 다른직원을 불러서 그 창구에서 바로 업무를 처리 할 수 있게 된다면 이 방식을 페이지 이동방식 중 forward 방식이라고 보면된다.

 

이 이야기를 기준으로 redirect 방식과, forward 방식에 대해서 구체적으로 설명해 보겠다.

 

* redirect 방식

- url이 변경된다.

- 요청 객체와 응답객체가 유지 되지 않는다.

- 속도가 느리다.

- 새로운 요청객체와 응답 객체를 만들기 때문에 유지가 안된다.

- response.sendRedirect("~"); 를 호출하면 url이 변경되면서 바로 페이지 이동이 발생한다. 

 

* forward방식

- url이 변경되지 않는다.

- 요청 객체와 응답객체가 유지 된다.

- 속도가 빠르다.

- getRequestDispathcher("~"); 을 하면, 바로가지 않고 forward() 메소드를 호출하는 순간에 이동한다.

- request.setAttribute(key,value); 를 통해 세팅하면 받는 쪽에서 키와 값을 받을 수 있다. 

 


공통 코드

@WebServlet("/Destination")
public class Destination extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	protected void processRequest(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter out = response.getWriter();
		
		try{
			out.println("<!DOCTYPE html>");
			out.println("<html>");
			out.println("<head><title>InitParam Servlet</title></head><body>");
			out.println("<h2>Destianation Servlet 입니다. </h2>");
			out.println("<h2>"+ request.getAttribute("myName") +" </h2>");
			String myAge= (String) request.getAttribute("myAge");
			out.println("<h2>"+myAge+"</h2>");
			out.println("</body></html>");
		} finally{
			out.close();
		}
	}
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		processRequest(request, response);
	}

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

 

1) redirect 인 경우, 

@WebServlet("/Source")
public class Source extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected void processRequest(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		
		//forward 방식
		RequestDispatcher view = request.getRequestDispatcher("Destination");
		request.setAttribute("myName", "zeroco");
		request.setAttribute("myAge", "30");
		//view.forward(request,response);
		
		//redirect 방식
		response.sendRedirect("Destination");
		
	}
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		processRequest(request, response);
	}

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

 

redirect 실행결과

url이 변경되고, key와 value가 넘어가지 않았다.

 

2) forward 인 경우,

@WebServlet("/Source")
public class Source extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected void processRequest(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		
		//forward 방식
		RequestDispatcher view = request.getRequestDispatcher("Destination");
		request.setAttribute("myName", "zeroco");
		request.setAttribute("myAge", "30");
		view.forward(request, response);
		
		//redirect 방식
		//response.sendRedirect("Destination");
		
	}
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		processRequest(request, response);
	}

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

 

forward 실행결과

url이 변경되지 않았고, key와 value가 넘어왔다.


 

결론적으로 개발자는 이런 차이를 기준으로 redirect 와 forward방식을 적절히 사용해야 한다.

게시판을 작성한다고 했을 경우, 글쓰기 기능을 수행할 경우에는 redirect 를 사용하는것이 적절하다. 

forward을 사용한다면, 요청 정보가 계속 남아 있게 되어 같은 url에서 똑같은 글들이 반복적으로 등록 될 수 있다.

하지만 redirect는 요청정보가 없으므로 한번만 글쓰기가 시행 될 것이다. 

 

시스템에 변화가 생기는 요청 -> redirect 방식  ex) 로그인, 회원가입, 글쓰기..

시스템에 변화가 생기지 않은 단순조회 -> forward방식  ex) 리스트 보기, 검색...

 

 

참고 

doublesprogramming.tistory.com/63

 

728x90