Framework/Spring

JPA에서 @GeneratedValue와 GenerationType에 대해 알아보자

노 코딩 노 라이프 2024. 8. 19. 13:37

JPA에서 엔티티의 기본 키를 자동으로 생성하는 전략은 애플리케이션의 성능과 데이터베이스의 특성에 영향을 미치는데요. 이러한 전략은 @GeneratedValue 어노테이션에서 GenerationType을 통해 지정할 수 있습니다. 이 글에서는 JPA에서 제공하는 네 가지 키 생성 전략인 IDENTITY, SEQUENCE, AUTO, TABLE의 의미와 동작 방식에 대해 알아보도록 하겠습니다!


1. GenerationType.IDENTITY

IDENTITY 전략은 주로 Auto Increment 기능을 제공하는 데이터베이스에서 사용됩니다. 이 전략은 기본 키를 데이터베이스에서 자동으로 생성하도록 합니다. MySQL과 PostgreSQL과 같은 데이터베이스에서 많이 사용되며, AUTO_INCREMENTSERIAL과 같은 설정과 함께 사용됩니다.

동작 방식

  • 엔티티가 데이터베이스에 영속화될 때, 기본 키 값이 데이터베이스에 의해 자동으로 생성됩니다.
  • 키 값이 삽입 시점에서만 생성되므로, JPA는 엔티티를 저장한 후에야 기본 키 값을 알 수 있습니다.

특징

  • 삽입 성능이 우수합니다.
  • 데이터베이스에 종속적이며, 기본 키 값이 엔티티가 영속화되기 전까지는 존재하지 않습니다.

 

2. GenerationType.SEQUENCE

SEQUENCE 전략은 데이터베이스의 시퀀스(Sequence)를 사용하여 기본 키를 생성합니다. Oracle, PostgreSQL, H2 등에서 주로 사용되며, 데이터베이스가 시퀀스를 통해 고유한 숫자 값을 생성합니다.

동작 방식

  • JPA는 데이터베이스의 시퀀스로부터 미리 키 값을 가져와 엔티티에 할당합니다.
  • 시퀀스는 별도의 객체로, 영속화 이전에 키 값이 결정됩니다.

특징

  • 트랜잭션 시작 시에 키 값을 미리 알 수 있습니다.
  • 데이터베이스 시퀀스를 사용하기 때문에 병렬 처리 성능이 우수합니다.
  • 시퀀스 객체의 규칙을 따라야 하므로, 데이터베이스에 따라 설정이 필요합니다.

사용 예시

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

위 코드에서 @SequenceGenerator 어노테이션을 사용해 시퀀스를 정의할 수 있습니다.

 

3. GenerationType.AUTO

AUTO 전략은 JPA가 사용하는 기본 전략으로, 데이터베이스의 방언(Dialect)에 따라 가장 적합한 생성 전략을 자동으로 선택합니다. 이 전략은 데이터베이스 이식성을 높여주기 때문에 다양한 데이터베이스를 사용하는 애플리케이션에서 유용합니다.

동작 방식

  • JPA는 데이터베이스 방언에 맞춰 적절한 전략(IDENTITY, SEQUENCE, TABLE)을 선택합니다.
  • 데이터베이스에 따라 다른 전략을 사용하므로, 개발자는 전략을 명시하지 않고도 기본 키 생성을 처리할 수 있습니다.

특징

  • 자동으로 적절한 전략을 선택하므로 편리합니다.
  • 특정 성능 최적화를 위해서는 직접 전략을 선택하는 것이 좋습니다.

 

4. GenerationType.TABLE

TABLE 전략은 별도의 데이터베이스 테이블을 사용하여 기본 키를 관리하는 방식입니다. 이 테이블은 기본 키 값을 저장하고, 새로운 키를 생성할 때 참조합니다. 데이터베이스 독립성을 유지할 수 있지만 성능이 저하될 수 있습니다.

동작 방식

  • 키 값을 관리하는 별도의 테이블을 생성하고, 이를 통해 기본 키를 생성합니다.
  • 독립적인 키 생성 메커니즘을 제공하지만, 테이블 접근이 필요하므로 성능상 불리할 수 있습니다.

특징

  • 데이터베이스에 독립적입니다.
  • 성능이 낮을 수 있으며, 분산 시스템에서 일관된 키 생성을 보장할 수 있습니다.

사용 예시

@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "goal_table")
@TableGenerator(name = "goal_table", table = "id_gen", pkColumnName = "gen_name", valueColumnName = "gen_val", allocationSize = 1)
private Long id;

위 코드에서 @TableGenerator 어노테이션을 통해 기본 키를 관리하는 테이블을 정의할 수 있습니다.


요약

JPA에서 기본 키를 자동으로 생성하는 방법은 애플리케이션의 성능과 데이터베이스의 특성에 따라 달라집니다. IDENTITY는 데이터베이스가 키를 직접 생성할 때 유용하며, SEQUENCE는 성능을 중시하는 경우에 적합합니다. AUTO는 여러 데이터베이스에서 동작하는 애플리케이션에 유연성을 제공하며, TABLE은 데이터베이스 독립적인 키 생성 메커니즘을 제공합니다.

각 전략의 장단점을 고려하여, 애플리케이션의 요구 사항에 맞는 적절한 전략을 선택하는 것이 중요합니다!