* 댓글 기능
* 답변 달기
ref number default 0, -- 게시물 그룹ID --> 초기 idx 와 같은 값으로 설정 했다.
depth number default 0, -- 답변 단계 => 들여쓰기
reorder number default 0 -- 그룹 내에서의 순서
게시물번호 아이디 제목 ref depth reorder
4 choi 게시물2 2 0 1
5 lee RE: 게시물2 2 1 2
1 kim 게시물1 1 0 1
2 park RE : 게시물1 1 1 2
3 hong Re :Re : 게시물1 1 2 3
=>1번 게시물에 답변 ( reorder 순서 변화가 생긴다.)
게시물번호 아이디 제목 ref depth reorder
4 choi 게시물2 2 0 1
5 lee RE: 게시물2 2 1 2
1 kim 게시물1 1 0 1
6 park RE : 게시물1 1 1 2
2 park RE : 게시물1 1 1 3
3 hong Re :Re : 게시물1 1 2 4
여기서 중요한 것은 쿼리를 잘 처리 해야 한다.
mysql 게시글에 대한 ref 값 처리 방법은
create table board(
idx int not null primary key AUTO_INCREMENT ,
userid VARCHAR(50) not null,
subject VARCHAR(100) not null,
content text not null,
hit int(7) DEFAULT 0 COMMENT "조회수",
post_date TIMESTAMP DEFAULT now(),
filename VARCHAR (100),
filesize LONG ,
down int default 0 COMMENT "다운로드 횟수",
ref int default 0 COMMENT "게시물 그룹 ID",
depth int default 0 COMMENT "답변 단계",
reorder int default 0 COMMENT "그룹 내에서의 순서"
);
Auto_increment 방법으로 idx 값을 주었다.
그리고 ref 값도 게시글 등록과 동시에 idx 번호를 가져와서 ref 를 업데이트 하는 방법을 사용했다.
boardMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 다른 mapper와 중복되지 않도록 네임스페이스 기재 -->
<mapper namespace="board.Mapper">
<select id="listCritera" resultType="BoardDTO">
select * from board_v order by idx desc, reorder asc limit #{pageStart} , #{perPageNum}
</select>
<!-- 현재 삽입한 idx 번호값 가져오기 -->
<select id="lastInsertIdx" resultType="int">
select idx from board where idx=Last_insert_id()
</select>
<!-- ref 업데이트 하기 -->
<update id="refUpdate">
update board set ref=#{idx} where idx=#{idx}
</update>
</mapper>
그리고 dao 에서 게시글 등록과 동시에 idx 값을 가져와서 ref 에 업데이트 하기위해 트랜잭션 처리를 했다.
@Transactional
@Override
public void boardInsert(BoardDTO dto) {
// TODO Auto-generated method stub
try {
boardDAO.boardInsert(dto);
//현재 삽입한 idx 번호 가져오기
int idx=boardDAO.lastInsertIdx();
//ref 를 업데이트 하기
logger.info(" idx ***************************" + idx);
boardDAO.refUpdate(idx);
} catch (Exception e) {
return ;
}
}
오라클의 경우 쿼리로 isert 시에 같은 값을 넣도록 처리 했다.
--게시판 테이블
create table board(
idx number not null primary key ,
userid VARCHAR(50) not null,
subject VARCHAR(100) not null,
content VARCHAR2(1000) not null,
hit number DEFAULT 0 ,
post_date date DEFAULT sysdate,
filename VARCHAR (100),
filesize LONG ,
down number default 0 ,
ref number default 0 ,
depth number default 0 ,
reorder number default 0
);
--글쓰기 (답변이 아닌 경우)
insert INTO board (idx, userid, subject, content, ref)
values ((select nvl(max(idx)+1, 1) from board), 'braverokmc', '제목', '내용', (select nvl(max(idx)+1, 1) from board));
order by ref desc , reorder asc 로 쿼리 정렬을 해야 한다.
<select id="listCritera" resultType="BoardDTO">
select * from board_v order by ref desc, reorder asc limit #{pageStart} , #{perPageNum}
</select>
순서가 중요하다.
1. 파라미터로 원 게시글 번호를 받아서 게시글 reorder 를 1을 증가 시킨 후 .
그리고 다시 쿼리에서도 reorder + 1 로 증가 처리 한다.
즉 같은 그룹내에서 순서를 다시 정렬 하여 reorder 번호보다 큰것들을 1씩 증가 시키는 것이다.
<!-- 같은 그룹내에서 순서 조정 ref (답변글) 현재 reorder 번호보다 큰것들은 1씩 증가-->
<update id="reorderUpdate">
update board set reorder =reorder +1
where ref =#{ref} and reorder > #{reorder}
</update>
//답변 달기
@RequestMapping(value="/reply_insert.do", method=RequestMethod.POST)
public String reply_insert(@RequestParam Integer idx, @RequestParam String subject,
@RequestParam String content1, @RequestParam String content2,
HttpSession session){
BoardDTO dto =boardService.boardView(idx);
logger.info("뷰에서 넘겨 온 값 :" + dto.toString());
//******************* 첫번째 reorder 증가처리 *********************
int ref =dto.getRef();
int depth=dto.getDepth() +1; //답변 단계
int reorder =dto.getReorder() +1; //같은 그룹내에서 순서
// DB에서 다시 ******************* 두번째 reorder 증가처리 *********************
//게시물 내에서의 순서 조정
//(답변글) 현재 reorder 번호보다 큰것들은 1씩 증가로 셋팅 한다.
boardService.reorderUpdate(ref, reorder);
logger.info("리오더 1씩 증가 완료 :");
//답변 게시글 테이블에 저장
MemberDTO loginUser=(MemberDTO) session.getAttribute("loginUser");
dto =new BoardDTO();
dto.setRef(ref);
dto.setUserid(loginUser.getUserid()); //댓글 등록할 userid
dto.setUsername(loginUser.getUsername());//댓글 등록할 username
dto.setSubject(subject); // 파라미터로 넘겨온 subject
dto.setContent(content1 +content2); //원본 게시글 + 답변 게시글
dto.setDepth(depth);
dto.setReorder(reorder);
boardService.replyInsert(dto);
return "redirect:listPage";
}
2. 그다음에 DTO 에 데이터를 넣은 후에 답변 게시글을 인서트 하는 방법을 취하고 있다.
여기서 넘어온 content1 은 원본 게시글이고 , content2 는 답변글 내용 이다.
depth 는 뷰에서 깊이처리를 하면 된다.
<c:forEach begin="1" end="${row.depth }">
</c:forEach>
번호 |
글쓴이 |
제목 |
등록 날짜 |
조회수 |
첨부파일 |
다운로드 |
답변 단계(depth) |
그룹 내에서의 순서 (reorder) |
---|---|---|---|---|---|---|---|---|
865 | 관리자 | 44444 | 2016-12-26 | 0 | 0 | 0 | 0 | |
857 | 관리자 | 33333 | 2016-12-26 | 3 | 0 | 0 | 0 | |
858 | 관리자 | Re : 33333 | 2016-12-26 | 0 | 0 | 1 | 1 | |
856 | 관리자 | 22222 | 2016-12-26 | 6 | 0 | 0 | 0 | |
860 | 관리자 | Re : 22222 | 2016-12-26 | 6 | 0 | 1 | 1 | |
866 | 관리자 | Re : 22222 | 2016-12-26 | 0 | 0 | 1 | 1 | |
861 | 관리자 | Re : Re : 22222 | 2016-12-26 | 10 | 0 | 2 | 3 | |
862 | 관리자 | Re : Re : 22222 | 2016-12-26 | 0 | 0 | 2 | 3 | |
863 | 관리자 | Re : Re : Re : 22222 | 2016-12-26 | 3 | 0 | 3 | 4 | |
864 | 관리자 | Re : Re : Re : 22222 | 2016-12-26 | 0 | 0 | 3 | 4 |
핵심
1. ref 값 sql 처리 및 insert 처리
2. 목록 보기에서 정렬 처리 ex( select * from board where idx >0 order by ref desc, reorder asc
3. reorder 컬럼 정렬 처리 중요
4. 마지막에 답변글 삽입 처리
댓글 ( 5)
댓글 남기기