DB/JPA

[JPA] 기본키 생성 전략

annovation 2025. 3. 3. 08:50

기본키(Primary Key)

  • 데이터베이스에서 기본키(Primary Key)는 각 테이블의 행을 고유하게 식별하는 값이다.
  • 기본키는 중복될 수 없으며, 한 테이블에서 단 하나만 존재해야 한다.
  • JPA(Java Persistence API)에서 엔티티(Entity)의 데이터를 데이터베이스에 저장할 때도 기본키가 반드시 필요하다.

JPA에서 기본키를 생성하는 방법

JPA에서는 기본키를 자동으로 생성할 수 있도록 4가지 기본키 생성 전략을 제공한다.

  1. IDENTITY
  2. SEQUENCE
  3. TABLE
  4. AUTO

IDENTITY 전략

1. 특징

  • 데이터베이스가 기본키 생성을 담당하는 방식이다.
  • AUTO_INCREMENT 기능이 있는 MySQL, MariaDB 등에서 주로 사용된다.
  • @GeneratedValue(strategy = GenerationType.IDENTITY) 어노테이션을 사용한다.
  • 영속성 컨텍스트에 저장되기 전에 데이터베이스에 INSERT를 실행해야 한다. 추가 설명

2. 장점

  • 별도의 키 생성 테이블을 만들 필요가 없다.
  • 데이터베이스에서 자동 증가 값을 보장하므로 충돌이 발생하지 않는다.

3. 단점

  • JPA의 1차 캐시 및 영속성 컨텍스트 기능을 제대로 활용하지 못할 수 있다.  추가 설명
  • persist() 메서드를 호출하는 즉시 INSERT 쿼리가 실행되므로, 트랜잭션 처리 시 비효율적일 수 있다.  추가 설명

ex. IDENTITY 전략 적용 코드

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
}

SEQUENCE 전략

1. 특징

  • 데이터베이스의 시퀀스(Sequence) 객체를 이용하여 기본키를 생성하는 방식이다.  추가 설명
  • @GeneratedValue(strategy = GenerationType.SEQUENCE) 어노테이션을 사용한다.
  • Oracle, PostgreSQL, H2 등에서 지원된다.
  • 별도의 시퀀스 객체를 생성해야 한다.

2. 장점

  • 트랜잭션 내에서 기본키를 미리 가져와서 사용할 수 있어 성능이 좋다.  추가 설명
  • IDENTITY 방식과 달리, 영속성 컨텍스트에서 관리가 가능하다.  추가 설명

3. 단점

  • 일부 데이터베이스(MySQL 등)에서는 지원되지 않는다.

ex. SEQUENCE 전략 적용 코드

@Entity
@SequenceGenerator(name = "user_seq_generator", sequenceName = "user_seq", allocationSize = 1)
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_seq_generator")
    private Long id;
    private String name;
}

TABLE 전략

1. 특징

  • 별도의 키 생성 테이블을 만들어 기본키를 관리하는 방식이다.
  • @GeneratedValue(strategy = GenerationType.TABLE) 어노테이션을 사용한다.
  • 데이터베이스에 의존하지 않고 JPA에서 키를 관리할 수 있다.  추가 설명

2. 장점

  • 모든 데이터베이스에서 동일하게 동작한다.  추가 설명
  • 기본키 관리 방법을 데이터베이스와 분리할 수 있다.

3. 단점

  • 다른 전략에 비해 성능이 떨어질 수 있다.  추가 설명
  • 키 값을 저장하는 테이블을 별도로 생성해야 하므로, 추가적인 관리가 필요하다.

ex. TABLE 전략 적용 코드

@Entity
@TableGenerator(name = "user_table_generator", table = "id_table", pkColumnName = "pk_name", valueColumnName = "pk_value", allocationSize = 1)
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "user_table_generator")
    private Long id;
    private String name;
}

AUTO 전략

1. 특징

  • 기본키 생성 전략을 JPA 구현체가 자동으로 선택하도록 하는 방식이다.
  • @GeneratedValue(strategy = GenerationType.AUTO) 어노테이션을 사용한다.
  • 데이터베이스 종류에 따라 IDENTITY, SEQUENCE, TABLE 중 적절한 전략을 선택한다.

2. 장점

  • 데이터베이스에 맞는 기본키 전략을 자동으로 선택할 수 있어 유연하다.

3. 단점

  • 내부적으로 어떤 전략이 선택되는지 명확하지 않을 수 있다.
  • 성능이 중요한 경우, 명확한 전략을 선택하는 것이 더 좋을 수도 있다.

ex. AUTO 전략 적용 코드

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String name;
}

JPA 기본키 전략 선택 기준

전략 특징 주로 사용되는 데이터베이스
IDENTITY DB가 자동으로 기본키를 생성 (AUTO_INCREMENT) MySQL, MariaDB
SEQUENCE 별도의 시퀀스를 사용하여 기본키 생성 Oracle, PostgreSQL
TABLE 키 값을 저장하는 별도 테이블을 생성 모든 DB에서 사용 가능
AUTO JPA가 자동으로 적절한 전략을 선택 DB에 따라 다름

요약

  • JPA는 데이터베이스와 상관없이 기본키를 관리할 수 있도록 다양한 기본키 생성 전략을 제공한다.
  • IDENTITY는 MySQL 등에서 사용되며, 데이터베이스의 자동 증가 기능을 이용한다.
  • SEQUENCE는 Oracle, PostgreSQL에서 시퀀스를 활용하여 기본키를 생성한다.
  • TABLE은 별도의 테이블을 만들어 기본키를 관리하지만, 성능이 낮아 잘 사용되지 않는다.
  • AUTO는 JPA가 적절한 전략을 자동으로 선택하는 방식이다.
  • 성능과 유지보수를 고려하여 IDENTITY 또는 SEQUENCE 전략을 주로 사용하는 것이 일반적이다.

출처

OpenAI ChatGPT (https://openai.com)

반응형