JPA에서 Entity의 키 생성 전략이란, 데이터베이스의 기본 키를 어떻게 설정할 지 정의하는 방식이다.
키 생성 전략은 @Id와 @GeneratedValue 어노테이션으로 설정한다.
이 글에서 알아볼 건 @GeneratedValue에 strategy 옵션이다.
1. IDENTITY
- 데이터베이스가 기본 키를 자동으로 생성한다.
- 주로 AUTO_INCREMENT 컬럼이 있는 데이터베이스에서 사용된다.
- 장점 : 간단하게 설정할 수 있고, 데이터베이스가 키를 관리한다.
- 단점 : 배치 처리에 비효율적일 수 있다.
@Entity
public class MyEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
}
2. SEQUENCE
- 데이터베이스의 시퀀스를 사용하여 키를 생성한다.
- Oracle, PostgreSQL과 같은 시퀀스를 지원하는 데이터베이스에서 사용 된다. JPA에서 시퀀스 이름과 초기값을 커스터마이즈 할 수 있다.
- 장점 : 키 값을 미리 가져와 효율적으로 배치 처리가 가능하다.
@Entity
@SequenceGenerator(
name = "my_sequence_generator", // 시퀀스 생성기 이름
sequenceName = "my_sequence", // 데이터베이스 시퀀스 이름
initialValue = 1, // 초기값
allocationSize = 1 // 증가 크기
)
public class MyEntity {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "my_sequence_generator")
private Long id;
}
3. TABLE
- 별도의 테이블을 생성하여 키 값을 관리한다.
- 데이터베이스에서 시퀀스를 지원하지 않거나 특정 방식으로 키 생성을 관리하고 싶을 때 사용한다.
- 장점 : 모든 데이터베이스에서 사용할 수 있다.
- 단점 : 추가적인 테이블이 필요하고 성능이 떨어질 수 있다.
@Entity
@TableGenerator(
name = "my_table_generator", // 테이블 생성기 이름
table = "id_table", // 키 값을 저장할 테이블 이름
pkColumnName = "entity_name", // 엔터티 이름을 저장할 컬럼 이름
valueColumnName = "next_id", // 다음 키 값을 저장할 컬럼 이름
pkColumnValue = "my_entity", // 현재 엔터티의 이름
allocationSize = 1 // 증가 크기
)
public class MyEntity {
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "my_table_generator")
private Long id;
}
4. AUTO
- 데이터베이스 벤더에 따라 적절한 전략을 자동으로 선택한다.
- 장점 : 설정이 간단하고 데이터베이스에 종속적이지 않다.
- 단점 : 어떤 전략이 선택되었는지 명확히 알기 어렵다.
5. UUID
- 고유성, 보안성이 있고 분산 시스템에 적합하다.
- 저장공간이 증가(BIGINT의 2배), Mysql에서는 UUID 삽입 시 트리 분할로 인한 성능 저하가 일어날 수 있다.
- 랜덤성이 강해서 시간 순서와 정렬이 일치하지 않아 최근 데이터를 조회하는데 비효율적이다.
>> UUIR_TO_BIN()과 BIN_TO_UUID() 함수를 사용해서 기존 문자열 형식으로 저장(36바이트차지)하던걸 16바이트로 압축할 수 있음.
>> 랜덤성이 강한 UUID v4 대신 시간 기반 UUIDv6/v7 삽입 성능 완화
>> UUID_TO_BIN() 에 swap_flag 사용 시 시간 순서대로 정렬된 UUID 생성 가능
SELECT UUID_TO_BIN(UUID(), 1);
자주쓰는 데이터베이스 기준으로는 Mysql은 IDENTITY, Oracle과 postgresql은 sequence를 채용한다.
'JPA' 카테고리의 다른 글
[JPA] Fetch Join과 Paging 동시 사용 충돌 (0) | 2025.01.03 |
---|---|
[JPA] 페이징의 n+1 문제 개선하기 (0) | 2025.01.03 |