(어떻게 이 기능을 구현해야 할지 당시에 취준생으로써 개인적으로 생각하고 시도해봤던 방법이다.

성능적인 측면을 전혀 고려하지 않고(그럴 실력도 전혀 없었고) 단지 해당 기능의 구현에만 집중했던 상황)

 

 

대댓글(위 이미지에서 내용이 1 - 1 - 1인 댓글)을 부모 댓글(내용이 1 - 1 인 댓글) 바로 아래로 위치하도록 만드려고 한다.

 

마치 Window 탐색기에서 파일들이 정렬되어 있는 형태처럼,

폴더에 있는 내용물은 해당 폴더 아래에 쭉 펼쳐지듯이 댓글과 대댓글도 부모 댓글 아래로 쭉 달리도록 만드려고 한다.

 

 

 

댓글의 구성은 다음과 같다.

[commenter(작성자), comment(내용), cno(댓글 번호), pcno(부모 댓글 번호), bno(게시물 번호), reg_date(등록일)]

 

어떻게 하면 탐색기 같은 방식으로 정렬할 수 있을까?

부모 댓글 번호의 자릿수를 맞추고 댓글 번호를 더해서 사전순으로 정렬을 하면 된다.

 

00001 (댓글번호 00001)

0000100003 (00001에 달린 댓글, 댓글번호는 00003)

00002 (댓글번호 00002)

0000200004 (00002에 달린 댓글, 댓글번호는 00004)

000020000400005 (0000200004에 달린 댓글, 댓글번호는 00005)

00006 (댓글번호 00006)

 

자릿수를 맞추고 사전정렬을 하면 다음과 같이 정렬이 된다.

즉, 부모 댓글 번호를 이용해서 히스토리를 만들고 가장 마지막에는 해당 댓글의 댓글번호를 붙여주면 된다.

 

 

 

* 먼저 부모 댓글번호를 누적해서 저장할 column을 DB에 추가해놓는다. (앞으로 pno라고 지칭함)

길이가 길기 때문에 숫자임에도 문자열 값으로 설정한다.

 

1.

1338번 게시물에 작성자가 reprisal, 내용이 123인 일반 댓글(첫 시작 댓글 번호는 100번이라고 가정)

을 처음 작성하면 당연히 해당 댓글은 부모 댓글 번호가 존재하지 않는다.

 

따라서 pno의 값도 존재하지 않는다. (pno의 디폴트 값을 빈 문자열로 하였다)

[ commenter = "reprisal", comment = "123", cno = 100, pcno = null, pno = ' ', bno = 1338, reg_date = null ]

그러므로 위와 같은 댓글이 DB에 저장된다.

 

 

2.

대댓글을 작성하면 그때부터 부모 댓글 번호가 존재하게 된다.

[ commenter = "reprisal", comment = "123", cno = 101, pcno = 100, pno = ??, bno = 1338, reg_date = null ]

 

pno의 값은 어떻게 저장해야 할까?

부모 댓글에 있는 pno의 값에, 대댓글의 pcno의 값을 지정한 자릿수로 맞춰서 더해 저장해야 한다.

자릿수를 5자리로 지정한다면 pno에 저장할 때 pcno의 값을 00100으로 만들면 된다.

String pcno = "100";
for (int i=0; pcno.length < 5 ; i++) { // 문자열의 자릿수를 5자리로 하고 앞에 빈 자리는 0으로 채움
    pcno = "0" + pcno;
}

pcno의 값은 "00100"이 된다

(실제 pcno의 값을 변경하는게 아니라, 히스토리를 만드는데 사용하는 pcno의 값을 "00100"으로 바꾸는 것)

 

 

이 대댓글의 부모 댓글의 pno 값은 ' '(빈 문자열)이다.

따라서 ' '(빈 문자열)에 "00100" 을 더해서 pno의 값을 "00100"으로 저장한다.

 

 

3.

이 대댓글에 또 댓글을 달면 다음과 같은 댓글 객체가 생성된다.

[ commenter = "reprisal", comment = "123", cno = 102, pcno = 101, pno = ??, bno = 1338, reg_date = null ] 

 

pno의 값은 부모 댓글의 pno + 현재 댓글의 pcno를 자리수를 맞춰 더하면 "0010000101"이 된다.

즉, 부모 댓글에 있던 pno에 현재 댓글의 pcno를 누적해서 더하는 것이다. (히스토리를 만드는 것)

 

 

 

이렇게 히스토리를 만들었다면 

 

SQL문에서 데이터를 정렬할 때 cno(댓글 번호)를 5자리로 만들어 pno의 끝에 붙여주면 된다.

(히스토리 + 자신의 댓글 번호)

(pno 대신 repno라는 명칭을 사용했음)

 

ex) cno가 317인 댓글을 보면,

 

repno = "0031400315" 이고

cno는 317 이므로, 5자리로 만든 숫자인 00317을 0031400315의 뒤에 붙여서

003140031500317로 만들었다

 

 

 

 

다음은 repno에 cno값을 5자리로 만들어준 값을 더하여 사전순으로 정렬을 한 결과이다.

 

댓글과 대댓글이 히스토리에 맞게 정렬된 것을 볼 수 있다.

 

+ Recent posts