프레임워크 & 라이브러리/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를 사용하는게 제일 좋아보인다.