JPA에서 ID 생성 전략

Kkd·2024년 12월 3일
0

매일메일 개념정리

목록 보기
15/93

JPA에서 ID 생성 전략은 엔티티의 기본 키(primary key)를 자동으로 생성하는 방식을 정의하는 방법입니다. 이를 통해 데이터베이스에 삽입할 때 고유한 ID 값을 생성하고 관리할 수 있습니다. JPA는 ID 생성 전략을 @GeneratedValue 어노테이션으로 설정하며, 다양한 전략을 제공합니다.


ID 생성 전략의 종류

  1. AUTO

    • JPA 구현체가 데이터베이스에 맞는 적절한 ID 생성 전략을 자동으로 선택합니다.
    • 데이터베이스의 Dialect 설정에 따라 IDENTITY 또는 SEQUENCE 전략이 사용됩니다.
    • 대부분의 경우 기본 옵션으로 사용 가능하며, 데이터베이스 간 이식성을 높이는 데 유리합니다.
    • 예제
      @Id
      @GeneratedValue(strategy = GenerationType.AUTO)
      private Long id;
  2. IDENTITY

    • 데이터베이스의 Auto Increment 기능을 사용하여 기본 키 값을 생성합니다.
    • ID 값이 데이터베이스에 의존적으로 생성되며, 엔티티를 저장하는 순간 바로 ID 값이 결정됩니다.
    • 트랜잭션을 커밋하기 전에도 ID 값을 확인할 수 있습니다.
    • 단점
      • Batch Insert(일괄 삽입)가 비효율적일 수 있습니다. (삽입할 때마다 ID 값을 조회해야 하기 때문)
    • 예제
      @Id
      @GeneratedValue(strategy = GenerationType.IDENTITY)
      private Long id;
  3. SEQUENCE

    • 데이터베이스의 시퀀스 객체를 사용하여 고유 ID 값을 생성합니다.
    • 트랜잭션 커밋 이전에 ID 값을 미리 가져옵니다.
    • 주로 Oracle, PostgreSQL과 같은 시퀀스를 지원하는 데이터베이스에서 사용됩니다.
    • Hibernate는 기본적으로 hibernate_sequence라는 이름의 시퀀스를 사용합니다.
    • 시퀀스를 직접 지정할 수도 있습니다.
      @Id
      @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "my_seq_gen")
      @SequenceGenerator(name = "my_seq_gen", sequenceName = "my_sequence", allocationSize = 1)
      private Long id;
    • 옵션
      • allocationSize: 기본값은 50으로, 시퀀스를 미리 가져오는 수량을 설정하여 데이터베이스 호출을 줄입니다.
  4. TABLE

    • 별도의 키 생성용 테이블을 만들어 기본 키 값을 관리합니다.
    • 데이터베이스의 시퀀스를 지원하지 않는 경우 사용할 수 있습니다.
    • ID 생성 값을 테이블에서 관리하기 때문에 데이터베이스 간 이식성이 뛰어납니다.
    • 하지만 성능은 상대적으로 느릴 수 있습니다.
    • 예제
      @Id
      @GeneratedValue(strategy = GenerationType.TABLE, generator = "table_gen")
      @TableGenerator(
          name = "table_gen",
          table = "id_gen_table",
          pkColumnName = "gen_name",
          valueColumnName = "gen_value",
          pkColumnValue = "entity_id",
          allocationSize = 1
      )
      private Long id;

전략 선택 시 고려사항

  1. 데이터베이스의 특성

    • Oracle, PostgreSQL: SEQUENCE
    • MySQL, MariaDB: IDENTITY
    • 데이터베이스 독립적인 방식: TABLE
  2. 성능

    • IDENTITY는 삽입 시마다 데이터베이스에 요청을 보내므로 Batch Insert에 불리합니다.
    • SEQUENCE는 미리 ID 값을 가져올 수 있으므로 효율적입니다.
  3. 이식성

    • TABLE 전략은 데이터베이스 종속성을 제거할 수 있으나 성능이 낮을 수 있습니다.
  4. 비즈니스 요구사항

    • ID 생성 규칙이 특정 패턴을 요구하거나 고유값의 범위가 중요한 경우, 커스텀 전략을 구현할 수도 있습니다.

결론

  • 기본적으로 AUTO를 사용하여 JPA 구현체에 맡기되, 특정 데이터베이스 환경이나 성능 요구 사항에 따라 SEQUENCE 또는 IDENTITY를 고려합니다.
  • 데이터베이스 간 이식성을 중요하게 여긴다면 TABLE 전략을 사용할 수 있습니다.
  • 프로젝트와 데이터베이스 특성에 따라 적절한 전략을 선택하는 것이 중요합니다.

추가 학습 자료

profile
🌱

0개의 댓글