ERD 설계와 JPA 활용

이민기·2023년 11월 12일
1

2주차 주제로 나온 것은 ERD 설계와 JPA를 통해서 DB에 적용해보는 것입니다.

1. 기본 설정

지난 번 설정했을 때는 빼먹었던 것이 있어, 추가적인 설정을 했습니다.

spring:
    jpa:
        hibernate:
            ddl-auto: create

위와 같이 JPA를 사용하니 추가적으로 ddl-auto 설정을 해주어야 하는데, 여기에는 몇 가지 옵션이 적용 가능합니다.

  • create : 기존 테이블 삭제 후 다시 생성
  • create-drop : create와 동일하나 종료 시점에 table 삭제
  • update : 주어진 구조에 따라 엔티티 변경
  • validate : 정상 매핑 되었는지만 확인
  • none: 변화 없음

실제 서비스 배포시에는 create, create-drop등은 사용하지 않습니다.

2. ERD 설계 및 근거

우선 ERD 설계에 대한 근거입니다. 익명 게시판을 생각하였고, 게시글 하나에는 여러 개의 댓글이 달릴 수 있다고 생각해 1:N의 관계로 상정하였습니다.

포스트 테이블을 보면 Post_Id를 PK로 설정하여 작성자, 비밀번호, 제목, 내용이 들어갑니다. 비슷하게 댓글 테이블에도 적용됩니다.

3. Entity 설계

Post 엔티티

package com.example.gdsctuk.entity;

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

import java.util.List;

@Getter
@Entity
@Table
@Builder
public class Post {

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

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

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

    @Column
    private String postWriter;

    @Column
    private String postPasswd;

    @OneToMany(mappedBy = "post")
    private List<Comment> comments;
    public Post() {}

    public Post(Long postId, String title, String content, String postWriter, String postPasswd) {
        this.postId = postId;
        this.title = title;
        this.content = content;
        this.postWriter = postWriter;
        this.postPasswd = postPasswd;
    }
}

Comment 엔티티

package com.example.gdsctuk.entity;

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

@Entity
@Getter
@Table
public class Comment {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "comment_id")
    private Long id;

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

    @Column
    private String user;

    @Column
    private String commentPasswd;

    @ManyToOne
    @JoinColumn(name="postId")
    private Post post;
    public Comment() {
    }
    @Builder
    public Comment(Long id, String content, String user, String commentPasswd) {
        this.id = id;
        this.content = content;
        this.user = user;
        this.commentPasswd = commentPasswd;
    }


}

4. 관련 애너테이션 설명

@Id - 클래스 필드 위에 선언해, 해당 Entity의 기본키임을 지정합니다.
@GenerateValue - 기본 키를 자동 생성하는 전략입니다.

  • strategy를 통해 생성 전략을 설정합니다.
    - Identity: 기본 키 생성을 DB에 위임해, 기본 키 생성 로직을 따라갑니다.
    - Sequence: DB의 시퀀스 오브젝트를 사용합니다.
    (시퀀스: 유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트)
  • Table: 키 생성 전용 테이블을 하나 만들고, 이를 사용합니다.
  • Auto: JPA 구현체가 자동으로 생성 전략을 결정합니다.

@Column - 객체 필드를 테이블 컬럼에 매핑합니다.

  • name: 필드와 매핑할 테이블 컬럼의 이름을 지정합니다.
    - 기본값: 객체의 필드 이름

@Getter - 자동으로 Getter를 실행할 수 있습니다.
@Builder - Builder 패턴을 자동으로 구현해줍니다.
https://johngrib.github.io/wiki/pattern/builder/

@OnetoMany, @ManytoOne

  • @OneToMany, @ManyToOne 은 사용되는 Entity가 누구냐에 따라 달라지는 것이고, 실제로는 같은 관계입니다.
  • 부모 Entity 에서는 @OneToMany, 자식 Entity 에서는 @ManyToOne이 됩니다.
  • 그렇기 때문에 양방향으로 @OneToMany 를 사용하면 자식 Entity 에는 @ManyToOne 이 같이 사용됩니다.
  • 추가로 @OnetoMany에 mappedBy 속성을 추가해 자식 Entity와의 관계를 설정합니다.

5. ERD 실행 결과

최종적으로는 이렇게 보게 됩니다!

profile
Michelangelo

0개의 댓글