기본키 생성 및 제약 조건과 @GeneratedValue의 네 가지 strategy에 대해 이해한다.

인프런 강의 참고

Goal

  • 기본 키 매핑 방법
  • 기본 키 자동 생성 전략 4가지
    • IDENTITY
    • SEQUENCE
    • TABLE
    • AUTO
  • 기본 키 생성 전략

기본 키 매핑

@Id @GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
  1. 직접 할당
    • @Id 만 사용
  2. 자동 생성
    • @Id와 @GeneratedValue를 같이 사용
    • 네 가지 전략이 있다.

자동 생성 전략 (네 가지)

IDENTITY

개념

public class Member {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id; 
}
// H2
create table Member (
  id varchar(255) generated by default as identity,
  ...
)
// MySQL
create table Member (
  id varchar(255) auto_increment,
  ...
)

특징

SEQUENCE

개념

@Entity
@SequenceGenerator(
  name = "MEMBER_SEQ_GENERATOR", 
  sequenceName = "MEMBER_SEQ", // 매핑할 데이터베이스 시퀀스 이름 
  initialValue = 1,
  allocationSize = 1)
public class Member {
  @Id
  @GeneratedValue(strategy = GenerationType.SEQUENCE,
                  generator = "MEMBER_SEQ_GENERATOR")
  private Long id; 
}
// 1부터 시작해서 1 증가 
create sequence MEMBER_SEQ start with 1 increment by 1

특징

@SequenceGenerator 속성

속성 설명 기본값
name 식별자 생성기 이름 필수
sequenceName 데이터베이스에 등록되어 있는 시퀀스 이름 hibernate_sequence
initialValue DDL 생성 시에만 사용됨, 시퀀스 DDL을 생성할 때 처음 1 시작하는 수를 지정한다. 1
allocationSize 시퀀스 한 번 호출에 증가하는 수 (성능 최적화에 사용), 데이터베이스 시퀀스 값이 하나씩 증가하도록 설정되어 있으면 이 값을 반드시 1로 설정해야 한다. 50
catalog, schema 데이터베이스 catalog, schema 이름  

TABLE

개념

@Entity
@SequenceGenerator(
  name = "MEMBER_SEQ_GENERATOR", 
  table = "MY_SEQUENCES", // 데이터베이스 이름 
  pkColumnValue = "MEMBER_SEQ",
  allocationSize = 1)
public class Member {
  @Id
  @GeneratedValue(strategy = GenerationType.TABLE,
                  generator = "MEMBER_SEQ_GENERATOR")
  private Long id; 
}
create table MY_SEQUENCES (
  sequence_name varchar(255) not null,
  next_val bigint,
  primaty key ( sequence_name )
)

특징

@TableGenerator 속성

속성 설명 기본값
name 식별자 생성기 이름 필수
table 키 생성 테이블 명 hibernate_sequences
pkColumnName 시퀀스 컬럼명 sequence_name
valueColumnNa 시퀀스 값 컬럼명 next_val
pkColumnValue 키로 사용할 값 이름 엔티티 이름
initialValue 초기 값, 마지막으로 생성된 값이 기준 0
allocationSize 시퀀스 한 번 호출에 증가하는 수 (성능 최적화에 사용) 50
catalog, schema 데이터베이스 catalog, schema 이름  
uniqueConstraints(DDL) 유니크 제약 조건을 지정할 수 있다.  

AUTO

개념

권장하는 식별자 전략

기본 키 제약 조건

  1. null이 아니다.
  2. 유일하다.
  3. 변하면 안된다.

권장하는 식별자 구성 전략

(Long형) + (대체키) + (적절한 키 생성 전략) 사용

  1. Long Type (아래 참고)
  2. 대체키 사용: 랜덤 값, 유휴 ID 등 비즈니스와 관계없는 값 사용
  3. AUTO_INCREMENT 또는 Sequnce Object 사용

관련된 Post

Reference