웹애플리케이션 개발: 웹 컴포넌트간 공유하는 속성 범위
속성 vs 파라미터
|
속성 (Attribute) |
파라미터 (Parameter) |
타입 |
Application / context Request Session |
Application/Context Request Servlet |
설정 메소드 |
setAttribute(String name, Object value) |
애플리케이션과 서블릿의 초기화 파라미터 값은 런타임 시 설정 불가 (DD에서 설정가능) |
리턴 타입 |
Object |
String |
참조 메소드 |
getAttribute(String name) |
getInitParameter(String name) |
Attribute
각 속성의 접근 범위는 이러한데.. 그래서 각자가 어떻게 쓰이고 있는 것일까?
속성 API 메소드
기본적인 게터, 세터 메소드들~
Object getAttribute(String name)
Void setAttribute(String name, Object value)
Void removeAttribute(String name)
Enumeration getAttributeNames()
Context, Session 생존범위 속성
Thread-safe 처리 필요
- 동일 서블릿 인스턴스 + 다른 스레드
- 다른 서블릿 인스턴스 + 다른 스레드
각 작업은 각 다른 스레드에서 처리되는데, 컨텍스트 속성은 모든 컴포넌트가 공유한다
그래서 컨텍스트 속성은 스레드-안전하지 않다. thread-unsafe
그래서 ServletContext에 get, set 하는 부분에 대해 동기화 락을 걸어놓는다
synchronized (getServletContext()) {
getServletContext().setAttribute("foo", "22");
getServletContext().setAttribute("bar", "42");
out.println(getServletContext().getAttribute("foo"));
out.println(getServletContext().getAttribute("bar"));
}
Session 속성도 같은 서블릿에 대한 요청이 다른 스레드로 처리될 수 있다. (유저가 하나이상의 브라우저를 사용할경우) 이 때는 HttpSession에 속성을 get, set 하는 부분에 동기화 락을 걸어 놓는다.
단, 락, 동기화 블록은 가능한 짧은 시간동안 걸어놓아야합니다!