도담이 먹여 살려야하는 집사

SCOPE 본문

카테고리 없음

SCOPE

천재도담 2020. 10. 5. 16:46

Scope 란?

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

http://inheritingjava.blogspot.kr/2011/04/chapter-42-scope-of-javabeans-in-jsp.html

 


Page Scope >> 특정 서블릿이나 JSP가 실행되는 동안에만 정보를 유지하고 싶은 경우

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

Request Scope >> 웹 브라우저로부터 WAS가 요청을 받은 후, 포워드 되는 동안 유지하고 싶은 정보가 있을 경우 

  • http 요청을 WAS가 받아서 웹 브라우저에게 응답할때 까지 변수값을 유지하려고 할때 사용. 
  • HttpServletRequest 객체 사용
  • JSP 에서는 request 내장 변수 사용
  • 서블릿에서는 HttpServletRequest 객체를 사용

값을 저장할 때 : request 객체의 setAttribute() 메소드 사용

값을 읽어올 때 : request 객체의 getAttribute() 메소드 사용

  • forward시 값을 유지하고자 사용

* forward를 하기 전 request 객체의 SetAttribute() 메소드로 값을 설정한 후, 서블릿이나 JSP에게 결과를 전달하여 값을 출력하도록 함 

>> forward되는 동안 값을 유지시키는 것을 Request Scope를 사용함을 알 수 있음. 

 

Session Scope >> 접속한 웹 브라우저별로 정보를 관리 하고 싶을 경우 

  • 웹 브라우저별로 변수를 관리하고자 할 경우 사용
  • 웹 브라우저간의 탭 간에는 세션정보가 공유되기 때문에, 각각의 탭에서는 같은 세션정보를 사용할 수 있음. >> 브라우저에서 여러개의 새로운 탭을 열었을때 첫번째 브라우저에서 로그인이 되어있다면 세번째 같은 브라우저를 열어도 로그인이 되어있는 경우를 말함 

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

JSP >> session 내장변수 사용

>>JSP에서 session.getAttribute() 이런식으로 사용하면 됨.

Servlet >> HttpServletRequest의 getSession()메소드사용  >> session객체를 얻어올 수 있음. 

실제 요청이 들어갔을 때 클라이언트에 대한 정보를 알아야함. >> 세션이 어떤 클라이언트의 것인지 알아낼 수 있기 때문에 request가 세션을 얻어 낼 수 있는 메소드를 가지고 있음

  • 값을 저장할 때 >> session 객체의 setAttribute()메소드 사용
  • 값을 읽어올 때 >> session  객체의 getAttribute()메소드 사용
  • 장바구니처럼 사용자별로 유지되어야 할 정보가 있을 때 사용.  VS 하나의 요청이 들어왔을 때 지금 생기는 것은 Request Scope >>브라우저별로 생김 그래서 어떤 요청이 들어왔을 때 응답이 같고 끝났을 때 request, response객체는 없어지지만 session 객체는 없어지지 않음. request보다는 훨씬 더 오랫동안 정보를 유지함.

>> 어떤 클라이언트 요청 또는 응답을 하고, 어떤 일들을 계속 하는 동안 정보를 계속 유지해주는 scope 

>> 클라이언트마다 하나씩 공간을 가지고 있어서 각 클라이언트마다 유지를 해야 되는 정보들을 session scope를 이용해서 정보를 유지시킴.

Application Scope >> 하나의 웹 어플리케이션에서 공유하고 싶은 변수가 있을 경우 

  • 웹 어플리케이션이 시작되고 종료될 때까지 변수를 사용할 수 있음.
  • ServletContext 인터페이스를 구현한 객체 사용

JSP >> application 내장객체 사용

Servlet >> getServletContext()메소드를 이용하여 application객체를 이용

  • 웹 어플리케이션 하나당 하나의 application객체가 사용됨.
  • 값을 저장할 때 >> application 객체의 setAttribute()메소드 사용
  • 값을 읽어올 때 >> application 객체의 getAttribute()메소드 사용
  • 모든 클라이언트가 공통으로 사용해야 할 값들이 있을 때 사용.

applicationScope01.servlet

response.setContentType() : 응답을 받는 객체가 어떤 타입으로 받는지 설정

PrintWriter out = response.getWriter() : 브라우저상에 출력될 out print객체 만들어주기

 

ServletContext app = getServletContext() :  servletContext객체를 얻어냄 (실제 웹 애플리케이션 영역)

 

애플리케이션 객체에 값을 넣어주기 (app에 넣어줌)

현재 사진상의 applicationScope01서블릿은 애플리케이션에 value값을 맡기는 역할만 함.

application.setApplication("value">> 맡길 객체의 이름,value)

 

applicationScope02.Servlet

appscope01과 역할은 같지만 01에서 얻어온 value =1 값에 +1을 해주는것이 02의 역할

 int value = (int) application.getAttribute("value");

형변환을 해주는 이유 : 처음 01서블릿에서 value값을 맡길때 이부분이 오브젝트로 들어가기 때문에 실제 형변환을 하는 작업을 거쳐야함.

 

>>01이 실행되지 않고 02가 먼저 실행된다면?

01이 실행되지 않았음 >> value값이 설정되어 있지 않음 

02에서는 01의 value값을 무작정 가져오게 되기 때문에 null값을 반환할것임

이럴경우 exception처리를 해주는 것이 좋음.

NullpointerException e

applicationScope01.jsp

  <%
  int value = (int) application.getAttribute("value");
        value = value + 2;
        application.setAttribute("value",value);
  %>

JSP는 application객체의 내장객체를 사용하기때문에 ServletContext를 얻어내서 따로 따로 사용 할 필요없이 바로 application하면 됨.

value가 없었을 때 오류를 발생시킬 수 있기때문에 오류 발생 가능성이 있음 >> exception처리 해주기.

 

다른 클라이언트가 요청을 해도 그 값을 같이 사용함 >> 브라우저가 바뀌었기 때문에 사실 클라이언트가 달라진것 

그러나 applicationScope를 사용하게 되면 이클라이언트에서 저장하고 있던 값을 다른 브라우저의 클라이언트에서도 또 사용하고 있는 것을 볼 수 있음. >> 이 웹 어플리케이션이 다시 시작할때까지 정보가 유지된다!

 

 

Comments