2014년 8월 30일 토요일

[Web HomePage,Java] 시간 포맷 - Service 부분

개발환경 : Spring Framework, Mybatis, MySql, Java, Jsp
사용 툴 : STS, MySQL Workbench 6.1 CE
  • ※저 스스로 로직과 테이블, jsp를 배우면서 짜가며 만들었기 때문에 비효율적인 면이나 실제 로직과 다른면이 충분히 있을 수 있습니다. 많은 지적 바랍니다.
  • 오늘 쓴 글이라면 오늘의 시간을, 아니라면 쓴 개시한 날자를 보여주기 Service 구현
  • △△△△△요런거△△△△△
  • 바로 코드 ㄱㄱ
1
2
3
4
5
6
7
8
9
Date = date;//비교값
Date now = new Date(System.currentTimeMillis());
now = DateUtils.truncate(now, Calendar.DATE);//오늘날짜
if(date.compareTo(now) < 0){//비교값이 오늘날짜에 비하여 과거이면 -1반환,
 map.replace("b_date", new SimpleDateFormat("MM-dd").format(date));//month-day로 포맷
}
else if(date.compareTo(now) >= 0){//비교값이 오늘날짜(0시0분)에 비하여 미래, 즉 오늘 중 이라면 1을 반환
 map.replace("b_date", new SimpleDateFormat("HH:mm").format(date));//hour:minute로 포맷
}

[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 &amp;&amp; cookies.length &gt; 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()) &amp;&amp; !flag){
    cookie.setValue(cookie.getValue()+cookieValue);
    res.addCookie(cookie);
    boardDao.increase_hit(map);
   }
  } 
 }
//테이블의 쿠키가 존재하지 않았다면 해당 테이블의 이름으로 쿠키를 생성
//쿠키 생성 방법은 아래&nbsp;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;

[Web HomePage] 게시판 만들기 - DB(MySql) 부분

