쿠키 및 세션을 이용한 카운터

By | 2009년 3월 17일

쿠키를 이용한 카운터

다음 프로그램 “cCounter.jsp”는 쿠키를 이용해 카운터를 구현한 프로그램이다. 쿠키는 브라우저별로 각각 저장 관리되므로 이 프로그램은 프라우저별로 각각 1에서 시작하여 브라우저의 새로고침 버튼을 클릭할 때 마다 1 씩 증가된다.

<%@ page language=”java” contentType=”text/html; charset=EUC-KR”
    pageEncoding=”EUC-KR”%>
<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”
“http://www.w3.org/TR/html4/loose.dtd”>
<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=EUC-KR”>
<title>Insert title here</title>
</head>
<body>
<%
Cookie [] cookieArray = request.getCookies(); // 브라우저에서 전달된 모든 쿠키 저장
Cookie cookie = null;
int countNum = 0;
String countStr = “”;

if(cookieArray != null) { // 브라우저에서 전달된 쿠키정보가 있다면
   for(int i = 0; i < cookieArray.length; i++) { // 전달된 모든 쿠키를 검사하며,
      if(cookieArray[i].getName().equals(“counter”)) { // “counter”란 이름의 쿠키정보를 찾아
         cookie = cookieArray[i]; // 저장하고
         break; // for문을 빠져나간다.
      }
   }
}
if(cookie != null) { // “counter”란 이름의 쿠키가 있으면
   countNum = Integer.parseInt(cookie.getValue()) + 1; // 값을 정수로 변환한 다음 1 증가한 후
   countStr = Integer.toString(countNum); / 다시 증가된 값을 문자열로 변환한 후
   cookie.setValue(countStr); // “counter”란 이름의 쿠키값을 새롭게 설정한다.
}
else { // “counter”란 이름의 쿠키가 없으면
   cookie = new Cookie(“counter”, “1”); // counter란 이름으로 초기값 1인 쿠키를 생성한다.
}

response.addCookie(cookie); // “counter”란 이름의 쿠키와 그 값을 클라이언트에 전달한다.
%>
<h2>당신은 <%=cookie.getValue()%>
번째 방문하셨습니다.</h2>
</body>
</html>

사용자 삽입 이미지

cCounter.jsp 실행결과

위 프로그램은 브라우저에서 전달된 쿠키 중 쿠키이름이 “counter”인 쿠키의 쿠키값을 찾는다. 만약 “counter”라는 이름의 쿠키가 없으면 “counter”란 이름과 1을 초기값으로 하는 쿠키를 생성한 후 response.addCookie 메소드를 이용 클라이언트에 쿠키를 저장한다. 만약 “counter”란 이름의 쿠키가 있다면 해당 쿠키의 값을 읽어 그 값을 하나 증가시킨 후 다시 지정한 후 클라이언트에 저장한다. 
사용자 삽입 이미지

cCounter.jsp의 원리

위 그림은 프로그램 “cCounter.jsp”의 처리과정을 도식화한 것이다. 좌측의 사각형은 클라이언트를 우측의 사각형은 서버를 나타낸다. “cCounter.jsp”으로의 첫 접속에서는 지정된 쿠키가 없으므로 클라이언트에서 서버로 전달되는 쿠키 또한 없다. 따라서 “cCounter.jsp”는 “counter”/”1″을 쌍으로 하는 쿠키를 생성하고 결과에 해당 쿠키를 클라이언트에 전달한다. 그러면 두 번째 접속에서 클라이언트는 저장된 쿠키 “counter”/”1″을 서버로 전달하고 “cCounter.jsp”는 하나 증가시킨 값으로 재 설정 “counter”/”2″를 쌍으로 하는 쿠키를 생성하고 결과에 해당 쿠키를 클라이언트에 새롭게 전달한다. 세 번째 접속에서는 쿠키 “counter”/”2″가 서버로 전달되고 서버는 “counter”/”3″으로 쿠키를 재 설정해 클라이언트로 전달한다. 그러므로 재 접속이 요구될 때 마다 하나 증가된 값이 서버로부터 클라이언트에 저장되게 된다.
세션을 이용한 카운터
아래 프로그램 “sCounter.jsp”은 세션을 이용해 카운터 프로그램을 작성한 것이다. 이 프로그램 역시 쿠키로 구현한 프로그램과 마찬가지로 브라우저별로 1부터 시작 재 접속이 요구될 때 마다 하나 씩 증가된다.

<%@ page language=”java” contentType=”text/html; charset=EUC-KR”
    pageEncoding=”EUC-KR”%>
<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”
“http://www.w3.org/TR/html4/loose.dtd”>
<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=EUC-KR”>
<title>Insert title here</title>
</head>
<body>
<%
Integer countNum =(Integer)session.getAttribute(“counter”); 
//  “counter” 이름의 세션값을 저장한다.
if(countNum == null) // “counter”란 이름의 세션값이 없으면
{
   countNum = new Integer(1); // 초기값으로 1을 저장하고
}
else // “counter”란 이름의 세션값이 있으면
{
   int num = countNum.intValue(); // 그 값을 정수로 변환한 후
   num++; // 그 값을 하나 증가시킨 후 
   countNum = new Integer(num); // 증가된 값으로 저장한다.
}

session.setAttribute(“counter”, countNum)
// 새롭게 지정된 값을 “counter”란 이름과 함께 저장한다.

%>
<h2>당신은 <%=countNum.intValue()%>
번째 방문하셨습니다.</h2>
세션ID : <%= session.getId() %>
</body>
</html>

사용자 삽입 이미지

sCounter.jsp 실행결과

위 프로그램은 “cCounter.jsp”와 비교하여 쿠키 대신 세션을 이용했다는 차이점을 제외하면 구현 원리는 유사하다. 이 프로그램 역시 “counter”란 이름으로 저장된 세션이름이 있는지 찾은 후 없으면 초기값을 1로 가지는 “counter”라는 이름의 세션을 만들고 “counter”라는 이름의 세션이 있다면 그 값을 하나 증가시켜 다시 지정한다.
사용자 삽입 이미지

sCounter.jsp의 원리

위 그램은 “sCounter.jsp”의 처리관정을 도식화 한 것이다. 이 그림에서 최초 접속 시 클라이언트는 서버로 전달하는 세션정보 “JSESSIONID”가 없다. 따라서 “sCounter.jsp”에서는 “counter”란 이름의 세션 역시 찾을 수 없기 때문에 if 문의 조건식 

countNum == null
가 참이되어 초기값을 1로 하는 “counter”란 이름의 세션을 생성 서버에 저장한다. 그리고 이와 동시에 서버는 고유한 세션아이디를 생성 클라이언트에 “JSESSIONID”란 이름과 함께 쿠키로 전달한다. 그러면 두 번째 접속부터 클라이언트는 서버에 “JSESSIONID”/”세션아이디”를 쌍으로 하는 쿠키정보를 서버에 전달하게 된다. 그러면 서버는 클라이언트에서 전달된 세션아이디를 가지고 그와 관련된 저장공간에서 “counter”란 이름과 함께 쌍으로 저장된 값을 찾아 그 값을 하나 증가시킨 후 새롭게 변경된 세션정보를 다시 서버에 저장한다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.