[JPA] 기본 키(Primary Key) 매칭 4가지 전략 -@Id,@GeneratedValue

조성현·2023년 3월 6일
0

Spring

목록 보기
1/4

데이터베이스

기본 키 매칭 4가지 전략을 알아보기 위하여 먼저 @Id 어노테이션의 기능을 먼저 알아보아야 합니다.

💗 @Id란?

데이터베이스 테이블의 기본 키(PK)와 객체의 필드를 매핑시켜주는 어노테이션입니다.

기본 키(PK)를 나타내기 위해 @Id를 사용하고, 그에 대한 생성 전략을 사용하기 위해 @GeneratedValue 어노테이션을 사용하는 것인데, @GeneratedValue를 사용하지 않을 경우, 저희가 직접 식별자 값을 지정을 해주어야 합니다.

기본 키를 직접 할당하는 대신 데이터베이스가 생성해주는 값을 사용하려면 @GeneratedValue를 사용해주면 됩니다.


💗 @GeneratedValue

기본키(PK) 값에 대한 생성 전략을 제공합니다. @Id 와 함께 엔티티 또는 매핑된 슈퍼클래스의 기본 키 속성 또는 필드에 적용할 수 있습니다.

@GeneratedValue 어노테이션에는 4가지 전략(strategy) 이 존재합니다.


1. IDENTITY

@GeneratedValue(strategy = GenerationType.IDENTITY)

IDENTITY 전략은 기본 키 생성을 해당 데이터베이스에게 일임하는 전략입니다.
예를 들어서, MySQL에서는 AUTO_INCREMENT를 사용해서 기본 키를 생성합니다.

IDENTITY 전략은 AUTO_INCREMENT처럼 데이터베이스에 값을 저장하고 나서야 기본 키 값을 구할 수 있을 때 사용합니다.

AUTO_INCREMENT란?

insert문을 보낼때 마다 자동으로 값이 증가되게 저장할 수 있는 MySQL 속성 중 하나입니다.

주의점

엔티티가 영속 상태가 되기 위해서는 식별자가 필수입니다.
그런데 IDENTITY 전략을 사용하면 식별자를 데이터베이스에서 지정하기 전까지는 알 수 없기 때문에, em.persist()를 하는 즉시 INSERT SQL이 데이터베이스에 전달됩니다.
따라서 이 전략은 트랜잭션을 지원하는 쓰기 지연이 동작하지 않습니다.

쓰기 지연에 관해서는 이곳에서 잘 확인이 가능합니다.
JPA, 영속성 컨텍스트의 이점 (트랜잭션을 지원하는 쓰기 지연)


2. SEQUENCE

@GeneratedValue(strategy = GenerationType.SEQUENCE)

데이터베이스 시퀀스는 유일한 값을 생성해주는 데이터베이스 오브젝트입니다.
SEQUENCE 전략은 기본 키를 해당 시퀀스를 사용해서 생성합니다.

이 전략은 시퀀스를 지원하는 오라클, PostgreSQL, H2 데이터베이스에서 사용할 수 있습니다.


3. TABLE

@GeneratedValue(strategy = GenerationType.TABLE)

TABLE 전략은 키 생성 전용 테이블을 하나 만들고, 여기에 이름과 값으로 사용할 컬럼을 만들어 데이터베이스 시퀀스를 흉내내는 전략입니다.

이 전략은 테이블을 사용하기 때문에, 시퀀스를 지원하지 않는 데이터베이스에서도 사용할 수 있습니다.

SEQUENCE 전략과 매우 흡사하여, 시퀀스 대신 테이블을 사용하는 것 이외에는 내부 동작방식이 같습니다.


4. AUTO

@GeneratedValue(strategy = GenerationType.AUTO)

AUTO 전략은 데이터베이스에 따라서 IDENTITY, SEQUENCE, TABLE 전략 중 하나를 자동으로 선택해서 기본 키를 생성해줍니다.

@GeneratedValue의 strategy의 기본값은 AUTO이며, 만약 AUTO를 사용할 때 SEQUENCE나 TABLE 전략이 선택되면, 시퀀스나 키 생성용 테이블을 미리 만들어 두어야 합니다.


참조한 링크

[JPA] 기본 키(Primary Key)매핑 - @Id, @GeneratedValue
@Id / @GeneratedValue에 대해 알아보자

profile
평범한 개발자의 글

0개의 댓글

관련 채용 정보