본문 바로가기

PROGRAMMING/JPA

[JPA] @ID 와 @GENERATOR 전략

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 전략은 말 그대로 키 생성을 위한 테이블을 만들어 키를 생성한다.

 

 

테이블 전략은 시퀀스와 비슷하게, 테이블 제너레이터를 선언하여 사용한다.

시퀀스는 오브젝트에서 가져왔다면 테이블 전략은 테이블에서 키를 생성한다.

 

persist 시점에서 키를 select 해온다.

 

테이블 전략의 장점은 모든 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