JPA 기초 - 기본키 생성 전략(Sequence)

2024. 1. 14. 17:34·JPA
본 내용은 유튜브 나무소리님의 강의 내용을 정리한 내용입니다.
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();
    }
...
  • allocationSize = 1인 경우

시퀀스 조회 쿼리가 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;

    ...
}

'JPA' 카테고리의 다른 글

JPA 기초 - @Embeddable  (0) 2024.01.17
JPA 기초 - 연관관계의 방향성(ManyToOne, JoinColumn)  (0) 2024.01.16
JPA 기초 - 연관 관계의 이해  (0) 2024.01.16
JPA 기초 - 필드와 컬럼 매핑(@Temporal, @Lob, @Enumerated, @Translent)  (0) 2024.01.15
JPA 기초 - 기본키 매핑(Table), 필드와 컬럼 매핑(@Column)  (0) 2024.01.15
'JPA' 카테고리의 다른 글
  • JPA 기초 - 연관관계의 방향성(ManyToOne, JoinColumn)
  • JPA 기초 - 연관 관계의 이해
  • JPA 기초 - 필드와 컬럼 매핑(@Temporal, @Lob, @Enumerated, @Translent)
  • JPA 기초 - 기본키 매핑(Table), 필드와 컬럼 매핑(@Column)
PortLee
PortLee
  • PortLee
    프로그래밍 공부
    PortLee
  • 전체
    오늘
    어제
    • 분류 전체보기
      • C++
      • JAVA
      • JPA
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    @CollectionTable
    @Table
    컬렉션 매핑
    1-1연관관계
    다른 테이블 매핑
    컬랙션 매핑
    SQL Mapping
    Table 기본키 생성 전략
    @Basic
    MemberService
    JoinColumn
    MemberRepository
    식별자공유
    1-N
    기본키 매핑
    map
    Translent
    Entity
    필드와 컬럼 매핑
    persistence.xml
    @Access
    Entity 연관관계
    MemberEntity
    @Embeddable
    JPA
    allocationSize
    @AttributeOverride
    entity mapping
    list
    set
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
PortLee
JPA 기초 - 기본키 생성 전략(Sequence)
상단으로

티스토리툴바