관리 메뉴

제뉴어리의 모든것

[JPA] 기본키 생성 전략 IDENTITY, SEQUENCE 의 차이 본문

Spring Boot/JPA

[JPA] 기본키 생성 전략 IDENTITY, SEQUENCE 의 차이

제뉴어리맨 2023. 3. 24. 15:16

IDENTITY VS SEQUENCE

IDENTITY 전략 먼저 Entity를 DB에 저장한 후에,

식별자를 조회해 Entity의 식별자로 할당하는 전략이다.

 

SEQUENCE 전략 em.persist() 호출 전에 먼저 DB Sequence를 먼저 조회한다.

그 후 조회한 식별자를 Entity에 할당한 후 Entity를 영속상태로 저장한다.

그 후 Transaction을 Commit하여 Flush가 발생할 때 해당 Entity를 DB에 저장한다.

 

 


기본적으로 영속성 컨텍스트에 엔티티가 영속되기 위해선 ID값이 필요하다. 그런데 Insert 될 데이터는 아직 ID 값이 존재하지 않는다.

이런 상황에서 IDENTITY는 우선 엔티티의 내용을 repository의 save() 메소드 실행시점에 DB로 바로 Insert를 날린다.

그리고 Insert를 날리고 할당 된 ID값을 애플리케이션의 영속성 컨텍스트 안에 있는 엔티티에 ID 값을 할당한다.

즉, @Transactional로 인해 트랜잭션이 만들어졌음에도 flush가 트랜잭션 종료 시점이 아니라 save() 메소드 호출 할때이다.

 

그러나 SEQUENCE는 엔티티를 영속성 컨텍스트에 영속(persist()) 시키기 전에  DB에게 이번에 데이터가 Insert 될 경우 할당 될 ID 값이 무엇인지 호출한다. 그리고 해당 값을 리턴 받고 그 ID 값을 엔티티에 할당 한 후 영속성 컨텍스트에 그제서야 엔티티를 영속시킨다. 그리고 트랜잭션이 종료 될때, 그제서야 실제 Insert 쿼리를 날리고 flush를 한다.


 

출처 : 

https://velog.io/@gillog/JPA-%EA%B8%B0%EB%B3%B8-%ED%82%A4-%EC%83%9D%EC%84%B1-%EC%A0%84%EB%9E%B5IDENTITY-SEQUENCE-TABLE