GenerationType의 IDENTITY와 SEQUENCE

단비·2023년 5월 24일
0

학습

목록 보기
65/66

Java의 Entity 생성 중 ID(primary key)는 @GeneratedValue로
식별자값을 자동으로 생성시켜주는 옵션을 설정할 수 있다

배울 때 MySQL은 IDENTITY를 쓰면 된다고 해서 무작정 썼는데
드디어 찾아봤다

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long idx;




1. GenerationType.AUTO

  • hibernate.dialect에 설정된 DB 방언 종류에 따라, 하이버네이트가 자동으로 전략을 선택하게끔 위임
  • Hibernate 5부터 MySQL에서의 GenerationType.AUTO는 IDENTITY가 아닌 TABLE을 기본 시퀀스 전략으로 가져감



2. GenerationType.IDENTITY

  • 기본 키 생성을 데이터베이스에 위임
  • 주로 MySQL, PostgreSQL, SQL Server, DB2에서 사용한다. (예: MySQL의 AUTO_ INCREMENT)
  • em.persist()로 객체를 영속화 시키는 시점에 곧바로 insert 쿼리가 DB로 전송되고, 거기서 반환받은 식별자 값을 가지고 1차 캐시에 엔티티를 등록시켜 관리

JPA는 보통의 경우에, 트랜잭션이 commit 되는 시점에 쓰기 지연 저장소에 모아놓은 SQL을 한 번에 DB로 전송하며 실행한다.
이렇게 해야 어플리케이션과 DB 사이에 네트워크를 오가는 횟수가 줄어들고 성능면에서 이득을 볼 수 있기 때문이다.


하지만 IDENTITY전략은 DB에 기본키 생성을 위임하므로, Mysql의 경우 AUTO_INCREMENT를 활용하여 생성하는데,

이 때, JPA 입장에선 DB에 INSERT SQL를 실행하기 전엔 도저히 AUTO_INCREMENT되는 값을 알 수 없으므로, persist() 시점에 insert 쿼리가 실행되는 것이다.(영속성 컨텍스트로 엔티티를 관리하려면 1차 캐시에 Id값을 key 값으로 들고 있어야 하기 때문에)



3. GenerationType.SEQUENCE

  • DB의 시퀀스를 활용하여 Id값을 증가시킴
  • 오라클, PostgreSQL, DB2, H2 데이터베이스에서 사용

시퀀스
유일(UNIQUE)한 값을 생성해주는 오라클 객체

@SequenceGenerator

속성설명기본값
name식별자 생성기 이름필수
sequenceName데이터베이스에 등록되어 있는 시퀀스 이름hibernate_sequence
initialValueDDL 생성 시에만 사용됨, 시퀀스 DDL을 생성할 때 처음 시작하는 수를 지정1
allocationSize시퀀스 한 번 호출에 증가하는 수(성능 최적화에 사용됨)
데이터베이스 시퀀스 값이 하나씩 증가하도록 설정되어 있으면 이 값을 반드시 1로 설정해야 함
50
catalog, schema데이터베이스 catalog, schema 이름
@Entity 
@SequenceGenerator( 
     name = “MEMBER_SEQ_GENERATOR", 
     sequenceName = “MEMBER_SEQ", //매핑할 데이터베이스 시퀀스 이름
     initialValue = 1, allocationSize = 50) 
public class Member { 
     @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, 
     generator = "MEMBER_SEQ_GENERATOR") 
     private Long id; 
 }





참고사이트

JPA 기본키 생성 전략, @GeneratedValue 사용시 주의점

profile
tistory로 이전! https://sweet-rain-kim.tistory.com/

0개의 댓글