Scope

2020-02-08

해당 Post는 Scope에 대해 정리한 파일입니다.


Servlet과 JSP를 개발하다보면 변수를 많이 다루게 됩니다.

어떤 변수는 웹 어플리케이션에서 공유하고 싶은 변수가 있을 수도 있고, 어떤 변수는 사용자 별로 유지하고 싶은 변수가 있을 수 있습니다.

또 어떤 변수는 포워딩 되는 동안 유지하고 싶은 변수가 있습니다.

이렇게 변수를 어떤 범위 내에서 사용하기 위해서는 스코프(scope)라는 것에 대해서 알아야 합니다.

출처

4가지 Scope

Application : 웹 어플리케이션이 시작되고 종료될 때까지 변수가 유지되는 경우 사용

Session : 웹 브라우저 별로 변수가 관리되는 경우 사용

Request : http요청을 WAS가 받아서 웹 브라우저에게 응답할 때까지 변수가 유지되는 경우 사용

Page : 페이지 내에서 지역변수처럼 사용

Page Scope

PageContext 추상 클래스를 사용한다.

JSP 페이지에서 pageContext라는 내장 객체로 사용 가능 하다.

forward가 될 경우 해당 Page scope에 지정된 변수는 사용할 수 없다.

사용방법은 Application scope나 Session scope, request scope와 같다.

마치 지역변수처럼 사용된다는 것이 다른 Scope들과 다릅니다.

jsp에서 pageScope에 값을 저장한 후 해당 값을 EL표기법 등에서 사용할 때 사용됩니다.

지역 변수처럼 해당 jsp나 서블릿이 실행되는 동안에만 정보를 유지하고자 할 때 사용됩니다.

조금 더 생각해보기..

page scope를 이용하여 사용되는 변수와 지역변수는 거의 유사합니다.

하지만, 앞으로 배울 EL과 JSTL을 이용할 경우에는 구분되어 사용될 경우가 발생합니다.

page scope와 지역변수가 유사하다고 하였는데요. 어떤 부분에서 유사할까요?

페이지 스코프는 해당 페이지내에서만 유효합니다. 지역변수 또한 블록으로 설정된 구역 안에서만 유효합니다.

Request Scope

http 요청을 WAS가 받아서 웹 브라우저에게 응답할 때까지 변수값을 유지하고자 할 경우 사용한다.

HttpServletRequest 객체를 사용한다.

JSP에서는 request 내장 변수를 사용한다.

서블릿에서는 HttpServletRequest 객체를 사용한다.

값을 저장할 때는 request 객체의 setAttribute()메소드를 사용한다.

값을 읽어 들일 때는 request 객체의 getAttribute()메소드를 사용한다.

forward 시 값을 유지하고자 사용한다.

조금 더 생각해보기..

리다이렉트 될 경우에도 request scope를 이용하면 정보를 유지할 수 있을까요?

만약 정보를 유지할 수 없다면 이유가 무엇일까요?

정답은 No.

Redirect를 포함한 요청을 클라이언트가 보내면 서버는 타겟 페이지로 이동을 하라는 응답을 합니다.

응답을 한 후에는 Request객체가 메모리에서 사라지고,

클라이언트는 응답을 받은 페이지로 이동하는 요청을 새로 보내기 때문에 새로운 Request객체가 생성됩니다.

session scope

웹 브라우저별로 변수를 관리하고자 할 경우 사용한다.

웹 브라우저간의 탭 간에는 세션정보가 공유되기 때문에, 각각의 탭에서는 같은 세션정보를 사용할 수 있다.

HttpSession 인터페이스를 구현한 객체를 사용한다.

JSP에서는 session 내장 변수를 사용한다.

서블릿에서는 HttpServletRequest의 getSession()메소드를 이용하여 session 객체를 얻는다.

값을 저장할 때는 session 객체의 setAttribute()메소드를 사용한다.

값을 읽어 들일 때는 session 객체의 getAttribute()메소드를 사용한다.

장바구니처럼 사용자별로 유지가 되어야 할 정보가 있을 때 사용한다.

조금 더 생각해보기..

session scope는 어떤 경우에 이용하는 것이 좋을까요? 예를 한번 생각해보세요.

Session scope는 단번에 끊기는 정보를 넣는 것보다 다음에 시간이 지나서도 계속 쓸 수 있게끔 필요한 정보들을 사용하면 좋을 것같습니다.

로그인 세션도 그렇다고 봅니다.

쿠키의 경우에는 사용자에게 저장하여 다음 페이지에 전달해야 할 값을 갖고 있는다고 보면 이것은 Request Scope와의 비교라고 봅니다.

Application Scope

웹 어플리케이션이 시작되고 종료될 때까지 변수를 사용할 수 있다.

ServletContext 인터페이스를 구현한 객체를 사용한다.

jsp에서는 application 내장 객체를 이용한다.

서블릿의 경우는 getServletContext()메소드를 이용하여 application객체를 이용한다.

웹 어플리케이션 하나당 하나의 application객체가 사용된다.

값을 저장할 때는 application객체의 setAttribute()메소드를 사용한다.

값을 읽어 들일 때는 application객체의 getAttribute()메소드를 사용한다.

모든 클라이언트가 공통으로 사용해야 할 값들이 있을 때 사용한다.