본문 바로가기

수업 & 공부/수업 내용

30- 게시판 리뷰 (답글 달기)

코드의 구조

 

1. boardRead에서 '[답글쓰기]' 버튼을 통해 boardReply.jsp 페이지로 이동한다.

이때 replyRoot, depth, orderNum 을 같이 넘겨준다

 

  replyRootId > 답글의 원글

  depth > 원래 글에대한 깊이 ( depth의 값에따라 답글 앞에붙는 'RE' 수가 정해진다)

  orderNum > 원래 글에대한 orderNum ( 답글들의 순서 )

 

2. boardReply.jsp 에서 엔드유저 입력을 받고 ( boardInsert와 거의 비슷하다 )

controller를 통해 boardReplyInsert.Java로 넘겨준다

 

 

3. boardReplyInsert 에서 입력받은 값과 아래 세 가지 값을 받아서 

// boardReplyInsert.Java중
        int replyRootId = Integer.parseInt(request.getParameter("replyRootId"));    // 답글들의 root원글
        int depth = Integer.parseInt(request.getParameter("depth"));    //원래 글에대한 depth
        int orderNum = Integer.parseInt(request.getParameter("orderNum"));  //원래 글에대한 orderNum

 

boardReplyInsert 코드의 순서에 따라 BoardDAO로 넘겨 각각의 아래 쿼리를 실행한다.

-- 전체 글 목록 뽑을 때
select * from repltest order by replyRootId desc, ordernum asc

-- 1. 답글 쓸 때 ordernum를 정하기 위한 해당 글(답글)의 최고 번호를 가져옴.
SELECT NVL(MIN(orderNum),0) FROM repltest
WHERE replyrootId = (원글의 replyRootId)
AND orderNum > (원글의 orderNum)
AND depthnum <= (원글의 depthnum)

-- 2-1. 1번이 0 일 경우(1) : ordernum을 정함
SELECT NVL(MAX(orderNum),0) + 1 as orderNum FROM repltest
WHERE replyRootId = (원글의 replyRootId);

-- 2-1. 1번이 0 일 경우(2) : board에 insert
INSERT INTO repltest VALUES
(번호, (원글의 replyRootId), (orderNum), (원글의 DEPTH +1) ,' 제목')

-- 2-2. 1번이 0이 아닐 경우(1) : board테이블의 기존 orderNum들을 +1
UPDATE BOARD SET orderNum = orderNum + 1
WHERE replyRootId =  (원글의 replyRootId)  AND orderNum >= (1번값)

-- 2-2. 1번이 0이 아닐 경우(2) : board테이블 insert
INSERT INTO BOARD VALUES
(번호, (원글의 replyRootId), (1번값), (원글의 DEPTH +1) ,' 제목')

 

위 쿼리에서 1번을 실행시 select되는 orderNum을 minOrderNum 이라고 지정하겠다

minOrderNum 가 0일때와 0이 아닐때 사용되는 쿼리가 나뉘는데, 이 부분은 if문을 통해 알맞는 쿼리를 사용해준다.

 

 

예를들어 Id = 2인 원글에 답글을 달아준다 생각해보자. 

SELECT NVL(MIN(ordernum),0) as minOrderNum FROM board
                  WHERE  replyRootId = 2
                  AND orderNum > 0
                  AND depth <= 0

 

(orderNum이 0보다 큰값인데 depth가 0보다 작거나 같은값은 없으니 0) 

minOrderNum = 0이 나오고 if ( minOrderNum == 0 ) 을 통해 아래 쿼리가 실행된다

 

SELECT NVL(MAX(orderNum),0) + 1 as orderNumToInsertBoard FROM board
                 WHERE replyRootId = 2

orderNum 값은 replyRootId에 있는 orderNum의 최댓값의 +1이 되고 depth는 +1 이 되어 DB에 insert된다

> 같은 깊이 '1'의 답글중에 제일 밑으로 간다

 

 

 

게시판 리뷰 (답글달기) 느낀점


원본 글 depth, order 값은 0 , replyrootId 는 newid 값을 받는다는 부분과
답글은 원글의 depth 값에 +1, 그리고 같은 replyrootId의 기존 테이블 order값을 +1 시키고

나머지 같은 replyRootId에 같거나 큰값의 order를 밀어내서 넣는다는 부분이 내가 작성한 코드랑 유사하다고 느껴졌다

저번주에 시간을 많이 들여서 코드를 작성한 보람이 있는 것 같다.

 

그럼 이번엔 내 코드와 다른점을 보자

 

1. 동작 방식 (SQL, 코드)

1-1. 나는 답글을 달 때 Root글(답글을 다는곳)의 순서에 +1을 해주어 원본글 바로 밑에 달리게 만들고

  (구한 값을 newOrder로 지정하고 아직 insert는 하지않는다)

1-2. 같은 replyrootId 값들중 newOrder 값보다 크거나 같은 값들을 +1하여 insert 한다

  (newOrder가 들어갈 공간을 만들어준다)

1-3. 위에서 구한 newOrder와 나머지 값(글번호, 글쓴이, 제목 ....) 들을 insert 해준다


2. 'RE' 출력부분

위 코드는 글 subject앞에 RE를 depth의 수만큼 추가하는 방법으로 구현되었다.

나는 boardLIst.jsp 에서 forEach문을 사용하여 depth의 수에따라 'RE'를 구하는 방법을 사용했다

따라서 내가 구현한 답글에서 'RE' 부분은 sql에 저장되지 않는다 -> 'RE' 부분은 클릭도X

 

 

아래는 내가 구현한 답글기능

 

 

3- 게시판 (내가만든 답글)

추가된 페이지와 구조 boardReplyInsert.jsp boardReplyInsertCmd.java 사실 boardReplyInsertCmd를 새로 만들지말고 기존의 insertCmd를 쓰려고 했다 충분히 줄일 수 있을 것 같은데 ReplyInsertCmd를 만드는 편..

dwc04112.tistory.com