웹어플리케이션에서 페이지 이동 (redirect VS forword VS include)
서버사이드/클라이언트사이드
클라이언트사이드 - 사용자측에서 처리하는것
- 클라이언트가 입력한것을 수신으로 HTML로 만들어서 크롬과 같은 어플리케이션에 해석해서 표시 (대표적으로 jsp)
서버사이드 - 서버 측에서 즉시 처리하는 것
- 서버사이드는 클라이언트로 보낼 웹 페이지(HTML, JavaScript 등)를 만들며, 정말 중요한 작업들을 수행한다 대표적인 언어는 Java PHP Ruby Python Node.js 등을 언급
서버와 클라이언트는 웹 페이지로 서로 커뮤니케이션을 한다고 볼수있다. 클라이언트 사이드 언어를 다루고 그에 관련된 개발자를 프론트엔드라고 하고 서버 사이드 언어를 다루고 그에 관련된 개발자를 백엔드라고 부른다.
데이터를 Server side로 처리할 시 장단점
(Client side로 처리할 때와 비교)
✅ 장점
서버 관리자의 입장에서 데이터 위조의 가능성을 줄일 수 있다.
서버쪽의 데이터가 확실히 진짜이며 클라이언트 쪽에서 위조해서는 안되는 민감한 데이터의 경우 Server side로 처리해야 한다.
예를들어 인터넷 뱅킹의 이체 관련 처리나 MMORPG의 게임 아이템 관련 처리에서는 Client side로 처리를 최소화해야 한다.
이때 Client 사용자의 입장에서는 클라이언트 컴퓨터의 처리부담이 줄어든다.
❎ 단점
서버 관리자의 입장에서 서버의 처리 부담이 커져 서버 비용이 늘어날 수 있다.
데이터를 Client side로 처리할 시 장단점
(Server side로 처리할 때와 비교)
✅ 장점
서버 관리자 입장에서 서버의 처리부담을 줄여 서버 비용을 줄일 수 있다.
처리하는 데이터가 보안에 민감한 경우, 클라이언트 내에서 처리 가능한 부분에 대해서는 통신에 대비하여 암호화할 필요가 없어져 암호화 소요가 줄어든다.
❎ 단점
서버 관리자의 입장에서 Client side에서 처리한 결과를 되받아야 하는 경우에 결과의 진위성을 알기 어렵다.
이것은 클라이언트 쪽에서 데이터를 위조하기 쉽다는 말과 같다.
서버쪽의 데이터가 확실한 진위이며 클라이언트 쪽에서 위조해서는 안되는 민감한 데이터의 경우 Server side로 처리해야 한다.
클라이언트 사용자에게는 클라이언트 컴퓨터의 처리 부담이 많아진다.
시작하기에 앞서..
우선 3명의 친구들을 살펴보기 전에 우리는 내장 객체에 대한 부분을 알고 있어야한다.
세 친구들이 jsp의 내장 객체 메소드로 있기 때문이다.
짤막하게 설명하자면 redirect는 클라이언트의 요청에 대한 HTTP 응답을 나타내는 객체인 reponse의 메소드이고,
forward와 include는 다른 내장 객체를 얻어내거나 현재 페이지의 요청과 응답의 제어권을
다른 페이지로 넘겨주는데 사용하는 pageContext객체의 메소드다.
redirect 방법으로 이동한 페이지는 이전 페이지와 전혀 데이터를 공유하거나 주고받는 것이 없다.
실제로 데이터를 공유할 수도 없다. 리다이렉트 하게 되면 이동할 페이지로 요청과 응답 객체를 새로 생성하여 전송하기 때문이다.
리다이렉트는 페이지를 재요청하는 것이며, URL을 보면 리다이렉트 시 해당 jsp 파일의 이름으로 변경되어 있을 것이다
.데이터의 이동이 없다면 위와 같은 방법을 사용하면 되지만 우리는 분명 이전의 페이지에 작성 된 데이터를
이동할 페이지로 보내야 할 때가 있을 것이다.
이런 경우에는 pageContext객체의 forword와 include 메소드를 사용한다.
<% pageContext.forward("이동할 페이지.jsp"); %>
<% pageContext.include("이동할 페이지.jsp"); %>
forward는 현재 페이지의 요청과 응답에 관한 제어권을 URL로 지정된 주소( 매개변수 )로 영구적으로 넘긴다.
포워드된 페이지의 요청 처리가 종료 되면 응답도 종료 된다.
리다이렉트처럼 페이지 재요청이 아닌 메소드를 호출하는 것과 같다.
그리고 서버가 자동으로 이동 시켜줌으로써 URL이 그대로이며 데이터만 옮겨진다. (= 데이터 공유, 유지 )
포워드의 사용 방법으로 또 3가지 방법이 있다.
1) jsp 액션 태그 사용 : <jsp:forward page = " 페이지명 ">
2) 내장 객체 사용 : <% pageContext.forward("페이지명"); %>
3) 서블릿 RequestDispatcher 사용
RequestDispatcher dispatcher = request.getRequestDispatcher(forward.getPath());
dispatcher.forward(request, response);
마지막으로 include는 영어로 '포함하다' 뜻을 가지고 있는데 jsp에서도 영어뜻과 비슷한 역할을 하고 있다.
include는 해당 URL로 포워드처럼 제어권을 넘기지만 영구적으로 넘기는 것이 아니라
include된 페이지의 처리가 끝나면 다시 제어권은 원래의 페이지로 돌아온다.
include된 페이지의 내용을 원래 페이지에 삽입하는 것과 같다.
1. Request Dispatch
1) forward : Model2 구조에서 활용. request 처리자와 response 처리자(View)가 분리되는 구조
2) include(내포) : A와 B가 응답에 대한 책임을 나눠갖는 구조,
하나의 페이지가 여러 view layer에 의해 형성되는 모듈화 구조(페이지 모듈화).
HTTP 의 기본 특성 : Connectless(비연결 특성), Stateless(무상태 특성)
// request.getRequestDispatcher("/07/registForm.jsp").forward(request, response);
//1)방법, 내가 가진 리퀘스트랑 이동한 리퀘스트가 같음
request.getRequestDispatcher("/07/registForm.jsp").include(request, response);
include구조 VS forward구조
공통점
1.요청 전달에 사용된다
2. RequestDispatcher를 사용한다
3. 전달될 page에 객체를 전달할수잇다.
차이점
1. request제어권에서 차이가 있다.
Forward의 경우에는 A에서 B로 전달하게 되면 제어권을 다시 A로 전달받지 못한다. 따라서 A에서 처리한 결과 화면이 전혀 보이지 않고 최종 클라이언트 브라우저에서는 B에서 처리한 화면만이 보여지게 된다.
Include의 경우에서는 A에서 include를 하면 B로 제어권을 잠시 빌려주고 처리를 다 하면 다시 A로 제어권을 반납한다. 따라서 클라이언트 화면에서는 A 내용에 B내용이 들어가서 보여진다.
2. include액션은 명시된 page가 부모페이지에 종속적으로 포함되는 형태이며 제어권은 부모페이지에서 유지되지만 forwward액션의 경우 페이지의 제어권이 forward 액션에 명시된 page로 제어권이 이동하면서 페이지 이동이 생긴다.
결과만 생각하면 resp 객체의 sendRedirect와 유사하지만 sendRedirect는 단순히 사용자 용청을 다른 페이지로 보내는것으로 새로운페이지를 위한 req, resp 객체가 생성되지만 forward액션의 경우 원래 요청에 포함된 req, resp 객체가 그대로 전달된다는 차이점이있다.
- 클라이언트는 b의 존재를 모른다는 공통점이있다, 클라이언트 눈에서는 a에서 다 처리하는것처럼 보인다.
- model2에서 많이 활용하는 forward 구조이다.
- 페이징모듈화할때는 include구조를 사용한다.
- 이 두가지 구조는 요청을 딱 한번밖에 안한다는 공통점이 있는데 이 요청을 a와 b가 같이 요청을 한다. 그래서 요청동기방식이라고도 불린다.
-include : a>b>a 구조로 b가 a의 주소로 응답해서 클라이언트눈에서 a에서 다 처리하는 것처럼 보인다.
2. Redirect
1) A 방향으로 요청 발생
2) A에서 클라이언트로 1)요청에 대한 응답 전송(302코드, location-B 헤더, Body가 없음.)
3) location 헤더의 값인 B로 새로운 요청이 발생.
4) body(message)를 포함한 최종 응답 전송
response.sendRedirect(request.getContextPath() + "/07/registForm.jsp");
-redirect구조
-1:1구조로 요청이 나가면 서버사이드에서 없어진다. 요청이 서버사이드에 있다가 응답으로 다 처리하면 없어진다. 따라서 어떤요청을 했는지 모른다.
-요청도 요청을 그대로 전달하거나 완전 새로운 요청으로 전달하거나 두가지 경우가있다.
차이점
- Forward
: 요청이 들어왔을 때 서버상에서 바로 다른 컴포넌트, 다른 자원으로(서블릿->JSP) 이동하는 것(브라우저 안 거침)
: 포워드는 같은 서버사이드에서만 이동할 수 있음.
- Redirect
: 요청이 들어왔을 때 일단 응답하고 다시 요청. 브라우저 거치고 가는 것. 브라우저를 거치면 어떤 서버사이드이든 다 연결될 수 있음.
: 리다이렉트는 다른 서버사이드로도 이동할 수 있음. 컨테이너가 달라도 이동 가능. 완전히 다른 서버사이드의 리소스에 접근 가능.
- 거의 대부분의 페이지가 포워딩을 씀. 그렇다면 신경 써야 할 부분은 언제 리다이렉트를 하는가?
① 정적인 문서로 가야 하는 경우 : 포워딩은 컨테이너 안에서 이루어짐. 동적인 프로그램만 해당된다! 정적인 문서로 이동할 때는 컨테이너 안에서 갈 수 없음. 컨테이너 밖에 있는 웹 서버로 가야 함!! 즉, 브라우저를 거쳐야 하는 경우 == 정적인 문서로 가야 하는 경우.
② 에러 페이지 404 : 에러 페이지 핸들링은 리다이렉트로 해야 함. 에러 페이지는 전부 다 정적인 문서이기 때문
- ServletRequest에 바인딩을 해야 할 경우 포워딩을 써야 한다.
- 클라이언트는 b의 존재를 모른다는 공통점이있다, 클라이언트 눈에서는 a에서 다 처리하는것처럼 보인다.
- model2에서 많이 활용하는 forward 구조이다.
- 페이징모듈화할때는 include구조를 사용한다.
- 이 두가지 구조는 요청을 딱 한번밖에 안한다는 공통점이 있는데 이 요청을 a와 b가 같이 요청을 한다. 그래서 요청동기방식이라고도 불린다.
-include : a>b>a 구조로 b가 a의 주소로 응답해서 클라이언트눈에서 a에서 다 처리하는 것처럼 보인다.
**참고
https://hayden-archive.tistory.com/210
[Servlet] 페이지 이동(Navigation) : Forward / Include / Redirect
페이지 이동을 네비게이션이라고 함. Web 페이지 이동 1. Forwarding(포워딩. 앞으로 간다. 제일 많이 씀. 거의 90%) 2. Redirect Forwarding 방식 - 요청하고 응답하고, 요청하고 응답하면 첫번째..
hayden-archive.tistory.com