-
Servlet-JSP MVC03 (1) - forward and RedirectWeb/Servlet-JSP 2023. 6. 13. 21:35
클라이언트 요청을 적절히 처리하고 응답하기 위해 현재 페이지를 전환해야할 때가 있다.
특히 MVC패턴에서는 요청받는 페이지와 응답하는 페이지가 다를 수 있기 때문에 페이지 전환이 자주 일어난다.
이러한 웹에서 페이지 전환 기법은 크게 forward기법과 redirect 기법이 있다.
1. forward기법이란?
> 포워드는 Web Container 차원에서 페이지의 이동을 의미한다.
> 웹 브라우저에서는 최초 호출한 URL이 표시되고, 이동한 페이지 URL 정보는 확인할 수 없다.
> 포워딩 호출 페이지와 호출된 페이지는 같은 Reqeust와 Response를 공유한다.
> 단어 그대로 건내주는 것으로 Redirect와는 다르게, 최초 요청과 요청정보가 유지되어 URL에 변화가 없다.
> 단순조회나 검색의 경우 사용하면 좋다.
2. forward기법 사용하기
MVC에서 위의 정의처럼 forward기법을 사용하기 위해서는 크게 두가지 역할을 해줄 객체가 필요할 것이다.
1. 필요한 데이터를 담아서 view로 가져가는 역할
2. 현재 요청 페이지의 request와 response를 전달해주는 역할
첫 번째 역할은 request를 통해 처리할 수 있다.
request는 사용자 요청정보를 담을 수 있을 뿐 아니라, session,Application처럼 임시저장소로 사용할 수 있다.
따라서 사용자의 요청을 받고 모델로 처리한 결과를 request에 담아둘 수 있는데 이를 객체 바인딩이라고한다.
int num = Integer.parseInt(request.getParameter("num")); MemberDAO dao = new MemberDAO(); MemberVO mem_inf = dao.memberContents(num); //객체바인딩 request.setAttribute("mem_inf", mem_inf);
두번째 역할은 requestDispatcher가 담당한다. requestDispatcher 객체는 request를 통해서 얻을 수 있다.
RequestDispatcher rd = request.getRequestDispatcher("/member/memberContent.jsp"); rd.forward(request, response);
forwarding 주소를 넣고, request와 response객체를 함께 넘겨준다. 이를 통해 호출된 페이지는 앞 서 request객체에 담아 두었던 데이터를 꺼내서 사용할 수 있으며, 동일한 response객체를 가지고 있으므로, 요청한 클라이언트에게 정확하게 응답할 수 있다.
//뷰로 넘어온 값을 getAttribute로 꺼내쓰기 <% ArrayList<MemberVO> memberlist = (ArrayList<MemberVO>)request.getAttribute("mlist"); %> //html영역에서 사용 <%= vo.getName() %>
뷰쪽에서는 위와같이 request를 통해 넘어온 값을 꺼내서 사용하면된다.
응답과 요청에 대한 흐름을 살펴보면 다음과 같다.
클라이언트요청 (/*) ->컨트롤러가 요청을 받음(/*) -> 파라미터 수집 및 모델 연동
-> DB를 통해 얻은 결과 VO객체에 담김 -> 이를 request에 객체바인딩 -> requestDispatcher를 통해 view로 forward
-> view에서 해당 데이터를 받아 응답페이지를 만들어서 클라이언트에게 응답
(과정 중 객체를 바인딩하고 클라이언트에게 응답하는 전 과정이 forward 방식이다.)
3. redirect기법이란?
> redirect는 Web Container로 명령이 들어오면, 웹 브라우저에게 다른 페이지로 이동하라고 명령을 내린다.
> forward와는 다르게 웹브라우저상 URL주소가 지정된 주소로 바뀌면서 해당 주소로 이동한다.
> 이동된 새로운 페이지에서는 Request와 Response가 새롭게 생성된다.
> redirect 최초 요청을 받은 URL1에서 클라이언트에게 redirect할 URL2를 반환하고, 클라이언트는
새로운 요청을 생성하여 URL2에 다시 요청을 보낸다.
>시스템에 변화가 생기는 요청은 redirect로 처리하는 편이 좋다.
4. redirect 사용하기
redirect는 새로운 request와 response를 만들기 때문에, 객체바인딩을 통해 데이터를 보낼 수 없으므로,
get방식의 쿼리스트링을 통해 데이터를 전송해야한다.
response.sendRedirect("/MVC03/memberList.do?num=1&name='jj'");
위와 같이 redirect로 넘길 주소를 설정하고 넘겨야할 데이터가 있다면, 쿼리스트링을 통해 넘기면된다.
* forward방식은 단순조회, redirect방식은 변화에 사용해야하는 이유는 새로고침에서 발생할 수 있는 문제 때문이다.
클라이언트가 작업도중 새로고침을 누르면,
forward방식에서는 url의 변화가 없음으로 재요청을 하게 된다.
만약 결제 -> 결제확인 -> 물건리스트보기의 과정에 결제부터 forward방식으로 진행된다고 가정해보자.
이때 클라이언트가 물건리스트를 보는 과정에서 실수로 새로고침을 누르면,
결제를 처리했던 url이 다시 요청되어 컨트롤러가 작동할 것이고, 이에 따라 다시 결제하게되는 불상사가 벌어질 수 도 있는 것이다.
만약 redirect에서 이와같은 상황이 벌어졌다면, redirect는 새로운 url과 요청을 띄우기때문에 물건리스트보기를 다시 요청하게 되었을 것이다.
이와 같은 문제가 발생할 수 있음으로, forward는 사용시 유의할 점이 있다.
참고자료:
나프1탄 (인프런) -박매일
https://www.inflearn.com/course/%EB%82%98%ED%94%84-mvc-1
https://mangkyu.tistory.com/51
https://velog.io/@denmark-choco/HTTPRedirect%EC%99%80-Forward%EC%9D%98-%EC%B0%A8%EC%9D%B4
'Web > Servlet-JSP' 카테고리의 다른 글
Servlet-JSP MVC05 - mybatis 설치 및 기본설정 (0) 2023.06.14 Servlet - JSP MVC03 - JSTL and EL (1) 2023.06.13 Servlet-JSP MVC02(4) - Application,Session,Cookie (0) 2023.06.12 Servlet-JSP MVC02(3) - 내장객체 (0) 2023.06.12 Servlet-JSP MVC02(2) - JSP와 Servlet의 관계 (0) 2023.06.12