코딩 개발/Java

Web 통신 - Forward, Redirect

호소세 2023. 5. 27. 18:18
728x90
반응형

forward & redirect

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를 사용한다니 대단하다고 생각됩니다.

어떤 선배님이 말씀하셨습니다. '최후의 승자는 개발을 잘하는 사람이 아닌 남아서 끝까지 개발을 하는 사람이다.' 포기하지 않고 계속 달려나가다 보면 언젠가 저도 개발자가 되어있겠죠?

반응형