JPA 기본키 매핑 전략
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)을 사용한다면, 하이버네이트가 기본값을 사용해서 적절하게 만들어 준다.