본문 바로가기
lang/java web

[Boostcourse] DB 연결 웹 - 4. Redirect & Forward

by Wordbe 2019. 11. 19.
728x90

Redirect, Forward - BE

1. Redirect

게시판 글 작성을 예로들어봅시다.

글을 모두 작성한 후에 글 작성 버튼을 클릭하겠죠?

이 때 클라이언트가 서버에게 글을 작성해주세요 라는 요청을 보내게 됩니다.

서버는 해당 글을 저장한 후, 웹 브루어제게 글 목록으로 이동하라고 응답을 보내게 됩니다.

웹 브라우저는 서버의 요청을 받은 후, 자동으로 서버에게 글 목록을 요청하여 응답받습니다.

서버가 클라이언트에게 어떤 URL로 이동하라는 요청을 보내는 것이 redirect라고 합니다.

  • HttpServletResponse
  • sendRedirect()

리다이렉트(redirect)

  • 리다이렉트는 http프로토콜로 정해진 규칙입니다.
  • 서버는 클라이언트의 요청에 대해 특정 URL로 이동을 요청할 수 있습니다.(redirect)
  • 서버는 클라이언트에게 http 상태코드 302로 응답하고, 헤더 내 location 값에 이동할 URL을 추가합니다.
  • 클라이언트는 서버로부터 redirection 응답을 받아 상태값이 302이면 헤더(location)에 포함된 URL로 재요청을 보내게 됩니다. 이 때 브라우저 주소창은 새 URL로 바뀌게 됩니다.
  • 서블릿이나 JSP는 리다이렉트하기 위해 HttpServletResponse 클래스의 sendRedirect() 메소드를 사용합니다.

실습

웹 브라우저가 redirect01.jsp을 요청

redirect01은 redirect02.jsp로 리다이렉팅하는 로직을 실행

결과 확인

redirect01.jsp

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

redirect02.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    redirect된 페이지 입니다. ^^
</body>
</html>

redirect01.jsp 실행 --> 웹 브라우저에서 URL이 redirect01에서 redirect02로 바뀌고 redirect02의 화면이 나타납니다.

redirect01 클라이언트 객체가 서버에서 리다이렉트 요청,

웹브라우저는 응답코드 302, 헤더 location값을 받고, redircet02.jsp를 요청

redirect02 클라이언트 객체가 서버에 다시 요청, 결과 출력

2. Forward

이 시점에서 client, Web server, WAS 의 모식도를 다시 한 번 보고 갑시다.

대표적인 web server는 http 요청을 처리할 수 있는 http 웹서버입니다. (apache)

​ 클라이언트가 GET, POST, DELETE 등의 메서드를 이용해 요처을 하면 웹서버가 응답합니다.

​ 정적으로 데이터를 처리하여 빠르고 안정적입니다.

WAS는 웹서버와 웹 컨테이너의 결합으로 다양한 역할을 수행합니다. (대표적으로 tomcat)

​ 동적으로 데이터를 처리하는 서버입니다.


Forward

WAS의 서블릿이나 JSP가 요청을 받은 후, 요청을 처리하다가 추가적인 처리를 위해 같은 웹 어플리케이션안에 포함된 다른 서블릿이나 JSP에게 위임하는 경우가 있습니다.

이를 forward라고 합니다.

  • RequestDispatcher
  • forward()

  • 웹 브라우저에서 Servlet1에게 요청을 보냄
  • Servlet1은 요청을 처리한 후, 그 결과를 HttpServletRequest에 저장
  • Servlet1은 결과 저장된 HttpServletRequest와 응답을 위한 HttpServletResponse를 같은 웹 어플리케이션 안에 있는 Servlet2에게 전송(forward)
  • Servlet2는 Servlet1으로 부터 받은 HttpServletRequest와 HttpServletResponse를 이용하여 요청을 처리한 웹 브라우저에게 결과를 전송

실습

FrontServlet, NextServlet

http://localhost:8080/firstweb/front

위의 URL이 호출되면 FrontServlet이 실행.

FrontServlet에서는 랜덤한 주사위 값 구하고, 그 값을 NextServlet에게 forward

NextServlet에서는 FrontServlet으로부터 전달받은 주사위 값만큼 "hello"를 출력

forward는 redirect와 달리 URL이 바뀌지 않습니다.

FrontService.java

protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        int diceValue = (int)(Math.random() * 6) + 1;
        request.setAttribute("dice", diceValue);

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

NextSevlet.java

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

        int dice = (Integer)request.getAttribute("dice");
        out.println("dice : " + dice);
        for (int i=0; i<dice; ++i) {
            out.print("<br>hello");
        }
        out.println("</body>");
        out.println("</html>");
    }

3. Servlet & jsp 연동

서블릿과 JSP는 상호 보완적 관계를 가지고 있습니다.

서블릿은 로직을 구현하기 알맞지만, HTML을 출력하기에 불편합니다.

반면, JSP는 로직을 구현하는 것은 불편하지만, HTML을 출력하기에 편리합니다.

forward를 통하여 servlet과 jsp를 연동하여 각 장점을 사용해봅시다.

  • forward
  • request.setAttribute()
  • request.getAttribute()

Servlet과 JSP연동

  • Servlet은 프로그램 로직이 수행되기 유리합니다. IDE 등에서 좀 더 지원됩니다.
  • JSP는 결과를 출력하기에 Servlet보다 유리합니다. html문을 그냥 입력하면 됩니다.
  • Servlet --> JSP 포워딩 - Servlet과 JSP 연동

실습

LogicServlet에서 1~100 random 값 2개와 그 값의 합을 구한 후, 그 결과를 result.jsp 에게 포워딩하는 방법으로 전송하여 결과를 출력

LogicServlet.java

protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        int v1 = (int)(Math.random() * 100) + 1;
        int v2 = (int)(Math.random() * 100) + 1;
        int result = v1 + v2;

        request.setAttribute("v1", v1);
        request.setAttribute("v2", v2);
        request.setAttribute("result", result);

        RequestDispatcher rd = request.getRequestDispatcher("/jsp/result.jsp");
        rd.forward(request, response);
    }

result.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Result</title>
</head>
<body>
<%
    int v1 = (int)request.getAttribute("v1");
    int v2 = (int)request.getAttribute("v2");
    int result = (int)request.getAttribute("result");
%>
<%=v1 %> + <%=v2 %> = <%=result %>
</body>
</html>

forward했으므로 URL은 바뀌지 않습니다.

JSP에서는 가독성을 위해 java코드를 줄이는 것이 좋습니다.

그래서 JTL, EL 문법 등을 이용합니다.

${v1 } + ${v2 } = ${result }

다음과 같이 바꾸어도 위와 결과가 같습니다.


reference

https://www.edwith.org/boostcourse-web/lecture/16708/

728x90

댓글