본문 바로가기
events/부스트코스

[부스트코스] 2. DB 연결 웹 앱 | 4. redirect & forward

by kimtahen 2020. 3. 20.
반응형

1. redirect

  redirect 는 HTTP 프로토콜로 정해진 규칙으로, 서버가 클라이언트에게 특정한 URL로의 이동을 요청하는 작업니다. 이때 사용하는 HTTP 상태코드는 302이고, 헤더의 'Location' 값에 이동할 URL을 추가하여 응답하게 된다. 이 상태코드를 받은 브라우저는 헤더의 Location 값으로 서버에 재요청(새로고침)을 한다.

 

  servlet과 jsp는 reidrect 작업에, HttpServletResponse 클래스의 sendRedirect() 메서드를 사용한다고 한다. jsp도 결국에는 servlet으로 변환되기 때문에, servlet에서 사용하는 객체를 그대로 사용할 수 있다. 이를 jsp의 내장객체라고 한다.

 

page1.jsp 와 page2.jsp 를 생성하여, page1.jsp에 요청을 보내면 서버에서 page2로 redirect하도록 해보자. 저번 포스팅을 따라서 jsp 파일을 두개 생성해보자.

 

page1.jsp에는 아래와 같은 코드를 써준다. 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	response.sendRedirect("page2.jsp");
%>

sendRedirect 메서드로 redirect 할 URL을 클라이언트로 전송한다.

 

page2.jsp에는 아래와 같은 코드를 써준다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>page2</title>
</head>
<body>
	<h1>successfully redirected</h1>
</body>
</html>

 

그리고 page1.jsp 에서 Run As - Run on Server 순으로 클릭하여 톰캣 서버를 실행하면

이런식으로 redirect 된 것을 확인할 수 있다.

 

이번에는 eclipse로 톰캣 서버를 실행시켜놓은 상태에서, Chrome 브라우저의 개발자 도구의 Network탭을 실행시켜놓고(F12클릭), 같은 url에 요청을 보내보자.

그러면 

역시나 redirect 된 것을 확인할 수 있고, 또한 page1.jsp, page2.jsp 를 다운로드 한 것을 알 수 있다. 그리고 page1.jsp 의 status 를 보면 302로 되어있는 것을 확인할 수 있다. 

 

정리하자면 

출처: https://www.edwith.org/boostcourse-web/lecture/19878/

redirect는 이 순서대로 작동한다.

 

2. forward

  forward는 한 servlet에서 작업을 수행한 뒤, 또 다른 servlet에 처리를 맡기는 방식을 의미한다. 간단히 도표로 나타내면 아래와 같다. 

언뜻 보면 redirect와 비슷한 개념이라고 느낄 수 있다. 하지만 redirect는 요청을 여러번 보내는 반면, forward는 요청을 한번만 보낸다는 점에서 그 차이가 크다. 그렇기 때문에, redirect는 다른 URL로 요청을 다시 보내서 브라우저의 주소가 변하는 반면 forward는 서버 측에서 처리하는 것이기 때문에 브라우저의 주소가 변하지 않는다.

 

  forward는 하나의 request객체와 response객체를 사용하기 때문에, 다음 sevlet으로 이 두 객체를 전송해주어야 한다. 이번에는 servlet1, servlet2 라는 이름의 서블릿 두개를 생성해서 forward를 수행해보자. Project Explorer에서 작업중인 프로젝트 폴더를 우클릭하여 New - Servlet 순으로 클릭한다. Java package 명은 example로 주고, Class name은 servlet1, 그리고 한번 더 생성할 때는 servlet2를 입력해준다. 그리고 Next를 두번 클릭하면 아래와 같은 창이 뜬다.

여기서는 이렇게 service에만 체크를 해준 뒤 Finish를 클릭한다. 그러면 servlet 파일에는 service 메서드가 생성된다.이와 똑같은 방식으로 servlet2도 생성해준다.

 

servlet1 의 상단에 

import javax.servlet.RequestDispatcher;

RequestDisaptcher 클래스를 임포트 해준다. 그리고 아래와 같은 코드를 작성한다.

protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	System.out.println("this is servlet1");
	String s = "Data from servlet1";
	request.setAttribute("data", s);

	RequestDispatcher requestDispatcher = request.getRequestDispatcher("/servlet2");
	requestDispatcher.forward(request, response);
}

request.setAttribute 메서드를 통하여 request 객체에 data 속성을 설정해주고, s를 값으로 설정해준다. 그리고 RequestDispatcher 클래스를 이용하여 객체를 생성하고 forward 매서드를 사용하여 servlet2에 request, response 객체를 전달한다.

 

servlet2 의 상단에

import java.io.PrintWriter;

PrintWriter 클래스를 임포트 해준다. 그리고 아래와 같은 코드를 작성한다.

protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    System.out.println("this is servlet2");
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    out.println("<html>");
    out.println("<head><title>form</title></head>");
    out.println("<body>");

    String data = (String)request.getAttribute("data");
    out.println("<h1>"+data+"</h1>");
    out.println("</body>");
    out.println("</html>");
}

request.getAttribute 메서드를 사용하여 이전 서블릿(servlet1)에서 설정한 속성(data)의 값을 가져와서 data 변수에 저장한다.

 

servlet1.java를 우클릭하여 Run As - Run on Server 순으로 클릭하여 서버를 실행시키면 아래와 같이 정상적으로 작동하는 것을 확인할 수 있다.

URL은 servlet1 그대로 이지만, Data from servlet, servlet2에서 작성한 코드가 실행되는 것을 확인할 수 있다. Console 탭에서도 this is servlet1, this is servlet2가 표시되며 servlet1과 servlet2 모두 실행된 것을 알 수 있다.

 

3. servlet과 jsp의 연동

  servlet은 로직을 짜는데 유리한 반면 jsp는 html로 작성하기 때문에 웹페이지를 렌더링 하는데 유리하다. 그렇기 때문에, forward를 이용하면 이 둘을 같이 사용할 수 있다. 위의 코드에서는 request.getRequestDispatcher("/servlet2") 를 이용하여 다음 서블릿으로 연결해주었다. 여기서 request.getRequestDispatcher("/page1.jsp")로 바꾸어 준다면 jsp로 forward 작업을 할 수 있다. servlet에서는 데이터를 생성하거나 가져오는 일을하고 이 데이터를 jsp로 전달하는 방식이 이에 해당한다.

 

반응형

댓글