cs/ODOQ

[ODOQ] JPA ID 생성 전략

icodesiuuuu 2024. 12. 6. 21:05

[One Day One Question]

JPA ID 생성 전략에 대해 설명해 주세요.


JPA에서 ID 생성 전략은 직접 할당 방식자동 생성 방식 두 가지로 나뉩니다. 각각의 방식은 기본 키를 어떻게 관리하고 생성할지 결정하며, 데이터베이스 설계 및 애플리케이션 요구사항에 따라 선택됩니다.

 

1. 직접 할당 방식 (Manual Assignment)

  • 설명: 개발자가 직접 기본 키 값을 설정하여 관리하는 방식입니다. JPA는 엔티티를 저장하기 전에 기본 키 필드에 값이 설정되어 있어야 하며, 그렇지 않으면 오류가 발생합니다.
  • 특징:
    • 개발자가 값을 명시적으로 설정.
    • 외부 시스템(예: REST API, 시퀀스 생성기 등)에서 기본 키를 생성할 수 있습니다.
    • ID 생성 방식이 데이터베이스에 의존적이지 않음.
    • 복합 키를 사용하는 경우 주로 직접 할당 방식을 사용.
@Entity
public class User {
    @Id
    private String id; // 기본 키를 직접 할당
    private String name;

    // 생성자나 서비스에서 기본 키를 수동으로 설정
    public User(String id, String name) {
        this.id = id;
        this.name = name;
    }
}

 

 

2. 자동 생성 방식 (Auto Generation)

  • 설명: JPA와 데이터베이스가 협력하여 기본 키를 자동으로 생성하는 방식입니다. @GeneratedValue를 사용하여 자동 생성 방식을 지정할 수 있습니다.
  • 특징:
    • JPA가 기본 키 값을 자동으로 생성하므로 개발자는 기본 키를 관리하지 않아도 됩니다.
    • 다양한 ID 생성 전략을 지원 (IDENTITY, SEQUENCE, TABLE, AUTO).
    • 데이터베이스의 기본 키 생성 기능을 활용하거나 JPA가 직접 생성.
@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO) // 기본 키를 자동 생성
    private Long id;
    private String name;
}

 

1. IDENTITY

  • 설명: 데이터베이스의 AUTO_INCREMENT 기능을 사용하여 기본 키 값을 생성합니다.
  • 작동 방식:
    • 엔티티를 저장할 때 INSERT 쿼리를 실행하고, 데이터베이스가 기본 키 값을 생성합니다.
    • 기본 키 값은 INSERT가 완료된 후 반환됩니다.
  • 특징:
    • 데이터베이스에 의존적이며, MySQL, SQL Server 등에서 주로 사용.
    • 즉시 INSERT 쿼리가 실행되어야 기본 키 값이 생성되므로, 배치 INSERT에서는 효율이 떨어질 수 있음.
    • 시퀀스를 지원하지 않는 데이터베이스에 적합.
@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
}

 

 

2. SEQUENCE

  • 설명: 데이터베이스의 시퀀스(Sequence) 객체를 사용하여 기본 키 값을 생성합니다.
  • 작동 방식:
    • JPA가 시퀀스에서 다음 값을 가져와서 기본 키로 사용합니다.
    • @SequenceGenerator를 사용하여 시퀀스 이름 및 속성을 설정할 수 있습니다.
  • 특징:
    • 시퀀스를 지원하는 데이터베이스(예: Oracle, PostgreSQL)에서 사용 가능.
    • 기본 키 값을 미리 가져오기 때문에 배치 처리에 적합.
    • JPA는 기본적으로 hibernate_sequence라는 이름의 시퀀스를 사용.
@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_seq")
    @SequenceGenerator(name = "user_seq", sequenceName = "user_sequence", allocationSize = 1)
    private Long id;
    private String name;
}

 

 

3. TABLE

  • 설명: 별도의 테이블을 생성하여 기본 키 값을 관리하는 방식입니다.
  • 작동 방식:
    • JPA는 별도의 테이블에 현재 기본 키 값을 저장하고, 다음 키 값을 생성할 때 해당 값을 증가시킵니다.
    • @TableGenerator를 사용해 테이블 이름과 속성을 설정할 수 있습니다.
  • 특징:
    • 모든 데이터베이스에서 사용 가능.
    • 성능은 다른 방식보다 낮을 수 있음(테이블에 대한 추가 조회 필요).
    • 데이터베이스 독립성을 보장.
@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "table_gen")
    @TableGenerator(
        name = "table_gen",
        table = "id_table",
        pkColumnName = "entity_name",
        valueColumnName = "next_id",
        pkColumnValue = "user",
        allocationSize = 1
    )
    private Long id;
    private String name;
}

 

 

4. AUTO

  • 설명: JPA가 사용하는 데이터베이스에 따라 적절한 ID 생성 전략을 자동으로 선택합니다.
  • 작동 방식:
    • 시퀀스를 지원하면 SEQUENCE 전략 사용.
    • 시퀀스를 지원하지 않으면 IDENTITY 전략 사용.
    • 데이터베이스 설정에 따라 유연하게 작동.
  • 특징:
    • 데이터베이스에 종속적이며, 개발자가 특정 전략을 지정하지 않을 때 유용.
    • Hibernate는 데이터베이스가 시퀀스를 지원하지 않으면 기본적으로 IDENTITY를 선택.
@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String name;
}

 

 

전략 특징 장점 단점
IDENTITY AUTO_INCREMENT를 사용하여 DB가 키를 생성 설정이 간단, DB 기본 기능 활용 배치 처리 성능 낮음, DB 의존적
SEQUENCE DB 시퀀스 객체를 사용하여 키 생성 배치 처리 성능 우수, 사전 키 생성 가능 시퀀스 지원 DB에서만 사용 가능
TABLE 별도의 테이블에 키를 저장하고 관리 DB 독립적 성능이 느림, 테이블 조회 추가 작업 필요
AUTO DB에 따라 적절한 전략을 자동으로 선택 설정이 간단, 유연성 동작 방식이 DB에 따라 달라짐, 예측 어려움

 

'cs > ODOQ' 카테고리의 다른 글

[ODOQ] 운영체제(OS)란?  (0) 2024.12.18
[ODOQ] 동기(Synchronous), 비동기(Asynchronous)  (0) 2024.12.17
[ODOQ] 동일성과 동등성  (0) 2024.12.06
[ODOQ] 로그와 메트릭  (1) 2024.12.03
[ODOQ] 얕은 복사 깊은 복사  (0) 2024.12.02