JPA - @GeneratedValue 전략

킹콩(King Kong)·2024년 12월 30일

JPA의 @GeneratedValue 어노테이션은 기본 키를 자동으로 생성하는 방식을 지정할 때 사용합니다. strategy 속성을 통해 다양한 키 생성 전략을 설정할 수 있으며, 각각의 방식은 데이터베이스 및 사용 사례에 따라 적합한 경우가 다릅니다.

@GeneratedValue 전략 종류

1. GenerationType.AUTO

설명: JPA 구현체(예: Hibernate)가 데이터베이스에 맞는 적절한 생성 전략을 자동으로 선택합니다.

장점: 데이터베이스에 따라 설정이 자동으로 조정되므로 코드 변경 없이 다른 DB로 마이그레이션하기 편리합니다.

단점: 데이터베이스별로 동작이 다를 수 있어 예상치 못한 문제가 발생할 가능성이 있습니다.

사용 예시:

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

2. GenerationType.IDENTITY

설명: 데이터베이스의 AUTO_INCREMENT 또는 IDENTITY 컬럼을 사용하여 키를 생성합니다. 기본 키는 데이터베이스에서 직접 관리됩니다.

장점:

간단하고 효율적입니다.

각 INSERT 실행 시 데이터베이스가 고유 키를 생성하므로 추가 설정이 필요 없습니다.

단점:

INSERT가 수행된 이후에야 ID 값이 설정되므로, 배치(insert batch)와 같은 최적화 기술을 사용할 때 제약이 있을 수 있습니다.

사용 예시:

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

3. GenerationType.SEQUENCE

설명: 데이터베이스의 시퀀스를 사용하여 키를 생성합니다. JPA는 먼저 시퀀스에서 ID 값을 가져오고 이를 INSERT 문에 포함시킵니다.

장점:

배치 처리나 최적화가 필요할 때 유리합니다.

데이터베이스에 시퀀스를 직접 관리하도록 하여 고유 ID를 생성합니다.

단점:

시퀀스를 지원하지 않는 데이터베이스(MySQL 등)에서는 사용할 수 없습니다.

시퀀스 생성 예시 (PostgreSQL):

CREATE SEQUENCE sample_sequence START 1 INCREMENT 1;

사용 예시:

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sample_seq")
@SequenceGenerator(name = "sample_seq", sequenceName = "sample_sequence", allocationSize = 1)
private Long id;

4. GenerationType.TABLE

설명: 테이블을 사용하여 키 값을 관리합니다. 별도의 테이블에서 키 값을 읽고 증가시켜 기본 키로 사용합니다.

장점: 모든 데이터베이스에서 사용할 수 있습니다.

단점: 성능이 낮습니다. 일반적으로 권장되지 않습니다.

테이블 생성 예시:

CREATE TABLE hibernate_sequence (
sequence_name VARCHAR(255) NOT NULL,
next_val BIGINT NOT NULL,
PRIMARY KEY (sequence_name)
);
INSERT INTO hibernate_sequence(sequence_name, next_val) VALUES ('sample_sequence', 1);

사용 예시:

@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "sample_table")
@TableGenerator(
name = "sample_table",
table = "hibernate_sequence",
pkColumnName = "sequence_name",
valueColumnName = "next_val",
pkColumnValue = "sample_sequence",
allocationSize = 1
)
private Long id;


전략 선택 가이드

  1. MySQL/MariaDB: GenerationType.IDENTITY 추천
    MySQL은 기본적으로 AUTO_INCREMENT를 지원하므로 효율적입니다.
  1. PostgreSQL: GenerationType.SEQUENCE 추천
    PostgreSQL은 시퀀스를 기본적으로 지원하므로 유용합니다.
  1. H2 (테스트용): GenerationType.AUTO 추천
    테스트 환경에서 데이터베이스에 맞는 적절한 전략을 자동으로 선택합니다.
  1. 데이터베이스 호환성 필요: GenerationType.TABLE
    모든 데이터베이스에서 동일한 방식으로 작동하도록 설정하려면 TABLE을 사용할 수 있지만 성능은 낮습니다.

요약

단순하고 빠르게: IDENTITY

최적화 필요: SEQUENCE

호환성 중요: TABLE

자동 선택: AUTO

profile
IT를 쉽게 이해해 보아요~😄

0개의 댓글