Spring Data JPA에서 기본키를 할당하는 방법은 크게 2가지가 있다.

  • 직접 할당: 기본 키를 어플리케이션에서 직접 할당하는 방법
  • 자동 할당: 데이터베이스가 자동으로 할당해주는 방법

직접 할당

직접 할당은 어플리케이션 단에서 직접 할당하는 방법이다. 단순하게 Entity 컬럼에 @Id 어노테이션만 붙여주면 된다. (@GeneratedValue 는 붙히지 않는다)


자동 할당

기본키 자동 할당 방법은 아래와 같은 전략들이 있다.

  • IDENTITY
  • SEQUENCE
  • TABLE
  • AUTO

1. GenerationType = IDENTITY

이 전략은 기본키 생성을 데이터베이스에 위임하는 전략이다. 주로 MySQL, PostgreSQL, SQL server 에서 사용한다.

엔티티가 영속 상태가 되기 위해선 식별자가 필요한데, IDENTITY 전략을 사용하면 식별자를 데이터베이스에서 지정하기 전까지 알 수 없기에, persist 를 하는 즉시, INSERT SQL 이 데이터 베이스에 전달된다. 그렇기에 IDENTITY 전략을 사용하면 쓰기 지연이 동작하지 않는다.

1. persist() 함수 호출 (영속성 상태로 만듦)
2. INSERT 쿼리를 데이터베이스 전달 (저장)
3. 기본키 할당

2. GenerationType = SEQUENCE

이 전략은 데이터베이스 시퀀스 오브젝트를 이용해서 기본키를 매핑하는 전략이다. Oracle, PostgreSQL, H2 데이터베이스에서 사용할 수 있다.

SEQUENCE 전략을 사용하기 위해선 사용할 데이터베이스 시퀀스를 매핑해야 한다.
@SequenceGenerator를 이용해 시퀀스 생성기를 등록한 후, @GeneratedValue의 generator 속성으로 시퀀스 생성기를 선택할 수 있다.
1. persist() 함수 호출
2. 데이터베이스 시퀀스로 식별자 조회
3. 식별자를 엔티티에 할당하고 영속성 상태로 만듦
4. 엔티티 데이터베이스에 저장

3. GenerationType = TABLE

키 생성 전용 테이블을 만들고, 이름과 값으로 사용할 컬럼을 만들어 데이터베이스 시퀀스를 흉내내는 전략. 모든 데이터베이스에서 사용 가능하나, 성능이 좋지 못하다. 시퀀스 전략과 매우 흡사하며, 시퀀스 값 대신 테이블을 사용하는 것 이외에는 내부 동작방식이 같다.

4. GenerationType = AUTO

이 전략을 사용하면 데이터베이스 방언에 따라 IDENTITY, SEQUENCE, TABLE 전략 중 하나를 자동으로 선택한다. (권장되지 않는다) 또한, @GeneratedValue 의 기본 전략은 AUTO 값이다.

만약 AUTO를 사용할 때 SEQUENCE 혹은 TABLE 전략이 선택되면, 해당 시퀀스나 키 생성 전용 테이블을 만들어 두어야 한다.

만약 스키마 자동 생성 기능(ddl-auto)을 사용한다면, 하이버네이트가 기본값을 사용해서 적절하게 만들어 준다.

태그: ,

카테고리:

업데이트: