[SpringBoot] 단일 엔티티 매핑

LaStella·2023년 4월 11일

간단하게 REST API를 만들기 위한 주문 ERD입니다.
주문 도메인을 구성하는 단일 엔티티를 만들고, 이들의 연관관계를 설정합니다.

단일 엔티티 매핑

JPA는 엔티티 객체를 생성ㄴ할 때, 기본 생ㄴ성자(Default Constructor)를 사용합니다.

@Entity

속성기능기본값
nameJPA에서 사용할 엔티티 이름을 지정합니다.클래스 이름

@Table

속성기능기본값
name매핑할 테이블 이름을 지정합니다.엔티티 이름
@Entity
@Table(name = "member")
public class Member {
    @Id
    private long id;
    private String name;
    private String nickName;
    private int age;
    private String address;
    private String description;
    
    // getter, setter
}

데이터 베이스 스키마 자동생성

spring:
  h2:
    console:
      enabled: true
  jpa:
    generate-ddl: true
    hibernate:
      ddl-auto: create-drop
    database: H2
    show-sql: true
    open-in-view: false
    properties:
      hibernate:
        query.in_clause_parameter_padding: true

generate-ddl : Entity설정을 참고하여 Spring Application 실행시점에 Hibernate에서 자동으로 DDL을 생성하는 설정을 할 수 있습니다. (true or false)

DDL?

DDL(Data Definition Language)
데이터 정의어란? 데이터베이스를 정의하는 언어이며, 데이터를 생성, 수정, 삭제하는 등의 데이터의 전체의 골격을 결정하는 역할을 하는 언어입니다.

  • 대표적으로 CREATE, ALTER, DROP, RENAME, TRUNCATE가 있습니다.

AUTO DDL 옵션

  • create : 기존 테이블을 삭제하고 새로 테이블을 생성합니다. (DROP + CREATE) (주로 개발 단계에서 사용)
  • create-drop : 어플리케이션 종료시 생성한 DDL을 제거합니다. (DROP + CREATE + DROP) (주로 개발 단계에서 사용)
  • update : 테이블, 엔티티 매핑 정보를 비교하여 변경사항을 수정합니다. (주로 테스트 단계에서 사용)
  • validate : 테이블, 엔티티 매핑 정보를 비교해서 차이가 있으면 경도를 남겨 어플리케이션을 실행하지 않습니다. (주로 운영단계에서 사용)
  • none : 자동 생성 기능을 사용하지 않습니다.

DDL 옵션

@Entity
@Table (name = "member")
@Getter
@Setter
public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private Long id;
    
    @Column(name = "name", nullable = false, length = 30)
    private String name;
    
    @Column(nullable = false, length = 30, unique = true)
    private String nickName;
    
    private int age;
    
    @Column(name = "info", nullable = false)
    private String address;
    
    @Column(name = "description", nullable = true)
    private String description;
}
  • @Column
    • name : 필드와 매핑할 테이블의 컬럼 이름을 설정합니다.
      • 명시해주지 않으면 기본적으로 필드명을 따라가며 카멜케이스는 스네이크케이스로 변경합니다.
      • ex nickName -> nick_name
    • nullalbe : false인 경우 @NotNull, null값 허용 여부를 설정합니다. (@NotNull사용 권장)
    • length : String타입에서만 사용 가능, 문자 길이를 설정합니다.
    • unique : 유니크 제약조건을 설정합니다.

기본키 매핑전략

직접 할당

영속화 전에 애플리케이션에서 직접 값을 할당한다.

@Id
@Column(name = "id")
private Long id;

직접 할당

영속화 전에 애플리케이션에서 직접 값을 할당한다.

@Id
@Column(name = "id")
private Long id;

SEQUENCE

데이터베이스 시퀀스에서 식별자 값을 획득한 후 영속화합니다.
ORACLE, H2

@Id
@Column(strategy = GenerationType.SEQUENCE)
private Long id;

TABLE

데이터베이스 시퀀스 생성용 테이블에서 식별자 값을 획득한 후 영속화합니다.
자주 사용하는 전략이 아닙니다.

IDENTITY

데이터베이스 엔티티를 저장해서 식별자 값을 획득한 후 영속화합니다.
엔티티가 영속화 되려면 식별자 값이 반드시 필요합니다.
DB에 INSERT되기 전까지 키값을 알 수 없으므로 em.persist() 시점에 INSERT쿼리가 수행됩니다.
MySQL (AUTO_INCREMENT)

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

AUTO

데이터베이스 방언(dialect)에 따라서 자동으로 전략을 선택합니다.
ex. ORACLE DB인 경우 SEQUENCE, MySQL인 경우 IDENTITY
실제 업계에서 주로 사용하는 전략입니다.

@Id
@Column(strategy = GenerationType.AUTO)
private Long id;

기타 컬럼 매핑

@Entity
@Table (name = "orders")
public class Order {
    @Id
    @Column (name = "id")
    private String uuid;
    
    @Column (name = "order_datetime", columnDefinition = "TIMESTAMP")
    private LocalDateTime orderDatetime;
    
    @Enumerated(EnumType.STRING)
    private OrderStatus orderStatus;
    
    @Lob
    private String memo;
}

columnDefinition = "TIMESTAMP" : DB엔진의 TIMESTAMP값을 저장하는데 사용합니다.
@Enumerated(EnumType.STRING) : EnumType값을 매핑합니다.
@Lob : 긴 텍스트를 넣고 싶을 때 사용합니다.

참고글

[JPA] DDL-AUTO 테이블 자동 생성 전략 - SQL Column 매칭
JPA - jpa hibernate의 ddl 자동생성 옵션과 초기화 전략
[스프링 부트 개념과 활용] 데이터 3. DB 초기화, 마이그레이션
DDL, DML, DCL 이란?
[JPA] nullable=false와 @NotNull 비교, Hibernate Validation

profile
개발자가 되어가는 중...

0개의 댓글