개발입문/Servlet&JSP

웹애플리케이션 개발: 웹 컴포넌트간 공유하는 속성 범위

haloaround 2017. 2. 15. 22:48

속성 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 하는 부분에 동기화 락을 걸어 놓는다.

단, 락, 동기화 블록은 가능한 짧은 시간동안 걸어놓아야합니다!