s00jin 님의 블로그

7. [게시판] Spring Boot/Mysql을 사용한 CRUD 게시판 만들기 | 게시판 엔티티 설계 및 구현 본문

프로젝트/하고 싶은거 다해보는 내 사이트

7. [게시판] Spring Boot/Mysql을 사용한 CRUD 게시판 만들기 | 게시판 엔티티 설계 및 구현

s00jin 2025. 8. 21. 15:42

 

데이터 베이스 연결

 

2025.06.26 - [프로젝트/하고 싶은거 다해보는 내 사이트] - 1. [MySQL/SpringBoot] 로컬 MySQL 연결하기

 

1. [MySQL/SpringBoot] 로컬 MySQL 연결하기

1. 로컬 MySQL 데이터베이스 생성로컬 MySQL에 데이터베이스를 먼저 만들고, 연결을 진행한다. 2. application.propertiesspring.datasource.driver-class-name=com.mysql.cj.jdbc.Driverspring.datasource.url=jdbc:mysql://localhost:3306/

s00jin.tistory.com

 

전에 쓴 글에 로컬 MySQL 연결하는 법이 나왔있다.

 

MySQL 연결 후 jpa 라이브러리 사용을 위해 설치해준다.

 

 

build.gradle 에 아래 코드를 추가해준 후 새로 실행해준다.

implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

 

application.properties에 아래 코드를 추가해준다

spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

위 설정을 추가해주면 서버를 새로 실행할때마다, 변경 사항이 있는 부분만 데이터베이스에 반영된다.

 


엔티티

게시판 엔티티

id 게시판 고유 번호
subject 제목
content 내용
createDate 생성일

댓글 엔티티

id 댓글 고유 번호
content 댓글 내용
createDate 생성일
board 어떤 게시판의 댓글인지

 


게시판 엔티티 구현

우선 게시판 관련 코드를 작성할 webBoard 패키지를 만들어줬다.

 

패키지 안에 가독성이 좋도록 domain 패키지를 만들고 그 안에 Board 파일을 생성 후 작성했다.

package org.mySite.webBoard.domain;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;

import java.time.LocalDateTime;

@Getter
@Setter  // todo : setter 제거하기
@Entity  // 엔티티로 만들기 위해 애터네이션 적용
public class Board {

    @Id  // 기본키로 지정
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(length = 200)  // 열 길이 200으로 설정
    private String subject;

    @Column(columnDefinition = "TEXT")  // columnDefinition은 열 데이터의 유형이나 성격을 정의 (TEXT = 텍스트를 열 데이터로 = 글자 수 제한 없음)
    private String content;

    private LocalDateTime createDate;
}

 

@Entity

  • 엔티티로 만들기 위해 사용

@Id

  • 기본키 지정

@GeneratedValue

  • 데이터 저장시 속성 값을 일일이 입력하지 않아도 자동으로 1씩 증가하여 저장
  • strategy = GenerationType.IDENTITY
    • 고유한 번호를 생성하는 방법을 지정하는 부분

@Column

  • 열의 세부 설정을 위해 사용
  • length는 열의 길이를 설정할 때 사용
  • columnDefinition은 열 데이터의 유형이나 성격을 정의할 때 사용
    • TEXT : 텍스트를 열 데이터로 넣을 수 있음 (글자 수 제한 X)

코드를 작성하고 실행하면 데이터베이스에서 테이블이 생성된걸 확인할 수 있다.

 

엔티티의 속성 이름과 테이블의 열 이름의 차이

카멜 케이스 형식의 이름은 모두 소문자로 변경되고 단어가 언더바(_)로 구분되어 데이터베이스 테이블의 열 이름이 됨

* createDate → create_date 
엔티티를 만들 때 Setter 메서드 사용은 지양

엔티티는 데이터베이스와 바로 연결되므로 데이터를 자유롭게 변경할 수 있는 Setter 메서드를 허용하는 것이 안전하지 않음
→ 데이터를 변경해야 할 경우 메서드를 추가로 작성

 


댓글 엔티티 구현

webBoard.domin 패키지 안에 Comment 파일을 만들어줬다.

package org.mySite.webBoard.domain;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;

import java.time.LocalDateTime;

@Getter
@Setter
@Entity
public class Comment {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

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

    private LocalDateTime createDate;

    @ManyToOne
    private Board board;
}

 

댓글 엔티티는 게시판 엔티티와 크게 달라진게 없다.

단지 게시판 엔티티를 참조하기 위해 board 가 추가됐다.

  • @ManyToOne 엔티티를 사용해 게시판 엔티티와 연결된 속성이라는 것을 댓글 엔티티에 표시해준다
  • N:1
  • 데이터베이스에서 외래키 관계가 생성됨

댓글을 통해 게시판의 제목을 알고 싶다면

comment.getBoard().getSubject()


게시판에서 댓글 참조하기

댓글과 게시판이 N:1 관계이므로, 게시판과 댓글은 1:N 관계로 설정해줘야 한다.

  • @ManyToOne → @OneToMany
  • 게시판 하나에 댓글은 여러개이므로 Board 엔티티에 추가할 Comment 속성은 List 형태로 구성해야 함

수정된 Board 파일

package org.mySite.webBoard.domain;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;

import java.time.LocalDateTime;
import java.util.List;

@Getter
@Setter  // todo : setter 제거하기
@Entity  // 엔티티로 만들기 위해 애터네이션 적용
public class Board {

    @Id  // 기본키로 지정
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(length = 200)  // 열 길이 200으로 설정
    private String subject;

    @Column(columnDefinition = "TEXT")  // columnDefinition은 열 데이터의 유형이나 성격을 정의 (TEXT = 텍스트를 열 데이터로 = 글자 수 제한 없음)
    private String content;

    private LocalDateTime createDate;

    // 게시판에서 댓글 참조
    @OneToMany(mappedBy = "board", cascade = CascadeType.REMOVE)
    private List<Comment> commentList;

}

 

board.getCommentList() 호출 시 게시판에서 댓글 참조 가능하다

mappedBy

  • 참조 엔티티의 속성명을 정의
  • 즉 댓글 엔티티에서 게시판 엔티티를 참조한 속성인 board를 mappedBy에 전달

CascadeType.REMOVE

  • 게시판 삭제 시 해당 게시판 댓글도 전부 삭제되도록

 

위 코드까지 다 작성후 실행하면, comment 테이블이 생성된 것을 확인할 수 있을 것이다