semtax의 개발 일지

JPA 에서 GeneratedValue 사용할 때 주의점 본문

개발/Java

JPA 에서 GeneratedValue 사용할 때 주의점

semtax 2020. 6. 7. 21:53
반응형

개요

이번 포스팅에서는 JPA에서 @GeneratedValue 를 사용할때 주의할 점에 대해서 설명하도록 하겠다.

특히, 이번시간에는 주의할 점 중에서도 Batch Insert와 관련된 내용을 다루려고 한다.

@GeneratedValue 값 생성 전략

@GenerateValue 는 일반적으로, PRIMARY 키의 기본값을 자동으로 생성할때 사용한다.

대략적으로, 아래와 같은 생성전략이 존재한다.

생성 전략 설명
GenerationType.IDENTITY 데이터베이스에 키 생성방법을 위임
GenerationType.AUTO 각 데이터베이스 방언에 따라 자동으로 지정(기본 값)
GenerationType.TABLE
GenerationType.SEQUENCE 데이터베이스의 시퀸스를 이용해서 키 값을 생성

그럼 이제 @GeneratedValue 를 사용할때 생성 전략에 따라 Batch Insert 를 쓸수 있는지 없는지에 대한 관계를 알아보도록 하겠다.

Hibernate Batch Insert

하이버네이트(Hibernate) 에서는 여러개의 데이터를 한번에 Insert, Update 하게 해주는 기능인 Batch 기능을 지원하고 있다.

보통 아래와 같이 옵션으로 지정이 가능하다.

  jpa:
    hibernate:
      ddl-auto: create
    properties:
      hibernate:
        generate_statistics: true
        dialect: org.hibernate.dialect.H2Dialect
        show_sql: true
        format_sql: true
        order_inserts: true
        order_updates: true
        jdbc:
          batch_size: 1000

그리고, Spring Data JPA 의 saveAll 함수를 사용하면, 여러개의 데이터를 한번에 Insert 또는 Update 할 수 있다.

하지만, @GeneratedValue 키 값 생성 전략을 Identity나 Auto로 정해놓는 경우 하이버네이트(Hibernate)에서 Batch Insert 기능을 비활성화 시켜놓고 Insert 작업을 수행하게 된다.

따라서, saveAll 과 같은 함수를 사용해도 데이터 개수만큼 INSERT 또는 UPDATE 쿼리가 나가게 된다.

그렇기 때문에, 만약 한꺼번에 여러개의 데이터를 Insert 또는 Update 해야되는 Entity의 경우 @GeneratedValue의 키값 생성 전략을 GenerationType.SEQUENCE 또는 GenerationType.TABLE 로 설정해놓고 사용하기를 바란다.

출처

  1. 자바 ORM 표준 JPA 프로그래밍 - 기본편
  2. https://stackoverflow.com/questions/59002107/spring-data-jpa-saveall-not-doing-batch-insert
  3. https://docs.jboss.org/hibernate/orm/current/userguide/html_single/Hibernate_User_Guide.html#batch-session-batch
반응형
Comments