본문 바로가기

카테고리 없음

스프링 부트를 사용하여 계층형 댓글을 구현한 게시판

1. 게시판 기능 구현을 위한 스프링 부트 프로젝트 생성

h2로 시작하기

스프링 부트에서는 내장형 데이터베이스로 H2를 사용하여 간단한 게시판 기능을 구현할 수 있습니다. H2는 인메모리 데이터베이스로써 별도의 설정 없이 사용할 수 있어 편리합니다.

스프링 부트 프로젝트 생성하기

먼저, 스프링 부트 프로젝트를 생성해야 합니다. 이를 위해 다음의 단계를 따릅니다.

  1. 이클립스(Eclipse)나 IntelliJ IDEA와 같은 IDE를 열고, 새로운 스프링 부트 프로젝트를 생성합니다.
  2. 프로젝트 이름과 패키지를 설정합니다.
  3. 필요한 의존성을 선택하여 프로젝트를 생성합니다.

H2 데이터베이스 설정하기

H2 데이터베이스를 사용하기 위해 application.properties 파일에 다음과 같은 설정을 추가합니다.

spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console

위 설정은 H2 데이터베이스의 URL을 설정하고, 데이터베이스 드라이버 클래스를 지정하는 내용입니다. 또한, H2 콘솔을 활성화하기 위한 설정을 추가합니다.

H2 콘솔 사용하기

spring.h2.console.enabled=true 설정을 추가했기 때문에, /h2-console 경로로 H2 콘솔에 접속할 수 있습니다. 웹 브라우저에서 http://localhost:8080/h2-console에 접속하여 H2 콘솔을 사용할 수 있습니다.

이제 스프링 부트 프로젝트를 생성하고, H2 데이터베이스를 설정하고, H2 콘솔을 사용할 수 있습니다. 이를 바탕으로 게시판 기능을 구현할 준비가 되었습니다.

2. 데이터베이스 모델링과 댓글 테이블 설계

h2로 시작하기

댓글 기능을 구현하기 위해 데이터베이스 모델링과 댓글 테이블을 설계해야 합니다. H2 데이터베이스에서는 다음과 같은 테이블 구조를 사용할 수 있습니다.

게시글 테이블 (posts)

컬럼명 타입 설명
id INT 고유 식별자
title VARCHAR 제목
content TEXT 내용
created_at TIMESTAMP 작성 시간
updated_at TIMESTAMP 수정 시간

댓글 테이블 (comments)

댓글은 계층형 구조를 갖기 위해 본인 댓글과 부모 댓글의 관계를 유지해야 합니다. 따라서, 댓글 테이블에 다음과 같은 컬럼을 추가합니다.

컬럼명 타입 설명
id INT 고유 식별자
content TEXT 내용
created_at TIMESTAMP 작성 시간
updated_at TIMESTAMP 수정 시간
post_id INT 댓글이 속한 게시글 ID
parent_id INT 부모 댓글의 ID

위와 같은 테이블 구조를 설계하면 게시글과 댓글 간의 관계를 구현할 수 있습니다. 이제 데이터베이스 모델링과 댓글 테이블 설계가 마무리되었습니다. 이를 바탕으로 실제 코드를 작성할 수 있습니다.

3. 계층형 댓글 구조를 위한 댓글 DTO, Entity 및 Repository 구성

h2로 시작하기

댓글 기능을 구현하기 위해 댓글 DTO, Entity 및 Repository를 구성해야 합니다. 이를 위해 다음과 같은 단계를 따릅니다.

댓글 DTO (CommentDTO)

먼저, 댓글의 데이터를 전달하기 위한 DTO(Data Transfer Object)를 작성합니다. DTO는 댓글의 내용과 작성 시간 정보를 가지고 있습니다. CommentDTO는 다음과 같은 구조로 작성할 수 있습니다.

public class CommentDTO {
    private Long id;
    private String content;
    private LocalDateTime createdAt;

    // Getter and Setter
}

댓글 Entity (CommentEntity)

데이터베이스에 댓글을 저장하기 위한 Entity를 작성합니다. CommentEntity는 CommentDTO와 동일한 구조를 가지고 있으며, 추가적으로 게시글과 댓글 계층 관계를 설정하기 위한 필드를 추가할 수 있습니다. CommentEntity는 다음과 같이 작성할 수 있습니다.

@Entity
@Table(name = "comments")
public class CommentEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(columnDefinition = "TEXT")
    private String content;

    private LocalDateTime createdAt;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "post_id")
    private PostEntity post;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "parent_id")
    private CommentEntity parentComment;

    // Getter and Setter
}

위 코드에서 post 필드는 해당 댓글이 속한 게시글을 참조하고, parentComment 필드는 해당 댓글의 부모 댓글을 참조합니다.

댓글 Repository (CommentRepository)

데이터베이스와의 CRUD(Create, Read, Update, Delete) 작업을 수행하기 위한 Repository를 작성합니다. CommentRepository는 다음과 같이 작성할 수 있습니다.

@Repository
public interface CommentRepository extends JpaRepository<CommentEntity, Long> {
    List<CommentEntity> findByPostId(Long postId);
    List<CommentEntity> findByParentCommentId(Long parentCommentId);
}

위 코드에서 findByPostId 메서드는 게시글 ID를 기준으로 댓글을 조회하며, findByParentCommentId 메서드는 부모 댓글 ID를 기준으로 자식 댓글을 조회합니다.

이제 댓글 기능을 구현하기 위한 댓글 DTO, Entity 및 Repository가 준비되었습니다. 이를 바탕으로 실제 코드를 작성하고 게시판 기능을 완성할 수 있습니다.