ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자바 HttpSessionListener 정리
    Java(자바) 2015. 7. 7. 11:17

    우선 HttpSessionListener 인터페이스가 무엇을 의미하는지 알고 시작하자구요.



    HttpSessionListener 이란 라이프 사이클 변경에 대한 통지를 받기 위한 이벤트 인터페이스 입니다.

    해당 인터페이스가 계속 하여 세션 생성 및 삭제 되었다는 것을 감지 하기 위해서는 

    배치 디스크립터에 설정을 하여야 하는데 다음과 같이 적용하면 된다.


    web.xml)


    listener 은 설명을 안해줘도 대부분 알거라고 생각이 듭니다만... 혹시 모르는 분들을 위해 간략히 설명을 하자면


    listener : 어떠한 이벤트가 발생하였을때 호출되어 처리하는 객체를 의미합니다.


    인터페이스를 implements로 기능을 추가 할경우 (extends는 자식클래스가 부모클래스에게 상속받았을때 입니다) 

    SessionMonitoring  부분에 빨간줄이 생길 것입니다. 



    Add unimplemented methods 를클릭하여 메소드를 추가하면 에러가 사라지면서 




    sessionCreated 와 sessionDestroyed 가 만들어 집니다. 

    이 두가지 메서드를 간략히 설명하자면 리스너가 계속 감지하고 있다가 세션 생성 및 세션 무효화에 따라 각각의 메서드를 실행하게 됩니다.


    각각의 환경 및 사용목적에 따라 해당 메서드를 사용하는 용도가 달라질텐데요.

    저는 특정(/경로인 메인 페이지)에 클라이언트가 접근 시 Model 부분 에서 Session을 

    setAttribute() 메서드와 setMaxInactiveInterval()를 사용하여 생성되도록 구현 하여 실시간 방문자 카운터를 증가시켰습니다. 

    그리고나서 세션이 끊어졌을 시 sessionDestroyed() 메서드로 끊어졌다는 것을 감지하여 카운터를 

    감소시키는 로직을 구현하였습니다.



    session이 끊어졌을 경우 getOutGuest() 메서드를 호출해주는 부분은 아래에 있습니다





    이때  Out of Memory 메모리 부족현상이 발생하여 에러를 발생시키게 되었는데... 

    그 이유는 세션 생성 및 무효화 상태를 계속 체크해주는 HttpSessionListener가 메모리에 올라와 있는 상태에서 MyConnection()으로 생성자를 계속 만들어 주었기 때문입니다. 쉽게 말하면... 클라이언트가 한명이 아닌 다수의 사용자였을 경우 하나의 함수를 계속하여 사용하기 때문에 네트워크 트래픽 빈도수가 높아짐 과 동시에 에러로 인해 커밋되지 않던 데이터가 뻥나버리는 것이죠..



    그림 엄청 못그리죠.... 죄송하네요... 말을 너무 어렵게 하는거 같아서 위의 그림처럼 설명을 해보고 싶었습니다 ㅎㅎ 

    메모리 릭 해결 방안 : Global에 MyConnection을 null 처리 시켜놓고 deathSession() 를 호출할때마다

    new로 인스턴스화 시키면 끄읏 ㅎㅎ



    위에 처럼 사용할 경우 어떻게 되는지 그려 보겠습니다..




    처음에 널이 였지만 deathSession() 호출 시 null 부분이 객체로 되어있다가 다른 클라이언트에 의해 이벤트가 발생되면 객체로 채워 질것입니다. 

    최초 object로 쌓여 졌던게 null 이 되면서 가바지 컬렉션의 Eden 영역으로 객체가 이동하면서 스텍 메모리에는 다시 null이 된다고 합니다..






    'Java(자바)' 카테고리의 다른 글

    자바 SOLID(객체지향 5대원칙)!!  (0) 2015.10.01
    자바 상속 규칙(피터 코드)  (0) 2015.08.08
    자바 ObjectMapper  (0) 2015.05.07
    이클립스 단축키 모음!  (0) 2015.04.10
    자바 Statement 와 PreparedStatement의 차이점  (0) 2015.01.15
Designed by Tistory.