본 내용은 유튜브 나무소리님의 강의 내용을 정리한 내용입니다.
JPA 3-3강 Entity Mapping(3)
Sequence 기본키 생성 전략
- Sequence 생성 전략은 데이터베이스의 Sequence 오브젝트를 이용해 기본키를 생성하는 방식입니다.
- 이 전략은 Sequence 오브젝트를 제공하는 Oracle, PostgreSQL, DB2 데이터베이스 등에서 적용할 수 있습니다.
- Sequence 전략을 사용하기 위해서는 @SequenceGenerator가 필요하며 이 어노테이션을 이용해 여러 옵션을 적용할 수 있습니다.
- 이 전략도 Identity 전략과 마찬가지로 데이터가 발생할 때 생성되는 Sequence를 받아 영속 객체를 관리합니다.
package com.example.jpa.entity;
...
@NoArgsConstructor
@Data
@Entity
@Table(name = "customer_tb")
@SequenceGenerator(
name = "customer_generator",
sequenceName = "customer_seq",
initialValue = 1,
allocationSize = 1) // 시퀀스 옵션 설정
public class Customer {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "customer_generator")
private Long id;
private String name;
private Long registerDate;
...
}
@SequenceGenerator 옵션 |
sequenceName |
시퀀스 이름 |
initialValue |
시퀀스 시작 값 지정(스키마 자동 생성 적용시) |
allocationSize |
시퀀스 값을 일괄 할당하기 위한 크기(default = 50) |
sequence 생성 및 테이블 생성
시퀀스 조회 및 INSERT 쿼리 실행
allocationSize
- allocationSize는 시퀀스의 값을 한번에 할당하는 값의 크기를 의미 합니다.
- allocationSize는 성능 최적화를 위해 사용됩니다. (기본 값이 50인 이유)
- 예를 들어 allocationSize의 크기가 1인 경우에 시퀀스 값을 조회한 경우 첫번째는 1, 두번째는 2, ... persist() 메서드를 실행할 때 마다 조회하게 됩니다.
- 그런데 allocationSize의 크기가 50인 경우에 시퀀스 값을 조회한 경우 첫번째는 1, 두번째는 51을 반환하게 되고 persist() 메서드가 50번 실행된 이후에 시퀀스 값을 조회하게 됩니다.
// customer객체 100번 등록
...
transaction.begin();
try {
for (int i = 0; i < 100; i++) {
Customer customer = new Customer();
customer.setName("Kim");
customer.setRegisterDate(System.currentTimeMillis());
entityManager.persist(customer);
}
System.out.println("============= Before Commit ==========");
transaction.commit();
}
...
시퀀스 조회 쿼리가 100번 실행
- allocationSize = 50인 경우(default)
시퀀스 조회 쿼리가 3번만 실행
- 데이터베이스에 미리 생성해 놓은 Sequence를 사용할 경우 엔티티 설정
package com.example.jpa.entity;
...
@NoArgsConstructor
@Data
@Entity
@Table(name = "customer_tb")
public class Customer {
// 데이터베이스에 생성된 Sequence 사용
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "my_seq")
@SequenceGenerator(name = "my_seq", sequenceName = "db_seq")
private Long id;
private String name;
private Long registerDate;
...
}