[Servlet & JSP] Redirect vs forward 방식 비교
[Servlet & JSP] Redirect vs forward 방식 비교
현재 JSP & Servlet을 활용한 WEB 개발에 대해서 전체적으로 학습을 진행하고 있습니다. 그중에서 Redirect와 foward 개념에 대해서 정리해보고자 합니다. 또한 간단한 코드를 통해서 동작 방식이 어떻게 다른지 역시 알아보고자 합니다:)
이번에 살펴볼 코드의 WEB 프로젝트의 구조는 아래와 같습니다. 시작은 index.jsp에서 부터 시작을 합니다. <a> 태그의 경로 지정을 통해서 Controller를 담당하고 있는 Servlet 파일명을 지정해 주었습니다. Controller에서 View(forward-result.jsp, redirect-result.jsp) 까지 어떤 방식으로 이동하는지 흐름을 살펴보겠습니다.
위 사진을 통해서 웹 프로젝트가 어떤 파일과 패키지로 구성되어있는지 확인 할 수 있습니다.
0. 초기화면 index.jsp
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>forward redirect 이동방식</title>
</head>
<body>
<a href="ForwardTestServlet"> forward 이동방식 테스트 </a><br><br>
<a href="RedirectTestServlet"> redirect 이동방식 테스트</a><br><br>
</body>
</html>
|
1. Redirect 방식
Redirect 방식에 관해서 살펴 보기전에 Redirect를 잘 설명해주는 적절한 비유가 있어 이를 소개하고 본격적으로 살펴보겠습니다. (이 글에 대한 참고는 밑에 표시해 두었습니다.) 고객을 클라이언트, 상담원을 서버, URL을 통해서 서버의 자원에 접근한다고 생각하시면 됩니다.
- 고객이 고객센터로 상담원에게 100번으로 전화를 건다.
- 상담원은 고객에게 다음과 같이 이야기한다. "고객님 해당 문의 사항은 200번으로 다시 문의해주세요"
- 고객은 다시 200번으로 문의해 일을 처리한다.
1-1. Redirect 방식 소스코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
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");
}
}
|
Redirect의 동작과정은 다음과 같습니다. <a> 태그의 href 속성을 통해서 Controller인 서블릿명을 지정해주었습니다. Controller와 DAO간의 데이터를 주고받고 (DAO는 DB와의 Connection을 통해서 데이터를 주고받습니다. 이 예제에서는 DAO의 역할을 생략하였습니다.) 그 후 View를 담당하는 jsp 파일이 화면 최종적으로 클라이언트에게 보여줄 화면을 담당합니다.
Redirect 방식의 전체적인 구조는 위와 같다. 그렇다면 코드를 하나 하나 분해해서 어떻게 동작하는지 살펴보자!
초기화면인 index.jsp 페이지에서 <a> 태그로 감싸진 redirect 이동방식 테스트를 누르면 서버로 URL /RedirectTestServlet 요청을 할 것이다. 하지만 Servlet에서 내부적으로 redirect 방식으로 응답을 할 것이기 때문에 응답으로서 경로를 보낸다. ( 경로: redirect-result.jsp 서버로 해당 파일을 요청하도록 해당 경로를 Response Header에 넣어서 보낸다.) 이때 요청을 보냄과 동시에 WAS에서는 request, response가 만들어진다.
밑의 사진은 구글 크롬의 F12 개발자 도구를 통해서 어떤 메시지를 주고 받았는지에 대한 내용이다. 헤더의 Location에 파일을 알려준 것이다. 즉 "고객님 해당문의 사항은 200번으로 다시 문의해주세요" 에 해당한다!!
이제 서버로부터 경로를(전화번호) 얻었으니 다시 URL 요청을 보낼 것이다. 이에 대한 응답으로. jsp 파일을 렌더링 한 결과 페이지가 클라이언트로 전송되는 것이다. 이에 대한 흐름은 아래의 그림과 같다. 중요한 것은 처음 했던 요청과는 별개의 요청이다. 즉 새로운 request, response가 생성되는것이다.
2. Forward 방식
Forward 방식 또한 적절한 비유를 통해서 간단하게나마 이해해보자.
- 고객이 고객센터로 상담원에게 100번으로 전화를 건다.
- 상담원은 해당문의 사항에 대해서 전문적인 지식을 갖춘 상담원에게 문의해 답을 얻는다.
- 상담원은 고객에게 문의사항을 처리해준다.
2-1. Forward 방식 소스코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
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);
}
}
|
cs |
초기화면인 index.jsp 페이지에서 <a> 태그로 감싸진 forward 이동방식 테스트를 누르면 서버로 URL /ForwardTestServlet 요청을 할 것이다. 하지만 Servlet에서 내부적으로 forward방식으로 응답을 할 것이기 때문에 경로를 response로 보내는것이 아닌 내부적으로 이 작업을 위임할 것이다. 즉 forward-result.jsp로 forward 할 것이다. 상세하게 살펴보자.
위의 슬라이드를 통해서 /ForwardTestServlet 요청이 들어오면 Controller는 View에게 Forward로 작업을 위임할 것이다. 또한 코드에서 볼 수 있듯이 request.setAttribute() 함수를 통해서 request에 정보를 할당하였다. 또한 forward 방식은 기존의 request, response가 유지가 되기 때문에 View에서 앞선 request, response를 공유하기 때문에 할당된 정보 또한 사용할 수 있다.
3. 정리
이 두 방식에 대해서 어떻게 동작하는지를 간단하게 살펴보았다. 그렇다면 2개의 차이점이 뭔지 살펴보도록 하자. 우선 Redirect의 경우 URL에 변화가 생긴다 처음에는 /RedirectTestServlet으로 URL 요청을 하였다면 응답으로 받은 경로인 /redirect-result.jsp로 요청을 다시 보낼 것이다. 따라서 새로운 request, response가 생성이된다. 반면에 Forward의 경우 /ForwardTestServlet으로 URL 요청을 하였다면 서버 내부적으로 Controller가 View에게 작업을 넘기고 View가 JSP 파일을 렌더링하여 결과 페이지로써 클라이언트에게 넘긴다. 이는 클라이언트가 알지 못한다. 따라서 URL 요청이 바뀌는것이 없다. 그렇다면 각각의 방식들이 어디에 활용이 될까? DB에 변화를 주는 작업 (회원가입, 게시판 글쓰기등)의 경우 Redirect 방식으로 사용하고 시스템에 변화가 생기지 않는 작업 (단순 조회, 검색)의 경우 forward 방식이 적합하다.
참고자료
https://doublesprogramming.tistory.com/63