-
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 설정
- 장점: 특정 데이터베이스에 종속되지 않으므로 이식성이 좋다.
- 단점: 데이터베이스에 따라 선택되는 전략이 다를 수 있으므로, 예측 가능한 동작을 보장하기 어렵다.세 전략의 차이점

'CS > Spring' 카테고리의 다른 글
spring Batch 5.x (2) - 실습 (1) 2024.09.23 spring Batch (0) 2024.09.16 Kafka(1) - 카프카란 무엇일까? (0) 2024.07.26 JPA - N+1 문제 해결하기, 성능개선(페이징 처리) (0) 2024.07.22 Spring Security - 동작 과정, 로그인 구현하기 (0) 2024.07.04