프레임워크 & 라이브러리/JPA
[JPA] 기본 키 자동 생성 전략 (GenerationType)
괴발맨
2023. 4. 13. 22:22
다음과 같이 엔티티를 INSERT할때 기본 키를 JPA가 자동생성하도록 할 수 있다.
@Id @GeneratedValue(startegy = GenerationType.AUTO)
private Long id;
startegy 에 다양한 기본 키 매핑 전략을 설정할 수 있다.
JPA는 4개의 전략을 제공한다.
참고로 JPA는 대리키를 기본키로 사용하는 것을 추천한다.
(회원아이디, 이메일, 주민등록번호 등이 아닌 그냥 기본키를 위한 값)
GenerationType.IDENTITY
- 데이터베이스에 기본키 생성을 위임한다. 예를 들어 MySQL의 auto_increment, PostgreSQL의 serial을 사용한다.
- 주의점
- persist 시 즉시 INESRT 쿼리가 실행됨. 이러면 쓰기 지연 할 수 없음 -> bulk insert 불가함.
GenerationType.SEQUENCE
- DB 시퀀스를 사용해 기본 키를 생성한다. (시퀀스 지원하는 DB에만 사용 가능)
- @SequenceGenerator 애노테이션으로 시퀀스 구체화 가능
- allocationType (기본값 50) : 시퀀스가 설정한 값만큼 증가한다. JPA는 증가한 만큼 메모리에 가져와서 매번 INSERT할때마다 시퀀스를 조회하지 않을 수 있게 해준다.
- 주의점
- hibernate.id.new_generator_mappings:true 설정 필수. 아니면 예전의 키 생성 최적화 방식을 사용함
GenerationType.TABLE
- 시퀀스를 흉내낸 테이블을 생성해 SEQUENCE 전략과 같은 방식으로 기본키를 자동 생성한다.
- 모든 DB에서 사용 가능하다.
- 주의점
- INSERT시 시퀀스 테이블 값 조회 -> 업데이트 (값 증가) 해야하기 때문에 SEQUENCE 전략에 비해 상대적으로 느림
GenerationType.AUTO
- 데이터베이스 방언(Dialect)에 따라 나머지 3개 중 하나를 자동 선택한다. (IDENTITY, SEQUENCE, TABLE)
- 예시) 오라클이면 SEQUENCE, MySQL이면 INDENTITY 사용
IDENTITY를 사용하면 벌크(multi-row) INSERT 할 수 없다.
왠만하면 SEQUENCE를 사용하는게 제일 좋아보인다.