본문 바로가기

백앤드/Jpa

[Jpa] 실전을 위한 JPA - #4 @GeneratedValue 컬럼 시퀀스 전략 및 성능 개선(튜닝)

반응형

이번 포스팅에서는 저번 포스팅(#3 엔티티(Entity) 기본 어노테이션)에서 공부했던 것 중에서 @GeneratedValue 에 대해 조금 더 깊게 파헤쳐보려합니다.

 

그럼 @GeneratedValue 의 자세한 내용을 공부하기 전에 개념을 다시 한번 언급해보겠습니다.

@GeneratedValue 란?
 PK 생성 전략으로 어떤 방식으로 생성할 것인지 지정합니다. 이 어노테이션을 설정하지 않는 경우에는 데이터베이스에 데이터를 삽입할 때마다 PK를 직접 입력해야합니다. 또한 이 어노테이션을 사용하기 위해서는 @Id 로 식별자 변수를 지정한 엔티티에서만 사용할 수 있습니다.

 

# 1. 시퀀스 전략 사용

package devbox.jpa.step03.db.entity;

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.SequenceGenerator;
import jakarta.persistence.Table;

@Entity
@Table
@SequenceGenerator(
    name= "S_EMP_GENERATOR",
    sequenceName = "S_EMP_SEQUENCE",
    initialValue = 1,
    allocationSize = 1
)
public class UserSimple {
    
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "S_EMP_GENERATOR")
    private Long id;
    private String name;
    private String email;

    public UserSimple(String name, String email) {
        this.name = name;
        this.email = email;
    }

    public Long getId() {
        return id;
    }
    
    public String getName() {
        return name.toLowerCase();
    }

    public String getEmail() {
        return email;
    }
}

 

# 2. 시퀀스 전략 옵션

name

어떤 PK를 시퀀스 전략으로 사용할 것인지 이름 지정합니다. 이 이름은 @Id 와 함께 삽입된 @GeneratedValue에 generator 의 속성에 입력된 값을 동일하게 입력합니다.

 

sequenceName

데이터베이스에 생성해둔 시퀀스 이름을 입력합니다. 속성을 입력하지 않는 경우 기본 값으로 hibernate_sequence 가 기본 값으로 설정됩니다.

 

initalValue

데이터가 삽입될 때, 가장 초기 값으로 사용할 정수를 정의합니다.

 

allocationSize

데이터가 삽입될 때, 초기 값에서부터 정수를 몇 씩 증가시킬 것인지 정의하며 기본 값은 50입니다.

 

# 3. AllocationSize 성능 개선 및 튜닝

allocationSize 는 JPA가 메모리에서 관리할 크기의 범위를 설정합니다. 기본 값이 왜 50으로 되어있는지는 이제부터 설명을 해보겠습니다.

allocationSize를 1로 설정하는 경우, 데이터베이스에 Insert를 할 때마다 데이터 Sequence를 조회하고 +1을 하기 때문에 그만큼 성능이 저하될 수 밖에 없습니다.

그런데 만약 allocationSize을 기본 값인 50으로 설정하는 경우, 데이터베이스에 Insert를 할 때 Sequence 값을 1~50까지는 JPA 메모리에서 처리하고 insert를 수행하고, Sequence가 51일 때 다시 한번 데이터 Sequence를 조회하며 51~100까지는 또 다시 JPA 메모리에서 처리하고 insert를 수행하는 방법을 반복하게 됩니다.

 

그렇기 때문에 Insert를 할 때, JPA 스스로 메모리에서 어느정도까지 처리할 것인지에 따라 성능 개선할 수 있는 부분이 존재하게 됩니다.

 

※ 기본 환경 설정 예제 코드 다운로드

위 링크를 통해 Github 로 접속하면 기본 샘플 예제를 다운받아서 확인해볼 수 있습니다.

반응형