리다이렉트 (redirect)
리다이렉트는 HTTP프로토콜로 정해진 규칙이다.
서버는 클라이언트의 요청에 대해 특정 URL로 이동을 요청할 수 있다. 이를 리다이렉트라고 한다.
서버는 클라이언트에게 HTTP 상태코드 302로 응답하는데 이때 헤더 내 Location 값에 이동할 URL 을 추가한다. 클라이언트는 리다이렉션 응답을 받게 되면 헤더(Location)에 포함된 URL로 재요청을 보내게 된다. 이때 브라우저의 주소창은 새 URL로 바뀌게 된다..
클라이언트는 서버로부터 받은 상태 값이 302이면 Location헤더값으로 재요청을 보내게 된다. 이때 브라우저의 주소창은 전송받은 URL로 바뀌게 된다.
서블릿이나 JSP는 리다이렉트하기 위해 HttpServletResponse 클래스의 sendRedirect() 메소드를 사용한다.
리다이렉트 02로 리다이렉트 요청(응답코드 : 302. Location헤더 값 : redirect02.jsp)
=> 웹 브라우저는 WAS의 리다이렉트 요청을 받고 redirecto02.jsp를 요청
=> redirect02결과 출력 (브라우저의 주소창의 URL주소는 redirect02.jsp로 바뀜)
***리다이렉트를 볼 때는 클라이언트가 요청을 여러 번 보낸 다는 것을 중점적으로 봐야함
요청을 하면 요청 객체와 응답 객체가 생성됨
redirect01이 들어왔을 때 요청 객체, 응답 객체와 다시 redirect02를 요청 할 때 생기는 요청 객체와 응답객체 총 두번의 요청이 필요함
forward란?
요청을 받은 servlet이 받은 요청을 모두 처리하지 않고 일정 부분만 처리하고 나머지 부분을 다른 서블릿한테 넘겨줍니다. 넘겨받은 서블릿은 요청을 처리한 후 웹 브라우저에 결과를 전송합니다. 이를 forward라고 합니다.
forward와 redirect의 차이
redirect는 client에서 받은 요청에 새로운 요청할 곳을 응답으로 알려주면서 다시 요청하도록 하는 것이 리다이렉트 입니다.
-실제로 url주소가 바뀝니다.
포워드는 클라이언트가 서버에 요청을 보내면 서버쪽에서 그 요청에 대해서 혼자 처리하는 것이 아니라 다른 누군가, back한테 처리를 맡깁니다. 이것을 포워드라고 합니다.
-이 때 클라이언트는 혼자서 다 처리했는지 누군가에 부탁했는 지 알 필요가 없고 포워드는 url이 바뀌지 않습니다.***
정리하면 WAS 요청을 받으면 요청을 담당하는 request 객체와 응답을 담당하는 response 객체를 만듭니다. 그런데 포워드의 경우는 이 두 객체가 한 번만 만들어 지지만 리다이렉트 같은 경우는 요청이 여러 번 왔다 갔다 합니다.
request, response 객체는 WAS의 서블릿에서 처리한 결과가 보내지기 전까지 계속 유지 되기 때문에 각 서블릿에서의 결과를 다른 서블릿에서도 처리할 수 있습니다. 즉 forward의 경우 servlet1에서 먼저 처리하고 servlet2에서 또 처리해야 하기 때문에 servlet1의 결과를 request객체에 저장하여 servlet2에서 결과 처리가 가능합니다.
웹 브라우저에서 LoginServlet에게 요청을 보냄
LoginServlet은 요청을 처리한 후, 그 결과를 HttpServletRequest에 저장
LoginServlet은 결과가 저장된 HttpServletRequest와 응답을 위한 HttpServletResponse를 같은 웹 어플리케이션 안에 있는 HelloServlet에게 전송(forward)
HelloServlet는 LoginServlet으로 부터 받은 HttpServletRequest와 HttpServletResponse를 이용하여 요청을 처리한 후 웹 브라우저에게 결과를 전송
정리
- URL의 변화가 필요하다면, 다른 페이지로 이동한다면 Redirect
- 객체를 재사용하거나 공유해야한다면 Forward를 사용하는 것이 좋습니다.(+URL의 변화 없음)
Servlet과 JSP연동
Servlet은 프로그램 로직이 수행되기에 유리하다. IDE 등에서 지원을 좀 더 잘해준다.
JSP는 결과를 출력하기에 Servlet보다 유리하다. 필요한 html문을 그냥 입력하면 됨.
프로그램 로직 수행은 Servlet에서, 결과 출력은 JSP에서 하는 것이 유리하다.
Servlet과 JSP의 장단점을 해결하기 위해서 Servlet에서 프로그램 로직이 수행되고, 그 결과를 JSP에게 포워딩하는 방법이 사용되게 되었다. 이를 Servlet과 JSP연동이라고 한다.
sevlet은 java언어기준 jsp는 html언어 기준
servlet (forwarding =>) JSP
클라이언트가 로직 서블릿을 요청
=> WAS가 로직 서블릿을 실행
=> jsp로 포워딩
=> 포워딩을 받은 jsp가 응답 결과를 만들고 응답 결과를 response에 담아 클라이언트에 응답
'백엔드' 카테고리의 다른 글
REST API (0) | 2021.11.28 |
---|---|
Maven , Gradle (0) | 2021.11.16 |
JSP 개념 (0) | 2021.08.21 |
Servlet (0) | 2021.08.15 |
Mysql 기초 명령어 (0) | 2021.08.06 |