이번 포스팅에서는 저번 포스팅(#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
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 로 접속하면 기본 샘플 예제를 다운받아서 확인해볼 수 있습니다.
'백앤드 > Jpa' 카테고리의 다른 글
[Jpa] 실전을 위한 JPA - #3 엔티티(Entity) 기본 어노테이션 (0) | 2023.12.09 |
---|---|
[Jpa] 실전을 위한 JPA - #2 데이터베이스 설치 및 추가하기 (1) | 2023.12.06 |
[Jpa] 실전을 위한 JPA - #1 프로젝트 생성 (1) | 2023.11.20 |