redirect와 forward
redirect
서버가 클라이언트에게 특정 URL로 이동하라는 요청을 보내는 것을 redirect
라고 합니다.
- 리다이렉트는 HTTP프로토콜로 정해진 규칙
- 서버는 클라이언트에게 HTTP 상태코드 302로 응답하는데 이때 헤더 내 Location 값에 이동할 URL 을 추가, 클라이언트는 리다이렉션 응답을 받게 되면 헤더(Location)에 포함된 URL로 재요청을 보내는데 이때 브라우저의 주소창은 새 URL로 바뀜
- 클라이언트는 서버로부터 받은 상태 값이 302이면 Location헤더값으로 재요청을 보내는데 이때 브라우저의 주소창은 전송받은 URL로 바뀜
- 서블릿이나 JSP는 리다이렉트하기 위해
HttpServletResponse
클래스의 sendRedirect()
메소드를 사용
redirect의 동작
간단하게 a
라는 페이지 요청이 들어오면 b
라는 페이지로 이동하라는 코드를 작성했을 때의 동작순서입니다.
- 웹브라우저가
a
라는 페이지의 요청을 보냄
- WAS는 해당 요청을 받고 302응답코드와 함께
b
페이지로 리다이렉트 요청을 보냄
- 웹브라우저가 WAS의 리다이렉트 요청을 받고
b
페이지를 요청
- WAS는
b
페이지의 결과 출력
결과적으로 b
페이지를 요청하고 결과를 받았기에 주소창에는 처음 요청한 a
의 URL이 아닌 b
의 URL이 적혀있게 됩니다.
이 순서에서 가장 핵심적인 내용은 요청이 여러번 오간다는 것입니다.
(웹브라우저 -> WAS -> 웹브라우저 -> WAS -> 웹브라우저)
요청이 여러번 오가기에 밑에서 설명하는 Scope에서 Request Scope
의 범위를 벗어나게 됩니다.
forward
WAS의 servlet이나 JSP가 요청을 받은 후 그 요청을 처리하다가 추가적인 처리를 같은 웹 어플리케이션 안에 포함된 다른 servlet이나 JSP에게 위임하는 것을 forward
라고 합니다.
forward의 동작

- 웹 브라우저에서 Servlet1에게 요청을 보냄
- Servlet1은 요청을 처리한 후, 그 결과를
HttpServletRequest
에 저장
- Servlet1은 결과가 저장된
HttpServletRequest
와 응답을 위한 HttpServletResponse
를 같은 웹 어플리케이션 안에 있는 Servlet2에게 전송(forward)
- Servlet2는 Servlet1으로 부터 받은
HttpServletRequest
와 HttpServletResponse
를 이용하여 요청을 처리한 후 웹 브라우저에게 결과를 전송
redirect와의 차이
redirect와의 차이는 처음의 request가 끝날 때까지 살아있다는 것입니다.
처음의 request가 끝날 때까지 살아있기에 forward 사용한 경우 객체들이 Request Scope에 머무를 수 있습니다.
그리고 요청을 다시 보내고 응답을 받지 않았기에 처음 요청한 그대로의 URL을 가지고 있습니다.
Scope란
스코프는 객체들의 범위를 의미합니다.
어떤 객체는 특정 페이지에서만 유지하고 싶을 수 있고 또 다른 객체는 어플리케이션 전체에서 유지하고 싶을 수도 있는 것처럼 객체가 어느 범위까지 유지될 수 있는지를 Servlet에서는 4개의 scope로 분류합니다.

- Page: 페이지 내에서 지역변수처럼 사용
- Request: http요청을 WAS가 받아서 웹브라우저에게 응답할 때까지 변수가 유지되는 경우 사용
- Session : 웹 브라우저 별로 변수가 관리되는 경우 사용
- 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()메소드를 사용
- 모든 클라이언트가 공통으로 사용해야 할 값들이 있을 때 사용