Forward란?
request와 response가 유지되면서 제어가 이동되는 방식입니다.
Web Container 상에서 이동되므로 클라이언트(브라우저) 측은 이동여부를 알 수 없습니다. ( URL 상의 변경이 없음 )
클라이언트가 재동작 즉 재요청(새로고침) 할 경우 request와 response가 유지되므로 기존 동작이 반복됩니다.
주로 정보 조회(select)시 이용됩니다.
그림에서 보면 알 수 있듯이 한 번의 통신이 Server 내에서만 동작이 이루어지고 그 다음에 브라우저에 보내주는 형식입니다.
Redirect 란?
응답시 클라이언트에게 이동할 url을 지정하여 클라이언트가 이동하게 하는 방식입니다.
기존 request와 response 는 유지되지 않습니다.
재요청시 기존 동작은 반복되지 않습니다.
서버 상태변경( insert , delete , update 를 통한 데이터 변경 )에 적합합니다.
브라우저에서 요청을 보내고 서버에서 처리하고 다시 브라우저로 보낸 다음 다시 서버로 보내고 브라우저로 보냅니다.
브라우저 -> 서버 -> 브라우저 -> 서버 -> 브라우저
이런 방식이네요.
예시를 보면서 어떻게 사용하고 사용되는지 확인해봅시다.
예시
일단 index.jsp 파일을 만들고 시작합니다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>model2 mvc</title>
</head>
<body>
<div>
<h4>Model2 MVC Controller에서 View로 제어를 이동하는 방식</h4>
<a href="ForwardTestServlet?id=1">forward 이동방식 테스트</a><br><br>
<a href="RedirectTestServlet?id=2">redirect 이동방식 테스트</a><br><br>
</div>
</body>
</html>
Forward를 위한 servlet과 redirect를 위한 servlet하나를 만들어야합니다.
1. Forward
@WebServlet("/ForwardTestServlet")
public class ForwardTestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("forward");
String path="forward-result.jsp";
String id=request.getParameter("id");
//forward 방식으로 이동하므로 request에 모델과 연동한 정보를 View에 공유 가능
request.setAttribute("news", "db에서 조회한 "+id+" 아이디에 해당하는 뉴스정보");
request.getRequestDispatcher(path).forward(request, response);
}
}
이렇게 하고 forward-result.jsp 로 요청을 보내주면 됩니다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>forward-result</title>
</head>
<body>
<div>
<h4>forward result page</h4>
<%--
forward 방식으로 이동해 기존 request,response 가 유지되어
클라이언트가 보낸 데이터를 받음
--%>
<%=request.getParameter("id") %>
<%--
forward 방식으로 이동하여 Controller Servlet이 공유한 ( request.setAttribute(name) )
정보를 리턴받음
--%>
<br><br>
<%=request.getAttribute("news") %>
</div>
</body>
</html>
request.getRequestDispatcher(path).forward(request, response);
forward 함수는 이렇게 생성합니다.
이렇게 만들고 index.jsp 에서 확인해보면
이렇게 나오는데 새로고침해보면 계속해서 servlet에서 요청을 받아오고 있는 것을 확인할 수 있습니다.
url도 보시면 servlet에 요청을 보내는 url이죠?
2. Redirect
@WebServlet("/RedirectTestServlet")
public class RedirectTestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String id=request.getParameter("id");
System.out.println("Redirect");
String location="redirect-result.jsp";
response.sendRedirect(location);
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>redirect-result.jsp</title>
</head>
<body>
<div>
뉴스 등록 완료
</div>
</body>
</html>
redirect는 response 객체에 담아서 보내주는 형식입니다.
response.sendRedirect(location);
이렇게 해서 index.jsp 파일에서 눌러보면
forward와는 다르게 jsp 파일로 요청을 보내는 형식입니다. 왜냐하면 servlet으로 post를 계속 보내게 되면 새로고침을 하면서 뉴스정보를 무한대로 저장하는 불상사가 나올 수 있기 때문입니다.
새로고침을 눌러보면 java console 창에서 servlet이 실행되지 않는 것을 확인 할 수 있습니다.
소감
누가 만들었는지 참 잘 만들었다고 생각됩니다. get 방식일때는 forward로 계속 불러올 수 있게 하고
데이터 수정 및 추가와 같은 동작을 할 때는 한 번만 이루어져야하니 redirect를 사용한다니 대단하다고 생각됩니다.
어떤 선배님이 말씀하셨습니다. '최후의 승자는 개발을 잘하는 사람이 아닌 남아서 끝까지 개발을 하는 사람이다.' 포기하지 않고 계속 달려나가다 보면 언젠가 저도 개발자가 되어있겠죠?
'코딩 개발 > Java' 카테고리의 다른 글
JSTL 기본 문법 1 (param, getter&is 메서드 접근, if) (0) | 2023.05.29 |
---|---|
JSTL (Jsp Standard Tag Library) (2) | 2023.05.29 |
Singleton (싱글톤 패턴) (2) | 2023.05.27 |
Model 2 Architecture (MVC) (0) | 2023.05.25 |
Model 1 Architecture (3) | 2023.05.25 |