JPA의 @GeneratedValue 어노테이션은 기본 키를 자동으로 생성하는 방식을 지정할 때 사용합니다. strategy 속성을 통해 다양한 키 생성 전략을 설정할 수 있으며, 각각의 방식은 데이터베이스 및 사용 사례에 따라 적합한 경우가 다릅니다.
설명: JPA 구현체(예: Hibernate)가 데이터베이스에 맞는 적절한 생성 전략을 자동으로 선택합니다.
장점: 데이터베이스에 따라 설정이 자동으로 조정되므로 코드 변경 없이 다른 DB로 마이그레이션하기 편리합니다.
단점: 데이터베이스별로 동작이 다를 수 있어 예상치 못한 문제가 발생할 가능성이 있습니다.
사용 예시:
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
설명: 데이터베이스의 AUTO_INCREMENT 또는 IDENTITY 컬럼을 사용하여 키를 생성합니다. 기본 키는 데이터베이스에서 직접 관리됩니다.
장점:
간단하고 효율적입니다.
각 INSERT 실행 시 데이터베이스가 고유 키를 생성하므로 추가 설정이 필요 없습니다.
단점:
INSERT가 수행된 이후에야 ID 값이 설정되므로, 배치(insert batch)와 같은 최적화 기술을 사용할 때 제약이 있을 수 있습니다.
사용 예시:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
설명: 데이터베이스의 시퀀스를 사용하여 키를 생성합니다. 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;
설명: 테이블을 사용하여 키 값을 관리합니다. 별도의 테이블에서 키 값을 읽고 증가시켜 기본 키로 사용합니다.
장점: 모든 데이터베이스에서 사용할 수 있습니다.
단점: 성능이 낮습니다. 일반적으로 권장되지 않습니다.
테이블 생성 예시:
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;
단순하고 빠르게: IDENTITY
최적화 필요: SEQUENCE
호환성 중요: TABLE
자동 선택: AUTO