스프링

* 댓글 기능
* 답변 달기

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 }">
	 &nbsp;&nbsp;
	</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. 마지막에 답변글 삽입 처리

 

 

 

 

 

 

 

about author

PHRASE

Level 60  머나먼나라

시작이 나쁘면 결과도 나쁘다. 중도에서 좌절되는 일은 대부분 시작이 올바르지 못했기 때문이다. 시작이 좋아도 중도에서 마음 늦추면 안 된다. 충분히 생각하고 계획을 세우되, 일단 계획을 세웠거든 꿋꿋이 나가야 한다. -레오나르도 다빈치

댓글 ( 5)

댓글 남기기

작성