2014년 8월 30일 토요일

[Web HomePage] 쿠키를 이용한 게시물 조회수 관리 - Service 부분

개발환경 : Spring Framework, Mybatis, MySql, Java, Jsp
사용 툴 : STS, MySQL Workbench 6.1 CE
  • ※저 스스로 로직과 테이블, jsp를 짜가며 만들었기 때문에 비효율적인 면이나 실제 로직과 다른면이 충분히 있을 수 있습니다. 많은 지적 바랍니다.
  • 단순하게 페이시 호출시 마다 조회수 증가 -> 같은 pc,같은 id 로부터 무한한 조회수 증가의 문제점이 발생
    • ▽▽▽▽▽열심히 구글링을 통하여 생각해낸 해결책▽▽▽▽▽
    • 쿠키와 로그 테이블을 통하여 관리
    • 1.로그인(세션의 아이디)확인 로그인이 되어있다면 2번으로, 안 되어 있다면 3번으로..
    • 2 - 1. 로그 테이블 기록 확인, 기록이 없으면 로그 테이블에 기록 후, 조회수 증가 이후 확인 및 쿠키 생성
    • 2 - 2. 기록이 있다면 바로 페이지 호출
    • 3 - 1.로그인이 안되어 있다면, 쿠키를 확인.
    • 3 - 2. 쿠키를 확인하여 기록이 있다면 페이지 호출, 없다면 쿠키 생성,기록
  • 저 스스로는 만든 이 방법이 아주 맘에 드네요. ^^;

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
//HttpServletRequest req,HttpServletResponse res가 필요합니다
String id = /*아이디*/;
String num = /*게시글 번호*/;
String table /*테이블명(이후 쿠키명)*/;
String cookieName = table;
String cookieValue = num+":"; //':'는 게시물 사이간의 구문자
if(id != null){
 if(/* 게시물 기록조회 Dao*/ == 0){     //게시물 로그 테이블 기록조회
  /* 게시물 기록 Dao*/           //게시물 로그 테이블 읽음 기록
  /* 게시물 조회수 증가 Dao*/    //게시물 조회수 증가
 }
} 
else { 
 Boolean flag = false;
 Cookie[] cookies = req.getCookies();  //브라우저의 쿠키 얻어오기
 Cookie cookie_tmp = null;  
 if (cookies != null && cookies.length > 0) { //쿠키가 존재 한다면 탐색
 for (Cookie cookie : cookies) {
//확인하려는 쿠키이름과 같은 이름의 쿠키 확인
if (cookieName.equals(cookie.getName())) { 
   cookie_tmp=cookie;
//StringTokenizer로 :를 끊어서 현재 조회하는 테이블의 번호와 비교, 존재한다면 있다는 의미로 flag를 true로 변경
   StringTokenizer stringTokenizer = new StringTokenizer(cookie.getValue(),":");
   while(stringTokenizer.hasMoreTokens()){
    String val = stringTokenizer.nextToken();
    if(val.equals(num)){
     flag = !flag;
     }
    }
   }
//번호 기록이 없고, 해당 테이블의 쿠키가 존재한다면 테이블의 쿠키에 번호를 기록
   if(cookieName.equals(cookie.getName()) && !flag){
    cookie.setValue(cookie.getValue()+cookieValue);
    res.addCookie(cookie);
    boardDao.increase_hit(map);
   }
  } 
 }
//테이블의 쿠키가 존재하지 않았다면 해당 테이블의 이름으로 쿠키를 생성
//쿠키 생성 방법은 아래 addcookie() 매소드 참고
 if(cookie_tmp == null){
  System.out.println("쿠키 처음 생성");
  addcookie(cookieName, cookieValue, res);
  boardDao.increase_hit(map);
 }
}

  • 결과 모습으로 보아 Board_humor,Board_mobile,Board_movie 페이지를 확인 했고
  • mobile페이지에서는 3,2,1 페이지를 조회했다고 하네요.



1
2
3
4
5
6
7
//쿠키 생성 메소드, 쿠키 이름이 같아도 path가 다르면 다른 쿠키로 인식된다.
public void addcookie(String name,String val,HttpServletResponse res){
  CookieGenerator cookieGer = new CookieGenerator();
  cookieGer.setCookieName(name);
  cookieGer.setCookiePath("/web_project"); 
  cookieGer.addCookie(res, val);  
 }


  • 게시물 로그 테이블
    • bm_id : 아이디
    • bm_cate : 카테고리
    • bm_board : board 번호
    • bm_content : 댓글
      • 0번이라면 본문, 아니라면 댓글
    • bm_type : 조회인지, 추천,반대를 하였는지 조회
    • bm_date : 기록 시간
  •  게시물 로그 기록 삽입, 조회는 간단하니 생략합니다.

1
2
3
4
5
6
7
8
CREATE TABLE `board_log` (
   `bm_id` varchar(20) NOT NULL,
   `bm_cate` varchar(20) NOT NULL,
   `bm_board` int(20) unsigned NOT NULL DEFAULT '0',
   `bm_comment` varchar(5) NOT NULL,
   `bm_type` varchar(10) NOT NULL,
   `bm_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

댓글 없음:

댓글 쓰기