개요
- 보통 JPA 로 개발할때,
@GeneratedValue(strategy = GenerationType.IDENTITY)
로 설정하고, 개발을 진행하였다. - Id 값을 커스텀하게 생성할 수 있는 방법에 대해서 알아보려고 한다.
@GeneratedValue
- @GeneratedValue는 식별자의 생성 전략을 지정하는데 사용된다.
- 전략은 아래와 같이 4가지 전략이 있다.
- IDENTITY
- 식별자 생성을 데이터베이스에 위임한다.
- 주로 MySQL, PostgreSQL, SQL Server 등에서 사용된다.
- 키 생성의 동시성 처리 도 데이터베이스에 위임한다.
- 엔티티가 persist 되는 시점에 즉시 INSERT SQL 을 실행 하고 DB 에서 식별자 값을 가져온다.
- SEQUENCE
- 데이터베이스의 시퀀스를 사용한다.
- 주로 Oracle, PostgreSQL, H2 등에서 사용한다.
- persist 하는 시점에 데이터베이스 INSERT SQL 을 날리지 않늗다 -> 시퀀스 값만 얻어 영속성 컨텍스트에 저장한 뒤, 트랜잭션 커밋시점에 INSERT SQL 을 날린다.
- TABLE
- 기 생성용 테이블을 사용한다.
- AUTO (Default)
- 데이터베이스 방언에 따라 자동으로 지정된다.
- 데이터베이스 방언에 따라 자동으로 지정된다.
- IDENTITY
@GenericGenerator
- Hibernate 에서 제공하는 @GenericGenerator 를 사용하면, Optimizer 를 직접 지정해서 최적화할 수 있다.
- 나는 pooled optimizer 로 설정했다.
- pooled 방식은 아래와 같이 id 를 채번한다.
(sequence - increment) ~ sequence
만큼의 범위를 DB를 Query하지 않고 메모리를 이용하여 채번할 수 있는 방식이다.- 예를들어 조회된 sequence 값이 10000 이고, increment 가 100 이라고 가정하자.
- 이런 경우 (10000-100) ~ 10000 만큼은 쿼리하지 않고, 메모리에서 채번한다.
- 코드로 구현하면 아래와 같다.
@Entity
@Table(
name = "COMPANY",
uniqueConstraints = {@UniqueConstraint(columnNames = {"company_cd", "company_nm"})}
)
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Company {
@Id
@GenericGenerator(
name = "sg_company",
strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator",
parameters = {
@Parameter(name = "sequence_name", value = "company_seq"),
@Parameter(name = "optimizer", value = "pooled"),
@Parameter(name = "initial_value", value = "1000"),
@Parameter(name = "increment_size", value = "10")
}
)
@GeneratedValue(
strategy = GenerationType.SEQUENCE,
generator = "sg_company"
)
@Column(name = "company_id")
private Long companyId; //회사 ID
@NotNull
@Column(name = "company_cd")
private String companyCd; //회사 코드
@NotNull
@Column(name = "company_nm")
private String companyNm; //회사명
}
@Parameter(name = "initial_value", value = "1000")
로 설정 함으로써 id 를 1000 부터 채번하게 설정할 수 있다.@Parameter(name = "increment_size", value = "10")
로 설정 함으러써 increment 사이즈를 10으로 설정할 수 있다.@GeneratedValue(generator = "sg_company")
로 설정 함으러써 직접 구성한 generator 를 등록할 수 있다.
REFERENCES
'Spring Jpa' 카테고리의 다른 글
JPA DB 수동설정 (0) | 2022.03.24 |
---|---|
프록시와 연관관계 관리 (0) | 2022.02.27 |
영속성 컨텍스트 (0) | 2022.02.27 |
조회 성능 최적화 (0) | 2022.02.27 |
값타입 (0) | 2022.02.27 |