TIL - 기본 키 생성 전략

su·2023년 6월 29일
0

TIL

목록 보기
32/93
post-thumbnail

기본 키 생성 전략

Spring JPA에서 기본키를 생성할 때,

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

이런 식으로 사용했었다.
GenerationType.IDENTITY를 사용하면 id 값을 따로 주지 않아도,
원래 테이블에 있는 id 값에 따라서 자동으로 증가시켜준다.

IDENTITY

IDENTITY는 기본 키의 생성을 데이터베이스에 위임하는 전략이다
Auto Incresement 기능(자동 증가)을 제공하여, 기본 키의 값을 자동으로 생성하는 DBMS에서 사용한다.

위의 내용처럼

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

이렇게 사용할 수 있다.

Data를 데이터베이스에 Insert한 후의 기본 키 값을 조회할 수 있다.
Entity에 식별자의 값을 할당하기 위해서는 JPA에서 추가로 데이터베이스를 조회해야 한다.

Entity가 영속 상태가 되려면 식별자가 반드시 필요한데, 이는 데이터베이스에 저장해야만 식별자를 구할 수 있는 방식이다.
persist() 호출 시, 즉시 Insert Query 문을 통해서 데이터베이스에 전달해 식별자를 가져온다.
따라서 Transaction을 지원하는 쓰기 지연 방식이 동작할 수 없다.

SEQUENCE

SEQUENCE는 데이터베이스 SEQUENCE를 사용해서 기본키를 할당하는 방식이다.
아래의 코드처럼 데이터베이스에서 Sequence를 생성한 후에 사용가능하다.

CREATE SEQUENCE USER_SEQ START WITH 1 INCREMENT BY 1; 

그리고 이후에 엔티티를 생성할 때, @SequenceGenerator 에너테이션을 사용한다.

@Entity
@SequenceGenerator (
	name = "USER_SEQ_GENERATOR",
    sequenceName = "USER_SEQ",
    initialValue = 1,
    allocationSize = 1
)
public class Post {
	@Id
    @GeneratedValue (
    	strategy = GenerationType.SQQUENCE,
        generator = "USER_SEQ_GENERATOR"
    private Long id;
}

IDENTITY & SEQUENCE

1) IDENTITY
Entity를 데이터베이스에 저장할 때 id도 함께 저장되므로
우선 Entity를 데이터베이스에 저장한 후에 식별자를 조회하여 Entity의 식별자로 할당한다.

2) SEQUENCE
persist() 호출 전에 먼저 데이터베이스 Sequence를 조회한다.
그 후에 조회한 식별자를 Entity에 할당한 다음 Entity를 영속 상태로 저장한다.
그 다음 Transaction을 Commit하여 Flush가 발생할 때 해당 Entity를 데이터베이스에 저장한다.

출처: 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#identity

profile
(❁´◡`❁)

0개의 댓글