2014년 9월 1일 월요일

[Web HomePage,Java] 댓글 구현하기 - DB

개발환경 : Spring Framework, Mybatis, MySql, Java, Jsp
사용 툴 : STS, MySQL Workbench 6.1 CE
  • ※저 스스로 로직과 테이블, jsp를 배우면서 짜가며 만들었기 때문에 비효율적인 면이나 실제 로직과 다른면이 충분히 있을 수 있습니다. 많은 지적 바랍니다.
  • 댓글 구현의 어려움 -> 댓글의 댓글 구현하기
    • 이를 해결하기 위해서 grp, grp_num을 이용하여 덧글마다의 그룹을 만들어 댓글의 댓글은 그룹으로 묶어서 정렬함
    • order by grp asc ,grp_num asc를 하여 grp을 1순위, grp_num을 2순위로 정렬하여 select한다.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
CREATE TABLE `comment_board` (
   `num` int(20) unsigned NOT NULL,
   `grp` int(20) unsigned NOT NULL,
   `grp_num` int(10) unsigned NOT NULL DEFAULT '0',
   `depth` int(10) unsigned NOT NULL DEFAULT '0',
   `content` varchar(500) NOT NULL,
   `id` varchar(20) NOT NULL,
   `date` datetime NOT NULL,
   `good` int(10) unsigned NOT NULL DEFAULT '0',
   `bad` int(10) unsigned NOT NULL DEFAULT '0'
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

//호출 쿼리
select * from comment_board where num = #{num} order by cb_grp asc ,cb_grp_num asc;


  • num, grp, grp_num, depth는 controller에서 값을 가져온다.
  • 삽입 - 댓글일때
    • grp을 증가시킨다. grp_num은 1으로 둔다. depth는 0으로 둔다.
  • ifnull을 사용하여 해당글에 처음 쓰는 댓글이라면 자동으로 grp값을 1로 주도록 하였다.

1
insert into comment_board select #{num}, ifnull(max(grp)+1,1) grp, 1,0, #{content}, #{id}, now(), 0,0 from comment_board where num = #{num}; 


  • 삽입 - 댓글의 댓글일때
    • 해당 grp의 grp_num의 넣을 위치보다 큰 grp_num을 모두 1씩 증가시킨다.
      • 아래로 한칸씩 미룬다.
    • depth를 증가시킨후 해당 grp_num에 넣는다,

1
2
3
4
//해당 게시물(num) grp grp_num 넣을 위치보다  grp_num 모두 1 증가시킨다.
update comment_board set grp_num=grp_num+1 where num = #{num} and grp = #{grp} and grp_num > #{grp_num};
//depth 증가시킨후 해당 num,grp,grp_num 넣는다,
insert into comment_board(#{num},#{grp}, #{cb_grp_num} ,#{depth}+1, #{content}, #{id}, now(), 0,0);

댓글 8개: