organize/프로젝트

justBoard11 댓글 구현(1) DB

001cloudid 2024. 10. 10. 15:05
728x90

댓글을 구현해보고자 한다.

 

객체

댓글과 관련된 객체를 먼저 어디에 무엇을 만들지 먼저 생각해 보도록 하자.

티스토리의 댓글을 살펴보면 댓글 작성자, 댓글 내용, 댓글 작성 시간, 비밀글 여부 이렇게 생각해 볼 수 있다.

DTO를 새로 만들어도 될 것 같고, 아니면 기존에 있던 BoardDTO에 객체를 추가하는 방법이 있을 것 같다.

 

만약 새로운 ReplyDTO를 만든다면

String id, String replyContent, boolean replyHidden, Timestamp replyWriteTime 이렇게 객체를 만들면 될 것 같다.

 

BoardDTO에 객체를 추가하는 식으로 한다면

String replyContent, boolean replyHidden, Timestamp replyWriteTime을 추가해 주면 될 것이다.

 

또한 댓글의 댓글을 작성할 경우를 생각해보아야 한다.

댓글과 대댓글

댓글이 작성될 때마다 한 칸씩 늘어가는 방식보다는 한 댓글에 대댓글을 나열하는 방식으로 만들고자 한다. 댓글 그룹이 필요할 것이고, 들여 쓰기와 답글 순서가 필요할 것이다.

int re_ref 댓글그룹, int re_lev 들여쓰기, int re_seq 답글순서도 함께 추가해야 할 것이다.

 

구현

모두 로그인을 해야할 수 있는 기능들이다.

 

1. 일반 댓글과 비밀 댓글

비밀글 체크박스를 둔다. 체크하고 댓글을 작성했을 때 비밀글이 되며, 글의 작성자와 비밀 댓글 작성자만 볼 수 있으며, 그렇지 않은 이용자는 "비밀 댓글이므로 접근할 수 없습니다."라고 구현할 것이다. 이는 어렵지 않게 구현할 수 있을 것 같다. 체크박스를 체크하면 replyHidden이 true가 되게 로직을 짜면 될 것이고, jstl을 이용해서 작성자와 댓글 작성자를 확인하는 과정을 거치면 어렵지 않을 것이다.

 

2. 위에서 언급했듯이 처음 작성하는 댓글 re_lev을 0으로 설정하고 그 댓글의 대댓글을 re_lev 1로 설정 그 아래로 계속 대댓글의 댓글을 re_lev 1로만 설정하면 댓글과 대댓글 그림과 같이 구현할 수 있을 것 같다.

 

4. 댓글 수정, 삭제 시 어떻게 구현할지에 대해 두 가지 방법이 있는데 뭘로 할지 아직도 고민 중이다. 수정, 삭제되었을 때 그냥 깔끔하게 완전히 삭제될 것이냐, 아니면 작성자가 삭제했습니다. 와 같은 방식으로 할지... 나는 깔끔한 걸 좋아해서 완전히 삭제되는 것을 선호하나 이것은 둘 다 구현해 보도록 할 예정이다. 만약 작성자가 삭제했습니다. 이 방법으로 구현하려고 하려면 객체가 추가되어야 하므로, 먼저 완전히 삭제되는 방식으로 먼저 구현해 볼 예정이다.

 

5. 

댓글을 작성했을 때 페이지가 새로고침 되지 않고 곧장 글이 작성된다. 이 부분은 ajax를 이용한 것 같은데 기본적인 기능을 모두 구현한 후 마지막에 구현하는 것으로 생각해 볼 예정이다.


DTO 및 테이블 생성

 먼저 DTO를 어떻게 해야할지 검색하다가 참고할 만한 정리 글을 보았다. https://velog.io/@cyseok123/%EB%8C%93%EA%B8%80, https://devofroad.tistory.com/59 나중에 막힐 때 힌트식으로 참고하면 될 것 같다. 구현해 놓은 곳을 찾아보면 새로운 DTO(VO)를 만들어서 제작하는 것 같다.

그렇다면 왜 따로 만들까? 궁금증이 생겨 찾아봤지만 결국 원하는 대답을 찾기 어려웠다. 무엇보다 어떻게 검색을 해야 할지 어려웠다. 여기에서는 ChatGPT의 도움을 받았다.

  1. BoardDTO에 댓글 객체 추가
    장점
    구조가 단순해져서 게시판과 댓글을 함께 다룰 수 있어 편리함
    댓글 수가 적고 게시글과 강하게 연관되어 있는 경우, 데이터 조회 시 편리함
    단점
    댓글 수가 많아지거나 복잡한 기능(대댓글, 좋아요 등)을 추가할 경우 DTO가 비대해지고 관리하기 어려움
    게시글과 댓글의 독립적인 관리가 어려움

  2. ReplyDTO 클래스 만들기
    장점
    댓글 관련 기능을 독립적으로 관리할 수 있어 확장성이 높음
    게시글과 댓글의 책임을 분리하여 코드의 가독성과 유지보수성을 높일 수 있음
    단점
    댓글을 조회할 때 게시글과 댓글을 함께 조합해야 하므로 복잡성을 증가할 수 있음
    클래스와 연관 관계를 설정

다 따로 만드는 것에는 이유가 있었다. 새로운 클래스로 DTO를 만드는 방식으로 구현하도록 하겠다.

ReplyDTO

package com.mystory001.domain;

import java.sql.Timestamp;

public class ReplyDTO {
	
	private String id; //댓글 작성자
	private String replyConent; //댓글 내용
	private boolean replyHidden; //비밀글 여부(true → 비밀글, false → 일반글(default))
	private Timestamp replyWriteTime; //댓글 작성 시간
	private int re_ref; //댓글 그룹
	private int re_lev; //들여쓰기
	private int re_seq; //댓글 순서
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getReplyConent() {
		return replyConent;
	}
	public void setReplyConent(String replyConent) {
		this.replyConent = replyConent;
	}
	public boolean isReplyHidden() {
		return replyHidden;
	}
	public void setReplyHidden(boolean replyHidden) {
		this.replyHidden = replyHidden;
	}
	public Timestamp getReplyWriteTime() {
		return replyWriteTime;
	}
	public void setReplyWriteTime(Timestamp replyWriteTime) {
		this.replyWriteTime = replyWriteTime;
	}
	public int getRe_ref() {
		return re_ref;
	}
	public void setRe_ref(int re_ref) {
		this.re_ref = re_ref;
	}
	public int getRe_lev() {
		return re_lev;
	}
	public void setRe_lev(int re_lev) {
		this.re_lev = re_lev;
	}
	public int getRe_seq() {
		return re_seq;
	}
	public void setRe_seq(int re_seq) {
		this.re_seq = re_seq;
	}

}

 

테이블 생성

cmd로 스키마(데이터베이스) 조회를 하려고 했는데 예약어가 기억이 안났다. 데이터베이스 조회하기 show databases이다. 참고로 MySQL의 경우 스키마와 데이터베이스가 거의 동일한 의미이다.

use test 를 이용해서 데이터베이스를 사용하게 끔하고 테이블 생성

테이블을 생성하려고하니 PK를 뭘로해야할지에 대해 문제가 생겼다. 그래서 num이라는 컬럼 PK로 지정히기로 함. 기본키로만 사용하려고 만든 컬럼이다. 또한 ReplyDTO에도 num이라는 객체를 만들어줬으며 conent라고 오타가 있어 함께 수정했다.

package com.mystory001.domain;

import java.sql.Timestamp;

public class ReplyDTO {
	
	private String id; //댓글 작성자(FK - Member)
	private String replyContent; //댓글 내용
	private boolean replyHidden; //비밀글 여부(true → 비밀글, false → 일반글(default))
	private Timestamp replyWriteTime; //댓글 작성 시간
	private int re_ref; //댓글 그룹
	private int re_lev; //들여쓰기
	private int re_seq; //댓글 순서
	private int num; //댓글 번호(PK)
	
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getReplyContent() {
		return replyContent;
	}
	public void setReplyContent(String replyContent) {
		this.replyContent = replyContent;
	}
	public boolean isReplyHidden() {
		return replyHidden;
	}
	public void setReplyHidden(boolean replyHidden) {
		this.replyHidden = replyHidden;
	}
	public Timestamp getReplyWriteTime() {
		return replyWriteTime;
	}
	public void setReplyWriteTime(Timestamp replyWriteTime) {
		this.replyWriteTime = replyWriteTime;
	}
	public int getRe_ref() {
		return re_ref;
	}
	public void setRe_ref(int re_ref) {
		this.re_ref = re_ref;
	}
	public int getRe_lev() {
		return re_lev;
	}
	public void setRe_lev(int re_lev) {
		this.re_lev = re_lev;
	}
	public int getRe_seq() {
		return re_seq;
	}
	public void setRe_seq(int re_seq) {
		this.re_seq = re_seq;
	}

}

 

문뜩 boolean타입이 MySQL에 있었나라는 생각이 들었다. 그래서 과거 프로젝트에서 int로 구분했던 것 같은데.. 찾아보니

MySQL에서 BOOLEAN 타입이 없기 때문에 TINYINT(1)을 사용하여 BOOLEAN을 대신한다고 되어있다.

외래키 제약조건을 설정하지 않았다.

테이블을 수정하면서 외래키를 추가하고 싶다면

"alter table 테이블명 add foreign key(컬럼명) references 참조테이블(참조컬럼);"

만약 참조하는 테이블의 PK가 하나라면 참조컬럼은 생략 가능함.

 

테이블을 생성하고 수정하면 바로바로 구조 확인을 해주는 것이 필수이기 때문에 테이블 생성, 수정, 삭제를 했을 때 반드시 구조 확인하는 습관을 들여놨다.

 

일단 기본적으로 테이블 설계와 DTO를 설정해놨으니 남은 부분은 화면 그리고 기능 구현을 하면 될 것 같다.

728x90

'organize > 프로젝트' 카테고리의 다른 글

justBoard13 댓글 구현(3) 데이터  (0) 2024.10.13
justBoard12 댓글 구현(2) 화면  (1) 2024.10.12
justBoard10 마무리  (5) 2024.09.30
justBoard9  (1) 2024.09.29
justBoard8 게시판 클래스 작업  (0) 2024.09.28