본문 바로가기
JPA

[JPA] Entity의 키 생성 전략

by 어떻게말이름이히힝 2025. 1. 14.

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