티스토리 뷰

Programming/servlet & jsp

scope에 관해

Yizi 2017. 9. 28. 14:43

요청 스코프

서버는 클라이언트의 HTTP 요청이 있을 때마다 javax.servlet.http.HttpServletRequest 인터페이스를 구현한 객체를 생성한다. 특히 이 객체는 요청 스코프(request scope)의 생명주기 동안 객체들을 저장할 수 있는 키/값 속성 쌍들의 컬렉션을 담고 있다. 각 쌍의 키는 문자열이며, 값은 어떠한 형태의 객체든 상돤없다. 다음은 객체를 저장하거나 가지고 올 수 있는 메소드다.

public void setAttribute(String name, Object obj);

public Object getAttribute(String name);

요청 스코프 속성은 removeAttribute() 메소드를 통해 삭제할 수 있다. 그러나 속성의 유효 범위는 요청의 존속 기간 동안이므로 요청 스코프에서는 이러한 제거 방법이 중요하지 않다. 서버는 요청을 처리하면 클라이언트에 응답을 돌려보낸다. 클라이언트는 자신에 되돌아온 요청과 해당 요청의 속성을 더는 이용할 수 없고 JVM의 가비지 컬렉션 대상이 된다.

 

세션 스코프

가시성의 다음 단계는 세션 스코프(session scope)다. 웹 컨테이너는 다중 페이지 요청 시 사용자를 식별하기 위하여 javax.servlet.http.HttpSession 인터페이스를 구현한 객체를 생성한다. 애플리케이션과 컨테이너에서 세션 생성을 처리하며 얼마나 자주 요청을 하는가를 기준으로 사용자의 세션을 일정 시간 동안 유지한다. 세션 객체는 일정 시간이 지나면 소멸된다. 세션 객체의 소멸 시간은 애플리케이션 배치 디스크립터(deployment descriptor)를 통해 설정한다. 세션 객체에 invalidate() 메소드를 호출함으로써 소멸할 수도 있다.

 

세션 스코프는 요청 스코프와 마찬가지로 객체들을 키/값쌍으로 저장하는 것을 허용한다. 세션 스코프와 요청 스코프의 차이점은 지속성이다. 세션 스코프는 다수의 요청에 걸쳐 존재하기 때문에 세션 스코프에 저장된 객체는 요청 스코프에 저장된 객체보다 생명주가기 길다.

 

애플리케이션 스코프

애플리케이션 스코프(application scope) 역시 가시성과 생존주기는 객체에 저장된다. 애플리케이션 스코프 객체는 모든 클라이언트와 발생되는 웹 어플리케이션에서 볼 수 있다. 애플리케이션스코프 객체는 객체가 제거되거나 애플리케이션이 종료할 때까지 살아 남는다. 서블릿 컨테이너는 javax.servlet.ServletContext 인터페이스를 구현한 객체를 생성하고 모든 웹 어플리케이션은 해당 컨테이너 안에 설치한다. 이 객체는 켄테이너가 처음으로 시동될 때 실행된다.

 

요청 스코프와 세션 스코프의 상위 스코프는 ServletContext다. ServletContext는 모든 애플리케이션에서 애플리케이션 객체를 조회하고 저장할 수 있도록 한다. 또한 애플리케이션 객체의 수명은 서버가 살아있는 동안이다.

 

페이지 스코프

마지막으로 JSP 페이지에서 전반적으로 사용하는 페이지 스코프(page scope)다.페이지 스코프에 있는 객체는 각 페이지의 javax.servlet.jsp.PageContext에 저장되고 객체를 생성한 JSP 페이지를 통해서만 접근할 수 있다. 응답을 클라이언트에 보내거나 페이지를 다른 자원에 포워드(forward)하면 해당 객체를 더는 사용할 수 없다.

 

모든 JSP 페이지는 pageContext라는 객체 참조값을 포함한다. 이 참조 값은 JSP가 생성될 때 자동으로 생성된다. pageContext를 통해 페이지 레벨(page-level) 객체를 저장하고 조회할 수 있다. 페이지 스코프 역시 getAttribute(), setAttribute() 메소드를 포함하고 있으며 다른 스코프들과 비슷한 역활을 한다.

댓글