본문 바로가기
Dev/Java

(JSP2.1) 답변형 게시판 구현 - 테이블 생성과 Article 클래스

by vellahw 2022. 9. 26.

*오라클 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

 

댓글