[부스트 코스] redirect & forward - BE
리다이렉트(redirect)
- 리다이렉트는 http프로토콜로 정해진 규칙이다.
- 서버는 클라이언트로부터 요청을 받은 후, 클라이언트에게 특정 URL로 이동하라고 요청할 수 있다. 이를 리다이렉트라고 한다.
- 서버에서는 클라이언트에게 응답으로 상태코드를 302와 함께 이동할 URL 정보를 Location 헤더에 담아 전송한다. 클라이언트는 서버로 부터 받은 상태값이 302면 Location 헤더값으로 재요청 보내게 된다. 이때 브라우저의 주소창은 전송받은 URL로 바뀌게 된다.
- 서블릿이나 jsp는 redirect하기 위해서 HttpServletResponse가 가지고 있는 sendRefirect() 메서드를 사용한다.
예제에서, 리다이렉트를 보낼때 서로 다른 객체가 두개 생성이 된다. 한번 요청이 들어오면, 요청 객체와 응답 객체가 생긴다는 것을 기억해 두자.
포워드(forward)
- 웹 브라우저에서 Servlet1에게 요청을 보냄
- Servlet1은 요청을 처리한 후, 그 결과를 HttpServletRequest에 저장
- Servlet1은 결과가 저장된 HttpServletRequest와 응답을 위한 HttpServletResponse를 같은 웹 어플리케이션 안에 있는 Servlet2에게 전송(forward)
- Servlet2는 Servlet1으로 부터 받은 HttpServletRequest와 HttpServletResponse를 이용하여 요청을 처리한 후 웹 브라우저에게 결과를 전송
포워드는 리다이렉트와 달리, 요청 객체와 응답객체가 한번만 만들어진다. 요청을 한번만 보내기 때문이다. url 또한 바뀌지 않는다.
servlet & jsp 연동
서블릿은 프로그램 로직이 수행되기 유리한 구조이다. jsp 에서는 자바코드를 쓰기 위해서 스크립트릿이나 선언문 등을 이용했다. 그러나 서블릿은 그 자체로 자바이기 때문에 jsp 보다 조금 더 편하다. 반면, jsp 는 결과를 출력할 때 서블릿보다 유리하다. 서블릿에서 html 로 응답결과를 내주려면 out.println 에서 문자열로 html 태그들을 다 넣어줬는데, jsp는 그냥 html 태그가 들어가도 상관이 없다.
이런 *서블릿과 jsp의 장단점을 해결하기 위해서, 서블릿에서 프로그램 로직을 수행하고, 결과를 jsp 에서 출력하게 해주도록 하는 것이 필요하다. 즉, 서블릿에서 프로그램 로직을 수행하고, jsp로 포워딩 하면 된다. 이렇게 하는 것을, 서블릿과 jsp의 연동이라고 한다.
예제를 수행해 보았다.
LogicServlet.java 라는 서블릿을 하나 생성시켜 주었고, service 메서드만 오버라이딩 하였다. url은 /logic 으로 매핑하였다.
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
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("/result.jsp");
rd.forward(request, response);
}
v1, v2, 와 result 값을 요청객체의 속성으로 넣어주고, RequestDispatcher 객체를 하나 생성하여 result.jsp로 포워딩 한다.
result.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>
<%
int v1 = (int)request.getAttribute("v1");
int v2 = (int)request.getAttribute("v2");
int result = (int)request.getAttribute("result");
%>
<%=v1 %> + <%=v2 %> = <%=result %>
</body>
</html>
v1, v2, result 값을 찾아와서 출력해주는 역할을 한다.
포워드이기 때문에 실제 요청은 서블릿이 받았고, 요청 결과를 만들어 내는것이 jsp든지 무엇이든지 알 필요가 없다. 따라서, url 도 바뀌지 않는다.
하지만, 이제 점점 출력단에서 자바 코드가 나오게 되면, 디자이너가 수정한다거나 할 대 조금 거부감이 들 수 있고, 점점 편하게 대체할 것들이 없을까? 해서 나온 것이 EL, JSTL 등이 나오게 되는 것이다.
위의 예제로 EL 표기법을 살펴보면,
<body>
${v1} + ${v2} = ${result}
</body>
이런식으로 간편하게 사용할 수 있다.
jsp에서는 이렇게 자바코드를 가능한 줄이는 것이 좋다.
실제 WAS가 로직 서블릿을 실행시킨다. 로직 서블릿이 할 일들을 한 다음에, result.jsp로 포워드 한다. 이 포워드 받은 result.jsp가 응답결과를 만들어서, response 객체를 담아서 웹 브라우저에 응답을 하고있다.