개발환경 : Spring Framework, Mybatis, MySql, Java, Jsp
사용 툴 : STS, MySQL Workbench 6.1 CE
  • ※저 스스로 로직과 테이블, jsp를 짜가며 만들었기 때문에 비효율적인 면이나 실제 로직과 다른면이 충분히 있을 수 있습니다. 많은 지적 바랍니다.
  • 테이블 구성
    • b_num : 게시물 번호, 
      • AUTO_INCREMENT 제약조건으로 생성시마다 자동증가
    • b_content : 게시물 내용
    • b_id : 작성자
    • b_hit : 조회수
    • b_date : 작성날자 
      • datetime속성으로 년,월,일,시,분,초 모두 기록됨
    • b_good,b_bad : 추천과 반대
    • b_cate,b_sub : 카테고리와 하부 항목
      • 제가 만들때 카테고리별로 따로 테이블을 만들고 테이블마다 하위 카테고리를 만들어 줬기 때문에 통합 게시물 테이블에서 카테고리를 구분할 속성이 필요했기 때문에 만들어줬습니다.
    • 저의 개발에서는 board_humor, board_tip, board_movie, board_mobile, board_review 라는 이름의 총 5가지의 테이블을 만들었습니다.

  • 테이블 create 쿼리
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
CREATE TABLE `board` (
   `b_num` int(20) NOT NULL AUTO_INCREMENT,
   `b_title` varchar(200) NOT NULL,
   `b_content` varchar(500) NOT NULL,
   `b_id` varchar(20) DEFAULT NULL,
   `b_hit` int(10) unsigned NOT NULL DEFAULT '0',
   `b_date` datetime NOT NULL,
   `b_good` int(10) unsigned NOT NULL DEFAULT '0',
   `b_bad` int(10) unsigned NOT NULL DEFAULT '0',
   `b_cate` varchar(20) DEFAULT NULL,
   `b_sub` varchar(20) DEFAULT NULL,
   PRIMARY KEY (`b_num`)
 ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
  • 통합 게시판을 위한 view생성 쿼리
    • union을 통하여 모든 테이블을 통합하여 보여주는 view를 만들었고 각각의 테이블에서 고유의 num이 있으므로 날자로 정렬
1
2
3
4
5
6
create view board_all as
select * from board_humor union all
select * from board_tip union all
select * from board_movie union all
select * from board_review union all
select * from board_mobile order by b_date asc;


  • 게시판 리스트 호출 쿼리
    • comment_board는 댓글 테이블
    • left outer join comment_board b
      • 각각의 게시물에 대한 댓글의 갯수를 호출하기 위한 board_all과 comment_board의 조인, 좀더 쉽게 할수 있지만 외부조인 연습겸 위와 같이 사용
    • limit #{page_set},10
      • 리스트개의 10개를 호출 하므로 지정한 번호로부터 10개 호출하여 추출
    • #{}와${}의 차이
      • ${}는 Mybatis에서 Query문으로 인식하고 #{}는 param으로 인식한다
      • 때문에 동적으로 테이블을 호출하기 위하여 ${}을 사용하였다.
    • @rownum :=@rownum+1과 (select @rownum := 0)
      • Mysql에서는 rownum이 없기 때문에 @rownum :=@rownum+1과 (select @rownum := 0)을 이용하여 rownum 컬럼을 만들어 줬습니다.
      • 통합게시판에서는 각각의 테이블에서의 b_num을 사용할수 없기때문에(당연히 겹치기 때문에) rownum을 만들어 사용했습니다.
select a.*, count(b.cb_num) as comments from 
 (select @rownum := @rownum + 1 as rownum, a.*
 from (select @rownum := 0) rowcolumn, ${table} a
 ) as a left outer join comment_board b
 on a.b_num = b.cb_num and a.b_cate = b.cb_cate 
 group by a.b_num,a.b_cate order by a.rownum desc limit #{page_set},10;
  • 참고, 도움 사이트
    • http://www.javaproject.co.kr/web/main.do

[Web HomePage] 게시판 만들기 - Jsp (View)부분

개발환경 : Spring Framework, MySql, Java, Jsp
사용 툴 : STS, MySQL Workbench 6.1 CE

  • ※저 스스로 로직과 테이블, jsp를 짜가며 만들었기 때문에 비효율적인 면이나 실제 로직과 다른면이 충분히 있을 수 있습니다. 많은 지적 바랍니다.
  • 최대한 간단하게 만든 게시판 게시물의 폼
  • 게시물 리스트 기본 폼



 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
<!--   게시판 리스트 -->
       <div class="board_list">
         <h1>Free Board</h1>
         <table summary="Summary Here" cellpadding="0" cellspacing="0" align="center" >
<!--   테이블 해더 -->
   <thead>
            <tr>
             <th width="10%">번호</th>
             <th width="50%">제목</th>
             <th width="10%">작성자</th>
             <th width="10%">작성일</th>
            <th width="10%">추천</th>
             <th width="10%">조회</th>
             </tr>
         </thead>
   
<!--   테이블 바디 -->
          <tbody>
<!--             Controller에서 'board_list' 변수명으로 게시물 리스트 10개를 보냄 -->
         <c:forEach items="${board_list}" var="board">
            <tr class="light">
    <td align="center">${board.b_num}</td>   
    <td><a id ="sub_view">&nbsp;[${board.b_sub}]&nbsp;</a>
    <a id="board_title" onclick="link(${board.b_num},${pageNum},'${board.b_cate}');">${board.b_title}</a>
<!--   댓글 갯수 있다면 보여주기 -->
                <c:if test="${board.comments != 0}">
    <a id="board_comments">&nbsp;(${board.comments})</a>
    </c:if>
    </td>
    <td align="center">${board.b_id}</td>
    <td align="center">${board.b_date}</td>
    <td align="center">${board.b_good}</td>
    <td align="center">${board.b_hit}</td>
           </tr>
           </c:forEach>
<!--   테이블 풋(글쓰기 버튼) -->
                <tr class="table_last">
    <td colspan="5"></td><td align="center" onclick="do_write();" style="cursor: pointer;">글 쓰기</td>
   </tr>
         </tbody>
       </table>
      </div>


  • css 처리 後 (글쓰기 부분 제외)




  • 참고, 도움 사이트
    • http://www.javaproject.co.kr/web/main.do