ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 속성, Attribute
    language/Servlet&JSP 2019. 2. 22. 09:11
    반응형

    속성은 servletContext, HttpServletRequest, HttpSession 객체에 바인딩(binding)한 객체를 이야기 합니다. Map과 같은 자료구조에 이름-값 쌍으로 객체를 저장하는 것과 비슷합니다. 마치 게시판에 붙여 놓은 게시물처럼 그 게시판에 접근 가능한 사람은 게시물을 확인하고 쓸 수 있습니다. 그런데 이 servletContext, HttpServletRequest, HttpSession 객체들은 모두 parameter 값을 가지는 객체들입니다. 파라미터와 속성은 어떤 차이가 있는 것인지 알아보겠습니다.


    속성은 context, request, session 객체에 저장됩니다. 이때 servlet은 속성을 갖지 않고 자신이 가진 인스턴스 변수만을 사용합니다. 초기화 파라미터는 배포서술자나 annotation을 이용해서 설정할 수 있고, request parameter의 경우 http request 를 통해서 설정되지만 attribute의 경우 setAttribute() method를 통해서 설정할 수 있습니다.


    속성과 파라미터의 가장 큰 차이점은 속성은 객체를 저장할 수 있지만 파라미터는 읽어들인 설정을 문자열 쌍으로만 저장한다는 것입니다. 이런 점에서 속성은 파라미터보다 좀 더 유연하게 필요한 정보, 객체를 입력, 수정, 삭제 할 수 있다는 것을 알 수 있습니다.



    attribute는 속성 타입에 따라서 각각 접근 범위가 다릅니다. Context 속성은 애플리케이션 내 어디서나 접근이 가능합니다. ServletContext객체는 웹 애플리케이션 시작과 동시에 생성되고 종료될 때 소멸합니다 따라서 context 속성의 생존범위는 애플리케이션이 종료 될 때 까지 입니다. Session은 특정 HttpSession에 접근 권한을 가진 곳에서만 접근 가능합니다. 이 때 Session은 하나의 클라이언트 하나씩 만들어집니다. 다시말해 다른 클라이언트의 session에는 접근할 수 없습니다. request 객체는 요청마다 하나씩 생성되고 이 객체에 접근 가능한 곳에서만 request attribute에 접근 가능합니다. 가령 요청을 처리하는 서블릿이나 JSP 등입니다. 이 객체는 해당 요청에 대한 응답이 모두 끝나고나면 사라지기 때문에 역시 속성값도 사라지게 됩니다.


    그런데 여기서 한가지 문제가 있습니다. parameter의 경우 처음 배포서술자 등을 통해 설정된 값을 변경할 일이 없지만, attribute의 경우에는 조금 다릅니다. 계속 새로운 값이 추가되고 변경될 수 있습니다. 이런 자원은 항상 다중 스레드 환경에서 문제를 발생시킬 여지가 있습니다.


    요청을 처리하는 한 thread에서만 접근하게 되는 httpServletRequest 같은 경우에는 thread-safe하다고 할 수 있습니다. 하지만 모든 thread에서 접근 가능한 ServletContext나 한 클라이언트의 요청을 처리하는 여러 thread에서 접근할 수 있는 HttpSession 객체의 경우는 thread-safe하지 않습니다. session은 한 클라이언트만을 담당하지만 한 클라이언트에서 지난 요청의 응답이 끝나기 전이나 동시에 여러 요청을 하는 경우도 고려 해야 합니다.


    ServletContext객체와 Session 객체를 동기화 해서 이 문제를 해결할 수 있습니다. 위 코드에서 처럼 synchronized block을 사용합니다. 동기화를 사용할 때는 항상 신중을 기해야 합니다. 교착상태가 발생하거나 속도 지연을 발생시킬 수 있기 때문입니다.

    반응형

    'language > Servlet&JSP' 카테고리의 다른 글

    ExecutorService  (0) 2019.02.22
    세션(Session)  (0) 2019.02.22
    ServletContextListener  (0) 2019.02.22
    ServletConfig 서블릿 초기화 파라미터, ServletContext 컨텍스트 초기화 파라미터  (0) 2019.02.22
    redirect / forward  (0) 2019.02.22
Designed by Tistory.