ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Servlet] Scope 단위 (Application, Session, Request, Page)
    JAVA 2022. 7. 12. 18:00

     

     

    서블릿에서는 데이터를 서블릿 속성에 등록해놓고 공유할 수 있는데,

    이 때 공유범위로 4가지 Scope가 있다.

     

    Scope 설명
    Application Scope 가장 긴 범위. WAS가 살아있는 동안 유지된다.
    Session Scope 하나의 세션동안 유지된다. 브라우저를 종료하면 파괴된다.
    Request Scope 하나의 요청이 일어나서 응답이 완료될 때까지 유지된다.
    Page Scope JSP에서 사용되고, 페이지단위에서만 유지된다. 가장 짧은 범위

     

     


     

    1. Application scope

     

    어플리케이션 스코프에 데이터를 올려두면 WAS(ex. Tomcat)이 살아있는 동안엔 계속 유지된다.

    서블릿 어디서든 해당 데이터를 가져다 사용할 수 있다.

     

    ...
    @Override
    protected void Service(HttpServletRequest req, HttpServletResponse res)
    	throws ServletException, IOException {
        
        // Application Scope에 데이터 등록
        req.getContextServlet().setAttribute("공유데이터이름", 데이터);	
        // 또는
        ServletContext sc = req.getContextServlet();
        sc.setAttribute("공유데이터이름", 데이터);
        
        // Application Scope에 있는 데이터를 불러올 때
        req.getContextServlet().getAttribute("공유데이터이름");
    
    } // service
    ...

     

    ServletContext객체를 직접 생성한 후 setAttribute()메소드로 등록해도 되고, request객체에서 서블릿콘텍스트 객체를 얻어온 후 사용할 수 있다.

    getAttribute를 통해 얻어온 데이터는 Object타입으로 반환되기 때문에, 등록한 데이터타입에 맞게 Casting해서 사용하면 된다. (모든 스코프 동일!!)

     

    ex) 데이터가 문자열(String)일 때,

    String str = (String) req.getServletContext().getAttribute("공유데이터 이름");

     


    2. Session Scope

     

    세션 스코프는 두번째로 긴 범위로, 하나의 세션이 종료될 때까지 데이터가 유지된다.

     

     

    ...
    @Override
    protected void Service(HttpServletRequest req, HttpServletResponse res)
    	throws ServletException, IOException {
        
        // Session Scope에 데이터 등록
        req.getSession.setAttribute("공유데이터이름", 데이터);	
        // 또는
        HttpSession sess = req.getSession();
        sess.setAttribute("공유데이터이름", 데이터);	
        
        // Session Scope에 있는 데이터를 불러올 때
        req.getSession().getAttribute("공유데이터이름");
    
    } // service
    ...

     

    HttpSession객체를 직접 생성해서 등록할 수도 있다.

    세션은 최초의 요청이 들어오면 고유한 SessionID를 가지는 세션이 생성되고, 브라우저가 종료되기 전까지 유지된다.

    브라우저를 종료하지 않아도 보통 타임아웃을 설정해두기 때문에 지정한 시간이 초과되면 자동으로 파괴된다.

     

    세션의 타임아웃설정은 web.xml파일에서 한다.

    <!-- session timeout 지정 단위 : 분단위-->
    <session-config>
    	<session-timeout>30</session-timeout>
    </session-config>

    session-config태그 안에 session-timeout으로 지정할 수 있다. 단위는 분단위이다.

     

     


    3. Request Scope

     

    리퀘스트 스코프는 하나의 요청에 대한 공유데이터 속성이다. 해당 요청에 대해 응답이 완료되면 파괴된다.

     

    ...
    @Override
    protected void Service(HttpServletRequest req, HttpServletResponse res)
    	throws ServletException, IOException {
        
        // Request Scope에 데이터 등록
        req.setAttribute("공유데이터이름", 데이터);	
        
        // Request Scope에 있는 데이터를 불러올 때
        req.getAttribute("공유데이터이름");
    
    } // service
    ...

     

    request객체 내에서 바로 속성을 등록할 수 있다. 

    범위가 응답이 완료될 때까지기 때문에 포워드 방식에서는 데이터를 불러올 수 있지만, 리다이렉트 방식으로 페이지를 이동했을 경우 데이터를 불러올 수 없다. (기존 요청을 종료하고 새로운 요청이 생성되기 때문에)

     


    4. Page Scope

     

    JSP 내에서 PageContext객체를 사용해서 등록할 수 있다.

    범위가 페이지 단위로 가장 짧기 때문에, 지역변수랑은 다르지만 거의 지역변수처럼 사용된다.

    어떤 경우에서든 페이지 이동이 일어난다면 데이터를 불러올 수 없다.

     

    <%
    	pageContext.setAttribute("공유데이터이름", 데이터);  
        
    	pageContext.getAttribute("공유데이터이름"); 
    %>

     

     


     

    RemoveAttribute()

     

    removeAttribute()메소드를 이용하면 스코프 범위 내에 있어도 직접 속성을 제거할 수 있다.

     

    req.removeAttribute("공유데이터이름");

     

     


     

    수행해야 하는 비즈니스 로직에 따라, 알맞은 스코프를 사용하는 것이 중요하다.

    댓글

Designed by Tistory.