모르지 않다는 것은 아는것과 다르다.

Spring Jpa

JPA Id 생성전략 설정하기

채마스 2022. 2. 27. 01:02

개요

  • 보통 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)
      • 데이터베이스 방언에 따라 자동으로 지정된다.




@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