*오라클 DB로 바꿔서 작성함


답변형 게시판의 게시글은 개념적으로 루트글, 부모글, 자식글로 구성된다.
하나의 루트를 갖는 게시글을 한 그룹으로 생각 할 수 있다.
답변형 게시판에서 글들은 중첩 레벨을 갖는데, 루트글의 중첩 레벨은 0, 루트글의 자식글의 중첩 레벨은 1로 표현 할 수 있다. 또한 레벨이 1인 글의 자식 글들의 중첩 레벨은 2로 표현할 수 있다.
답변형 게시판을 구현하려면 그룹 내에서 부모 글과 자식 글 관계에 맞는 순서값을 저장해야 한다.
- 그룹 번호: 동일한 루트를 갖는 글들이 공유하는 번호. 새로운 루트가 추가될 때마다 그룹 번호 값이 1씩 증가됨
- 순서 번호: 동일한 그룹에 속하는 글들의 순서 번호. 순서 번호를 이용해서 정렬함
<게시글의 중첩 레벨별로 순서 번호 갖기>

레벨 1~3 값은 각 레벨에서의 두 자리 순서 번호를 값으로 갖는데 각 레벨의 값은 99부터 시작해서 00까지의 값을 차례대로 가진다.

위 사진에서 볼 수 있듯 루트 글의 경우 레벨 1값으로 99를 가지며 루트글의 첫 번째 자식글(답변글)은 레벨 1값으로 98을, 두 번째 자식 글은 97을 갖는다.

그룹번호와 순서번호를 내림차순으로 정렬하면 게시글이 답변 계층에 따라 알맞은 순서대로 보여지게 된다.
0. DB 테이블 생성

article 테이블의 sequence_no 칼럼의 길이가 16자리인 이유는 그룹번호와 순서번호를 함께 저장하기 위함인데
예를 들어 그룹번호가 101이고 순서번호가 989999인 경우 저장되는 값은 000000010198999 이다.
그룹번호와 순서번호를 하나의 필드에 함께 저장하는 이유는 sequence_no 칼럼 하나만 내림차순으로 정렬하면 게시글을 알맞은 순서로 구할 수 있기 때문이다.
새로운 루트 게시글을 등록할 때 id_sequence 테이블의 next_value 칼럼 값을 읽어와 1 증가한 값을 게시글의 그룹 번호로 사용하고, 새로운 그룹 번호 값을 다시 next_value 칼럼에 저장한다.
0-2. 게시판 기능을 위한 클래스 구성

(ConnectionProvicer 등 JDBC와 관련된 클래스 구성은 생략함)
- 서비스: 게시판 관련 로직을 수행하며 JSP는 서비스 클래스를 통해 사용자가 요청한 기능을 수행함
- DAO: DB 테이블에 대한 CRUD 작업 수행. 게시판 로직은 담고 있지 않다.
- Article 클래스: 게시글 데이터 표현
- Request로 끝나는 클래스: 사용자의 요청 정보 표현. JSP는 사용자의 요청 정보를 Request 객체에 담아 서비스 객체에 전달함
- ArticleListModel 클래스: 게시글 목록 화면을 생성할 때 필요한 데이터를 저장
1. Article 클래스 생성 (DB의 article 테이블과 매핑 되는 클래스)
package board2;
//article 테이블과 매핑
import java.util.Date;
public class Article {
private int id;
private int groupId;
private String sequenceNumber;
private Date postingDate;
private int readCount;
private String writerName;
private String password;
private String title;
private String content;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getGroupId() {
return groupId;
}
public void setGroupId(int groupId) {
this.groupId = groupId;
}
public String getSequenceNumber() {
return sequenceNumber;
}
public void setSequenceNumber(String sequenceNumber) {
this.sequenceNumber = sequenceNumber;
}
public Date getPostingDate() {
return postingDate;
}
public void setPostingDate(Date postingDate) {
this.postingDate = postingDate;
}
public int getReadCount() {
return readCount;
}
public void setReadCount(int readCount) {
this.readCount = readCount;
}
public String getWriterName() {
return writerName;
}
public void setWriterName(String writerName) {
this.writerName = writerName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public int getLevel() { //게시글의 중첩 레벨 구하는 메소드
if(sequenceNumber == null) { //글이 없다면
return -1;
}
if(sequenceNumber.length() != 16) {
return -1;
}
if(sequenceNumber.endsWith("999999")) { //순서번호가 999999 -> 루트글이면 0리턴
return 0;
}
if(sequenceNumber.endsWith("9999")) { //답변글이면 1 리턴
return 1;
}
if(sequenceNumber.endsWith("99")) { //답변의 답변글이면 2 리턴
return 2;
}
return 3; //답변의 답변의 답변
}
}
- 각 필드에 대한 get/set 메소드 제공
- 화면에 중첩 단계를 표시하거나 답변글을 등록할 때 부모 글의 중첩 단계를 제공하기 위해 중첩 레벨 구하는 메소드를 추가함
출처: 최범균의 JSP2.1

'Dev > Java' 카테고리의 다른 글
파일 전송을 위한 multipart/form-data (0) | 2022.09.27 |
---|---|
게시판 작업시 싱글톤 패턴을 이용하는 이유 (0) | 2022.09.27 |
JSTL - 코어 태그 2 (if, choose, forEach, forTokens) (0) | 2022.09.22 |
JSTL - 코어 태그 <c:set>, <c:remove> (0) | 2022.09.21 |
표준 태그 라이브러리(JSTL) (0) | 2022.09.21 |
댓글