Servlet의 Scope와 redirect & forward의 차이

안떽왕·2023년 9월 9일
0

redirect와 forward

redirect

서버가 클라이언트에게 특정 URL로 이동하라는 요청을 보내는 것을 redirect라고 합니다.

  • 리다이렉트는 HTTP프로토콜로 정해진 규칙
  • 서버는 클라이언트에게 HTTP 상태코드 302로 응답하는데 이때 헤더 내 Location 값에 이동할 URL 을 추가, 클라이언트는 리다이렉션 응답을 받게 되면 헤더(Location)에 포함된 URL로 재요청을 보내는데 이때 브라우저의 주소창은 새 URL로 바뀜
  • 클라이언트는 서버로부터 받은 상태 값이 302이면 Location헤더값으로 재요청을 보내는데 이때 브라우저의 주소창은 전송받은 URL로 바뀜
  • 서블릿이나 JSP는 리다이렉트하기 위해 HttpServletResponse 클래스의 sendRedirect() 메소드를 사용

redirect의 동작

간단하게 a라는 페이지 요청이 들어오면 b라는 페이지로 이동하라는 코드를 작성했을 때의 동작순서입니다.

  1. 웹브라우저가 a라는 페이지의 요청을 보냄
  2. WAS는 해당 요청을 받고 302응답코드와 함께 b페이지로 리다이렉트 요청을 보냄
  3. 웹브라우저가 WAS의 리다이렉트 요청을 받고 b페이지를 요청
  4. WAS는 b페이지의 결과 출력

결과적으로 b페이지를 요청하고 결과를 받았기에 주소창에는 처음 요청한 a의 URL이 아닌 b의 URL이 적혀있게 됩니다.

이 순서에서 가장 핵심적인 내용은 요청이 여러번 오간다는 것입니다.
(웹브라우저 -> WAS -> 웹브라우저 -> WAS -> 웹브라우저)

요청이 여러번 오가기에 밑에서 설명하는 Scope에서 Request Scope의 범위를 벗어나게 됩니다.

forward

WAS의 servlet이나 JSP가 요청을 받은 후 그 요청을 처리하다가 추가적인 처리를 같은 웹 어플리케이션 안에 포함된 다른 servlet이나 JSP에게 위임하는 것을 forward라고 합니다.

forward의 동작

  1. 웹 브라우저에서 Servlet1에게 요청을 보냄
  2. Servlet1은 요청을 처리한 후, 그 결과를 HttpServletRequest에 저장
  3. Servlet1은 결과가 저장된 HttpServletRequest와 응답을 위한 HttpServletResponse를 같은 웹 어플리케이션 안에 있는 Servlet2에게 전송(forward)
  4. Servlet2는 Servlet1으로 부터 받은 HttpServletRequestHttpServletResponse를 이용하여 요청을 처리한 후 웹 브라우저에게 결과를 전송

redirect와의 차이

redirect와의 차이는 처음의 request가 끝날 때까지 살아있다는 것입니다.
처음의 request가 끝날 때까지 살아있기에 forward 사용한 경우 객체들이 Request Scope에 머무를 수 있습니다.

그리고 요청을 다시 보내고 응답을 받지 않았기에 처음 요청한 그대로의 URL을 가지고 있습니다.

Scope란

스코프는 객체들의 범위를 의미합니다.

어떤 객체는 특정 페이지에서만 유지하고 싶을 수 있고 또 다른 객체는 어플리케이션 전체에서 유지하고 싶을 수도 있는 것처럼 객체가 어느 범위까지 유지될 수 있는지를 Servlet에서는 4개의 scope로 분류합니다.

  1. Page: 페이지 내에서 지역변수처럼 사용
  2. Request: http요청을 WAS가 받아서 웹브라우저에게 응답할 때까지 변수가 유지되는 경우 사용
  3. Session : 웹 브라우저 별로 변수가 관리되는 경우 사용
  4. Application : 웹 어플리케이션이 시작되고 종료될 때까지 변수가 유지되는 경우 사용

Page Scope

특정 servlet이나 JSP가 실행되는 동안 정보를 유지하고 싶은 경우 사용합니다.

  • PageContext 추상 클래스를 사용.
  • JSP 페이지에서 pageContext라는 내장 객체로 사용 가능
  • forward가 될 경우 해당 Page scope에 지정된 변수는 사용할 수 없음
  • 사용방법은 Application scope나 Session scope, request scope와 같음
  • 마치 지역변수처럼 사용된다는 것이 다른 Scope들과 다름
  • jsp에서 pageScope에 값을 저장한 후 해당 값을 EL표기법 등에서 사용할 때 사용
  • 지역 변수처럼 해당 jsp나 서블릿이 실행되는 동안에만 정보를 유지하고자 할 때 사용

Request Scope

웹 브라우저로부터 WAS가 요청을 받은 후, forward 되는 동안 유지하고 싶은 정보가 있는 경우 사용합니다.

  • http 요청을 WAS가 받아서 웹 브라우저에게 응답할 때까지 변수값을 유지하고자 할 경우 사용
  • HttpServletRequest 객체를 사용
  • JSP에서는 request 내장 변수를 사용
  • 서블릿에서는 HttpServletRequest 객체를 사용
  • 값을 저장할 때는 request 객체의 setAttribute()메소드를 사용
  • 값을 읽어 들일 때는 request 객체의 getAttribute()메소드를 사용
  • forward 시 값을 유지하고자 사용

Session Scope

접속한 웹 브라우저별로 정보를 관리하고 싶을 때 사용합니다.

  • 웹 브라우저별로 변수를 관리하고자 할 경우 사용
  • 웹 브라우저간의 탭 간에는 세션정보가 공유되기 때문에, 각각의 탭에서는 같은 세션정보를 사용할 수 있음
  • HttpSession 인터페이스를 구현한 객체를 사용
  • JSP에서는 session 내장 변수를 사용
  • 서블릿에서는 HttpServletRequest의 getSession()메소드를 이용하여 session 객체를 얻음
  • 값을 저장할 때는 session 객체의 setAttribute()메소드를 사용
  • 값을 읽어 들일 때는 session 객체의 getAttribute()메소드를 사용
  • 장바구니처럼 사용자별로 유지가 되어야 할 정보가 있을 때 사용

Application Scope

하나의 웹 어플리케이션에서 공유하고 싶은 변수가 있을 때 사용합니다.

  • 웹 어플리케이션이 시작되고 종료될 때까지 변수를 사용할 수 있음
  • ServletContext 인터페이스를 구현한 객체를 사용
  • jsp에서는 application 내장 객체를 이용
  • 서블릿의 경우는 getServletContext()메소드를 이용하여 application객체를 이용
  • 웹 어플리케이션 하나당 하나의 application객체가 사용
  • 값을 저장할 때는 application객체의 setAttribute()메소드를 사용
  • 값을 읽어 들일 때는 application객체의 getAttribute()메소드를 사용
  • 모든 클라이언트가 공통으로 사용해야 할 값들이 있을 때 사용
profile
이제 막 개발 배우는 코린이

0개의 댓글