코드의 구조
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
'수업 & 공부 > 수업 내용' 카테고리의 다른 글
33- 게시판 리뷰 (회원가입) (0) | 2021.09.13 |
---|---|
31- 게시판 만들기 (로그인 기능) (0) | 2021.09.09 |
28- jspmvc 구성도와 요구사항 명세 (0) | 2021.09.06 |
27- 게시판 리뷰 (댓글 출력&카운트) (0) | 2021.09.02 |
26- 게시판 만들기4 (페이징 처리) (0) | 2021.08.29 |