기본 키 매핑(Primary Key Mapping)

신상현·2021년 2월 8일
0

Spring Boot와 JPA

목록 보기
9/16

  • 직접 할당 : 기본 키를 어플리케이션에서 @Id로 직접 할당한다.
  • 자동 생성
    1. IDENTITY : 기본 키 생성을 DB에 위임한다. DB저장->영속성 저장
    2. SEQUENCE : DB 시퀀스를 사용해서 기본 키를 할당한다. 영속성 저장->DB저장
    3. TABLE : 키 생성 테이블을 사용한다.

DB마다 기본 키를 생성하는 방식이 서로 다르다.
따라서 어떤 DB를 사용하는가에 따라서 선택할 수 있는 자동 생성 전략이 다르다.


직접 할당

  • @Id로 매핑한다.
  • 영속성 컨텍스트는 식별자 값으로 엔티티 객체를 구분한다.
  • 따라서 em.persist() 전에 직접 기본 키를 할당해야한다.
Member member = new Member();
member.setId("1");

em.persist(member);
  • 매핑 가능 자바 타입
    • 자바 기본형
    • 자바 Wrapper형
    • String
    • java.util.Date
    • java.sql.Date
    • java.math.BigDecimal
    • java.math.BigInteger

자동할당

IDENTITY 전략

@GeneratedValue(strategy = GenerationType.IDENTITY)

  • IDENTITY 전략은 기본 키 생성을 DB에 위임하는 전략이다.
  • IDENTITY 전략은 DB에 INSERT 하고나서야 값을 조회할 수 있다. Ex) AUTO_INCREMENT
  • 하이버네이트는 저장과 동시에 저장함으로써 DB와 한 번만 통신한다.
  • 이 전략은 엔티티를 저장해야 기본 키 값을 구할 수 있으므로, em.persist()를 호출하는 즉시 Insert SQL이 전달되므로 일반적인 쓰기 지연이 동작하지 않는다.

SEQUENCE 전략

// 1. 시퀀스 생성
CREATE SEQUENCE BOARD_SEQ START WITH 1 INCREMENT BY 1;
@Entity
@SequenceGenerator (			// 2. 시퀀스 제너레이터 생성
	name="BOARD_SEQ_GENERATOR",
	sequenceName = "BOARD_SEQ",
	initialValue = 1,
    	allocationSize = 1)
public class Board {

	@Id				// 3. 기본키와 시퀀스 제너레이터 매핑
	@GeneratedValue(strategy = GeneratedType.SEQUENCE, 
			generator = "BOARD_SEQ_GENERATOR")
	private Long id;
  1. 시퀀스 생성
  2. 시퀀스 제너레이터 생성
  3. 기본키와 시퀀스 제너레이터 매핑
  • DB 시퀀스는 유일한 값을 순서대로 생성하는 DB의 오브젝트다.
    이 전략은 시퀀스를 지원하는 DB에서만 사용이 가능하다.
  • 먼저 DB 시퀀스를 사용해서 식별자를 조회한다.
  • 조회한 식별자를 엔티티에 할당한 후, 영속성 컨텍스트에 저장한다.
  • 커밋(플러시)가 일어나면 DB에 엔티티가 저장된다.
  • SequenceGerator.allocationSize의 기본 값이 50임에 주의한다!
    • DB와 통신하는 횟수를 줄이기 위해서 한 번에 50개 증가시키고 할당하기 때문이다.

TABLE 전략

  • 키 생성 전용 테이블을 하나 만들고, 이름과 값으로 사용할 컬럼을 만들어 DB의 시퀀스를 흉내내는 전략이다.

  • 따라서, 내부 동작 또한 시퀀스 전략과 같다.

  • 또한, 테이블을 만들어서 사용하기 때문에, DB 종류에 상관없이 모두 사용 가능하다.

AUTO 전략

알아서 JPA가 DB 방언에 따라서 설정해준다.

profile
개발자 싱상형

0개의 댓글