ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JPA - ID 생성 전략
    CS/Spring 2024. 8. 26. 02:23

    ID 생성 전략이란?

    jpa에서 ID생성 전략이라고 하면 생소할 수도 있지만, 아래 코드를 보면 익숙한 코드일 것이다.

    @GeneratedValue(stratgy = GenerationType.IDENTUTY)

     

    바로 이 코드가 ID생성 전략중 하나이다.

     

    - ID 생성 전략은 JPA(Java Persistence API)에서 엔티티의 기본 키(ID)를 자동으로 생성하고 관리하는 방법을 결정하는 설정이다.
    - JPA는 다양한 데이터베이스와 호환되도록 설계되었기 때문에, 서로 다른 데이터베이스에서 효과적으로 ID를 생성하고 관리할 수 있도록 여러 가지 ID 생성 전략을 제공한다.
    - JPA에서 ID 생성 전략을 지정할 때는 @GeneratedValue 어노테이션을 사용하고, 이 어노테이션의 strategy 속성을 통해 다양한 전략을 선택할 수 있다.

     

    ID생성 전략 종류

    IDENTITY

    - ID가 데이터베이스에 엔티티가 실제로 삽입될 때 생성
    - 데이터 베이스의 auto_increment 설정을 사용

     

    사용 예시 )

    @Id
    @GenerationValue(stratgy = GenerationType.IDENTITY)
    Long idx;

     

    SEQUENCE

    - ID가 데이터베이스 시퀀스를 사용하여 엔티티가 영속성 컨텍스트에 추가될 때 미리 할당됨.
    - 시퀀스는 데이터베이스에서 숫자 값을 순차적으로 생성하는 객체

     

    SEQUENCE란?

     

    시퀀스를 사용하는 테이블의 현재 ID 값이 10이고, 시퀀스도 현재 id값인 10을 기억하고 있다.

    이 상태에서 데이터를 저장하기 위해 시퀀스에 id값을 요청하면, 시퀀스는 자신이 가지고 있는 값에서 1을 더한 값을 id로 제공해준다.

     

    SEQUENCE 특징

    - 시퀀스는 성능이 좋고, 고유한 값을 생성하는 데 효율적
    - 하나의 시퀀스를 여러 엔티티가 공유 가능. 
    - 하나의 시퀀스를 공유할 경우, 관리가 용이해지지만 엔티티의 ID값이 연속적이 지 않을 수 있음.
    - 단점 : 모든 데이터베이스에서 시퀀스를 지원하지 않는다. 
    - 시퀀스를 지원하는 데이터 베이스 : Oracle, PostgreSQL, MariaDB (10.3 이상) 등,,,
    - 시퀀스를 지원하지 않는 데이터 베이스 : MySQL (5.x 이하 버전), SQLite, MongoDB 등,,,

     

    SEQUENCE의 성능

    1. 시퀀스는 데이터베이스 내에서 매우 경량화된 객체로, ID를 생성하는 작업이 매우 빠르다.
    2. allocationSize 설정이 성능을 최적화 시키기에 좋음
        - allocationSize란, JPA가 시퀀스에서 한 번에 가져올 ID의 개수를 설정하는 옵션이다.

        - 예를들어,  allocationSize가 4인 경우 sequence에 id값을 요청하면 4개의 id값을 한번에 가져올 수 있다.

        - 기본적으로 allocationSize는 50
        - 한번에 가져온 ID들은 메모리에 캐시되어 있다가, 이후 새로운 엔티티를 삽입할 때 사용

     

    IDENTITY에서 사용하는 auto_increment 설정은 데이터가 들어올 때마다 id값을 계산하는 과정 필요하다.

    하지만 sequence와 alloationsize를 사용하면, 한번에 여러 id값을 가져와놓고, 엔티티에 미리 id값을 할당 한 후에 데이터베이스에 삽입할 경우 데이터베이스는 id값을 계산하는 과정을 거치지 않아도 되기 때문에 성능적으로 유리하다.

     

     

    사용 예시 )

    @SequenceGenerator(name = "number_seq", sequenceName = "NUMBER_SEQ", allocationSize=10)
    @Id
    @GenerationValue(stratgy = GenerationType.SEQUENCE, generator = "number_seq")
    Long idx;

     

    name : JPA에서 사용할 시퀀스 제너레이터의 이름을 정의. jpa 내에서 고유해야함.
    sequenceName : 데이터베이스에서 실제로 사용할 시퀀스의 이름을 지정. 시퀀스 네임이 동일하면 같은 시퀀스를 사용하는 것.

     

    TABLE

    - 별도의 테이블(Table) 을 사용하여 고유한 ID를 생성하는 방식
    - 이 전략은 데이터베이스에 시퀀스 기능이 없는 경우에 사용
    - 테이블은 기본 키 값을 관리하는 역할을 하며 실제 데이터베이스에 id를 관리하는 테이블이 생성된다.
    - 테이블에는 엔티티 식별자와 해당 식별자의 현재 id 값을 저장하는 속성이 있다.
    - 하나의 테이블로 여러 엔티티가 공유할 수 있다.
    - 성능이 `SEQUENCE` 전략보다 떨어질 수 있습니다. 특히 동시성 이슈가 발생할 수 있다. (중복된 id 발생 가능성)
    - allocationSize 크기 설정 가능

     

    사용 예시 )

    @TableGenerator(name = "number_gen", table = "id_gen", pkColumnName = "gen_name", valueColumnName = "gen_value", pkColumnValue = "member_id" ,allocationSize=10)
    @Id
    @GenerationValue(stratgy = GenerationType.SEQUENCE, generator = "number_gen")
    Long idx;

     

    name : JPA에서 사용할 테이블 제너레이터의 이름.  jpa에서 고유해야함
    table : ID 값을 저장할 테이블의 이름
    pkColumnName : 테이블에서 사용할 기본 키 열의 이름 
    valueColumnName : 실제 ID 값을 저장할 열의 이름 
    pkColumnValue : 이 열에 저장될 값

     

    AUTO

    - JPA가 사용하는 데이터베이스의 특성에 따라 가장 적합한 ID 생성 전략을 자동으로 선택하는 방식
    - Auto 전략이 default 설정
    - 장점: 특정 데이터베이스에 종속되지 않으므로 이식성이 좋다.
    - 단점: 데이터베이스에 따라 선택되는 전략이 다를 수 있으므로, 예측 가능한 동작을 보장하기 어렵다.

     

     

     

    세 전략의 차이점

     

Designed by Tistory.