Java 프레임워크 만들기 - JSP

자바 싱글톤 세션 카운트 만들기 - Java Singleton Session Counter, HttpSessionListener, 이클립스(Eclipse)

carrotweb 2021. 4. 10. 17:37
728x90
반응형

1. "test2" 프로젝트의 "Java Resources"에서 "src/main/java"의 "com.hom.project.test2.service"에서 오른쪽 버튼을 클릭하여 컨텍스트 메뉴 [New > Class]를 클릭합니다.

"New Java Class"창의 "Name"에 "TestSessionCounter"를 입력하고 "Modifiers"의 "final"를 체크하고 "Finish"버튼을 클릭합니다.

"test2" 프로젝트의 "Java Resources"에서 "src/main/java"의 "com.hom.project.test2.service"에 "TestSessionCounter.java"파일이 생성됩니다.

 

싱글스톤 처리를 추가합니다.

/**
 * 생성자
 */
private TestSessionCounter() {
}

/**
 * TestSessionCounter의 인스턴스를 가져옵니다.
 * @return TestSessionCounter 객체
 */
public static TestSessionCounter getInstance() {
	return InClassInstance.testSingletonInstance;
}

private static class InClassInstance {
	private static final TestSessionCounter testSingletonInstance = new TestSessionCounter();
}

세션 카운트를 위해 전체 세션 수와 현재 세션 수를 멤버 변수로 추가하고 가져오는 메서드를 추가합니다.

/**
 * 전체 세션 수
 */
private int totalCount = 0;

/**
 * 현재 세션 수
 */
	private int currentCount = 0;

/**
 * 전체 세션 수를 가져옵니다.
 * @return 전체 세션 수
 */
public int getTotalCount() {
	return totalCount;
}

/**
 * 현재 세션 수를 가져옵니다.
 * @return 현재 세션 수
 */
public int getCount() {
	return currentCount;
}

"HttpSession"이 생성되고 파괴될 때마다 세션 수를 증/감시키는 메서드를 추가합니다.

/**
 * 현재 세션 수를 증가시킵니다. 
 * @return 현재 세션 수
 */
public int increaseSession() {
	totalCount++;
	return ++currentCount;
}

/**
 * 현재 세션 수를 감소시킵니다. 
 * @return 현재 세션 수
 */
public int decreaseSession() {
	return --currentCount;
}

 

2. "HttpSessionListener"를 구현한 "TestHttpSessionListener.java"의 "sessionCreated", "sessionDestroyed"에 "TestSessionCounter" 연동을 추가합니다.

 public void sessionCreated(HttpSessionEvent se)  {
	System.out.println("HttpSession 생성 실행 : " + se.toString());
	TestSessionCounter testSessionCounter = TestSessionCounter.getInstance();
	int count = testSessionCounter.increaseSession();
	HttpSession httpSession = se.getSession();
	System.out.println("Session Count : " + count + ", Session ID : " + httpSession.getId());
}

public void sessionDestroyed(HttpSessionEvent se)  { 
	System.out.println("HttpSession 파괴 실행 : " + se.toString());
	TestSessionCounter testSessionCounter = TestSessionCounter.getInstance();
	int count = testSessionCounter.decreaseSession();
	HttpSession httpSession = se.getSession();
	System.out.println("Session Count : " + count + ", Session ID : " + httpSession.getId());
}

"TestSessionCounter"클래스가 "import"되어 있지 않아서 오류가 납니다. 마우스를 "TestSessionCounter"클래스 위로 이동하면 컨텍스트 메뉴가 나타납니다. 여기서 "import 'TestSessionCounter' (com.home.project.test2.service)"를 클릭하고 저장합니다.

 

3. "TestService1.java"의 "process"메서드에"TestSessionCounter"의 전체 접속했던 세션 수를 저장하는 "totalCount", 현재 접속 중인 세션 수를 저장하는 "currentCount"를 가져와 "request" 속성에 저장하게 코딩하고 저장합니다.

request.getSession().setMaxInactiveInterval(10);
TestSessionCounter testSessionCounter = TestSessionCounter.getInstance();
request.setAttribute("sessionTotalCount", testSessionCounter.getTotalCount());
request.setAttribute("sessionCount", testSessionCounter.getCount());

세션 파괴 테스트를 위해 "setMaxInactiveInterval"로 세션 시간을 10초로 제한하였습니다.

 

 

4. "testservlet.jsp"에 "request"속성에 있는 "sessionTotalCount"와 "sessionCount"를 EL (Expression Language) 방식으로 코딩하고 저장합니다.

전체 세션 수 : ${sessionTotalCount}, 현재 세션 수 : ${sessionCount}<br/>
${name}님, 안녕하세요.

EL (Expression Language)은 Java의 "<%= %>"코딩과 같은 "out.println()"를 Jsp페이지에서 사용하지 않고 "${}"으로 처리할 수 있는 언어입니다.

5. "Servers"탭에서 "Tomcat8"를 선택하고 "start"버튼(start the server)을 클릭합니다. 웹 브라우저에서 "http://localhost:8080/test2/test1.do"를 입력합니다.

 

Jsp페이지가 생성되면서 "HttpSessionListener"의 "sessionCreated"가 이벤트를 받으면서 세션 수를 증가시킵니다.

 

웹 브라우저에서 "F12"키를 누르면 "개발자 도구"가 나타납니다. "개발자 도구"의 메뉴에서 "Application"를 선택하고 왼쪽의 "Storage"에 "Cookies"의 "http://localhost:8080"를 클릭하면 "JSESSIONID"이라는 세션을 확인할 수 있습니다.

이 세션이 웹 브라우저만의 세션입니다. 다른 웹 브라우저로 접속하면 다른 세션이 생성됩니다.

10초 후 세션이 삭제되면 "HttpSessionListener"의 "sessionDestroyed"가 이벤트를 받으면서 세션 수를 감소시킵니다.

 

6. 두 개의 웹 브라우저(크롬과 IE)를 사용하여 세션을 확인해 보겠습니다. 현재 크롬 웹 브라우저에서 "http://localhost:8080/test2/test1.do"를 새로고침 합니다.

 

IE 웹 브라우저에서 "http://localhost:8080/test2/test1.do"를 입력합니다.

 

10초 후 크롬 웹 브라우저에서 "http://localhost:8080/test2/test1.do"를 새로고침 합니다.

[Console]

HttpSession 생성 실행 : javax.servlet.http.HttpSessionEvent[source=org.apache.catalina.session.StandardSessionFacade@59e6cc60]
Session Count : 1, Session ID : 81826480AD344FEEECF45A3F4A349587

HttpSession 생성 실행 : javax.servlet.http.HttpSessionEvent[source=org.apache.catalina.session.StandardSessionFacade@6038f59]
Session Count : 2, Session ID : 75203C834549B417AAB374074DC650CB

HttpSession 파괴 실행 : javax.servlet.http.HttpSessionEvent[source=org.apache.catalina.session.StandardSessionFacade@6038f59]
Session Count : 1, Session ID : 75203C834549B417AAB374074DC650CB

 

"setMaxInactiveInterval"의 10초는 테스트하기 힘드네요. 30초 정도면 좋을 것 같습니다.

틈틈이 크롬 웹 브라우저는 새로고침해야 세션이 파괴되지 않습니다.

728x90
반응형