Spring/블로그 프로젝트

[Blog 프로젝트] JPA를 사용하여 DB에 테이블 생성

hyunsb 2023. 3. 2. 23:47

이 문서는 스프링부트 Blog 프로젝트에서 User, Board, Reply 테이블을 생성하는 방법을 설명합니다. 각 클래스의 필드와 어노테이션을 사용하여 테이블을 생성하고, ERD를 통해 관계를 확인할 수 있습니다.

User, Board, Reply 테이블 생성을 위해 각 클래스를 생성하고 필드와 어노테이션을 사용하여 테이블을 생성합니다

 

JPA - MySQL 연동은 해당 포스팅을 참고해주세요.

 

[Spring Boot] JPA - MySql 연결

build.gradle에 mysql-connecter를 추가하고 빌드하여 의존성을 주입합니다. dependencies { runtimeOnly 'com.mysql:mysql-connector-j' } application.properties에 mysql DB 서버 연결에 대한 설정값을 추가한다. spring.datasource.dr

hyunsb.tistory.com

 

UserTable 생성을 위한 User Class 생성

// ORM: Object 를 테이블로 매핑해주는 기술
@Entity // User 클래스를 통하여 MySQL에 테이블 생성
@Data
@NoArgsConstructor // 빈 생성자
@AllArgsConstructor // 모든 생성자
@Builder // 빌더 패턴
public class User {

    @Id // Primary Key
    @GeneratedValue(strategy = GenerationType.IDENTITY) // 프로젝트에 연결된 DB의 넘버링 전략을 따라간다.
    private int id; // 보통 long 타입으로 설정, 오라클: sequence, MySQL: auto_increment

    @Column(nullable = false, length = 30, unique = true)
    private String username; // 아이디

    @Column(nullable = false, length = 100)
    private String password; // 패스워드

    @Column(nullable = false, length = 50)
    private String email; // 이메일

    @ColumnDefault("'user'")
    private RoleType role; // admin, user, manager 등의 권한을 지정

    @CreationTimestamp // 시간 자동으로 입력
    private Timestamp createDate; // 가입날짜

}

User 클래스의 경우, username, password, email, role 등 필드를 포함하며, 이메일과 유저명은 각각 unique와 not-null 옵션을 추가하였습니다.

public enum RoleType {
    USER, ADMIN
}

 

클래스 생성 후 서버를 실행 시키면

쿼리문이 실행되는 것을 확인할 수 있습니다.

 

실제로 데이터베이스에 테이블이 생성되었는지 확인해보면

정상적으로 테이블이 생성된 것을 확인할 수 있습니다.

이제 나머지 클래스도 생성해주고 서버를 실행시켜 테이블을 생성합니다.

Board 테이블 생성

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Entity
public class Board {

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

    @Column(nullable = false, length = 100)
    private String title;

    @Lob // 대용량 데이터
    private String content; // 섬머노트 라이브러리 사용: <html> 태그가 섞여서 디자인 됨

    @ColumnDefault("0")
    private int count; // 조회수 카운트

    @ManyToOne(fetch = FetchType.EAGER) // board (N) : user (1)
    @JoinColumn(name = "userId")
    private User user; // DB는 오브젝트를 저장할 수 없다. FK를 사용한다. ORM이 자동으로 FK 생성

    @OneToMany(mappedBy = "board", fetch = FetchType.EAGER) // mappedBy: 연관관계의 주인이 아니다. (FK가 아니다) DB에 칼럼 생성 X
    private List<Reply> reply;

    @CreationTimestamp
    private Timestamp createDate;
}

Board 클래스에서는 user 필드에 ManyToOne 어노테이션을 사용하여 User와의 관계를 설정하였으며, 대용량 데이터를 포함하므로 Lob 어노테이션을 사용하였습니다.

Reply 테이블 생성

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Entity
public class Reply {

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

    @Column(nullable = false, length = 200)
    private String content;

    @ManyToOne
    @JoinColumn(name = "boardId")
    private Board board;

    @ManyToOne
    @JoinColumn(name = "userId")
    private User user;

    @CreationTimestamp
    private Timestamp createDate;

}

Reply 클래스의 경우 Board와 User 클래스와의 관계를 설정해주었으며, 이를 위해 ManyToOne 어노테이션을 사용하였습니다. 또한, createDate 필드를 CreationTimestamp 어노테이션을 사용하여 자동으로 입력되도록 설정하였습니다.

ERD

 

application.properties 혹은 application.yml의 spring.jpa.hibernate.ddl-auto 옵션이 create로 설정 되어 있다면 서버가 실행될 때마다 데이터베이스 테이블이 생성됩니다. 따라서 테이블 생성 이후 해당 옵션을 update로 바꾸어 주어 테이블이 재생성 되지 않도록 해줍니다.

spring.jpa.hibernate.ddl-auto=update