JPA에서 엔티티와 테이블의 기본키를 매핑할 때 사용하는 어노테이션은
@Id와 @GeneratedValue 이렇게 두 개가 있다.
키 값을 직접 할당할 때는 @Id 만 사용하고
자동생성으로 할당하고 싶을 때 @GeneratedValue를 같이 사용한다.
@GeneratedValue는 키 생성 전략으로
Identity, Sequence, Table 이렇게 3가지가 있다(AUTO는 DB의 dialect에 따라 자동 지정)
전략의 차이는 키를 만드는 방법이다.
1. Identity
Identity는 데이터베이스에 전적으로 위임한다.
INSERT 쿼리 패싱 할 때 null값을 날리면 DB에서 자동으로 생성해서 세팅을 해주는데 여기서 작은 문제가 생긴다.
JPA의 영속성 컨텍스트에 등록이 되려면
PK값이 무조건 있어야 하는데 실제로 DB에 데이터가 INSERT가 되기 전에는 PK값을 알 수 없다.
고로 전략을 Identity로 선택하면 EntityManager의 persist단계에서 INSERT가 실행되는 것을 확인할 수 있다.



2. Sequence
Sequence는 시퀀스 오브젝트를 만들어 키를 생성한다.


시퀀스 전략은 시퀀스 제너레이터를 선언해야 사용할 수 있다.
이를 적용하면, 시퀀스 테이블을 생성하며 시퀀스 오브젝트가 생성된다.

persist단계에서 시퀀스 오브젝트의 시퀀스를 가져와 ID로 사용하게 되며,
commit 시점에서 INSERT가 이뤄진다.

3. Table
Table 전략은 말 그대로 키 생성을 위한 테이블을 만들어 키를 생성한다.


테이블 전략은 시퀀스와 비슷하게, 테이블 제너레이터를 선언하여 사용한다.
시퀀스는 오브젝트에서 가져왔다면 테이블 전략은 테이블에서 키를 생성한다.

테이블 전략의 장점은 모든 DB에 적용할 수 있다는 것이고,
단점은 네트워킹 횟수가 늘어남으로 성능 이슈가 있을 수 있다는 것이다.
단점을 극복하기 위해 나온 옵션으로 allocationSize가 있다.
예를 들어 회원가입이 계속 이루어져 Id를 계속 Select 해와야 되는 경우
select 횟수 = 회원수 가 되는데
allocationSize를 50으로 설정해 놓으면
한 번에 1~51까지 id를 미리 끌어와 저장해놓고 50까지는 알아서 id를 할당하게 된다.
51이 되면 다시 50개의 숫자를 가져온다.
고로 select 횟수는 회원수/50이 되는 것이다.
그렇다고 무작정 크게 잡아서는 안되는데
웹서비스를 내리고 다시 올리면 그 시퀀스의 빈 공간만큼 갭이 생기기 때문에 낭비라고 볼 수 있다.
'PROGRAMMING > JPA' 카테고리의 다른 글
| [JPA] 고아 객체 (Orphan Entity)와 orphanRemoval (0) | 2021.09.12 |
|---|---|
| [JPA] 지연 로딩과 즉시 로딩 (0) | 2021.09.11 |
| [JPA] Persist 시점 에러 (0) | 2021.09.06 |
| [JPA] @MappedSuperclass (0) | 2021.09.05 |
| [JPA] hibernate.hbm2ddl.auto 옵션 (0) | 2021.07.25 |