Web/JPA

4-2. Entity 매핑 (2)

돌건 2021. 6. 11. 20:13

4. 기본 키 매핑

1. 직접 할당

기본 키를 어플리케이션에서 직접 할당하는 기본 키 매핑 방법이다. 기본 키를 직접 할당하기 위해선 @Id로 매핑한다.

@Id
@Column(name = "id")
private String id;

 

@Id를 적용할 수 있는 자바 타입은 다음과 같다.

1. 자바 기본형
2. 자바 wrapper 클래스
3. String
4. java.util.Date
5. java.sql.Date
6. java.math.BigDecimal
7. java.math.BigInteger

 

기본 키 직접 할당 전략은 em.persist()로 엔티티를 저장하기 전에 어플리케이션에서 기본 키를 직접 할당한다.

Board board = new Board();
board.setId("board1");
em.persist(board);

2. 자동 생성 - IDENTITY 전략

이 전략은 기본 키 생성을 데이터베이스에 위임하는 전략이다. MySQL, PostgreSQL, SQL Server, DB2에서 주로 사용한다. MySQL의 AUTO_INCREMENT를 생각해보자. 이 전략은 DB에 값을 저장하고 나서야 기본 키 값을 구할 수 있을 때 사용한다.

직접 할당과는 다르게 자동 생성 전략을 사용하는 경우, @Id와 @GeneratedValue를 함께 사용해 식별자 생성 전략을 선택해야 한다. 
// IDENTITY 매핑
@Entity
public class Board {
	
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
}

// IDENTITY 사용
private static void sample(EntityManager em) {
	Board board = new Board();
    em.persist(board);
}


📌 엔티티가 영속 상태가 되려면 식별자가 반드시 필요하다. IDENTITY 전략엔티티를 DB에 저장해야 식별자를 구할 수 있으므로 em.persist()를 호출하는 즉시 INSERT SQL이 DB에 전달된다. 즉, 트랜잭션 쓰기 지연이 동작하지 않는다. 📌


3. 자동 생성 - SEQUENCE 전략

시퀀스는 유일한 값을 순서대로 생성하는 데이터베이스 오브젝트이다. 이 전략은 Oracle, PostgreSQL, DB2, H2 에서 사용할 수 있다.

CREATE TABLE BOARD (
	ID BIGINT NOT NULL PRIMARY KEY,
    DATA VARCHAR(255)
)

// 시퀀스 생성
CREATE SEQUENCE BOARD_SEQ START WITH 1 INCREMENT BY 1;​


// 시퀀스 매핑
@Entity
@SequenceGenerator(
    name = "BOARD_SEQ_GENERATOR",
    sequenceName = "BOARD_SEQ",
    initialValue = 1, allocationSize = 1)
public class Board {
	
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE,
    		    generator = "BOARD_SEQ_GENERATOR") // 시퀀스 생성기 선택
    private Long id;
    
}​

id 식별자 값은 BOARD_SEQ_GENERATOR 시퀀스 생성기가 할당하게 된다.

1. em.persist()를 호출할 때 먼저 데이터베이스 시퀀스를 사용해 식별자를 조회한다.
2. 조회한 식별자를 엔티티에 할당한다.
3. 엔티티를 영속성 컨텍스트에 저장한다.
4. 트랜잭션 커밋을 통해 플러시가 일어나면 엔티티를 DB에 저장한다.

 

 

@SequenceGenerator

속성 기능 기본값
name 식별자 생성기 이름 필수
sequenceName 데이터베이스에 등록되어 있는 시퀀스 이름 hibernate_sequence
initialValue DDL 생성 시에만 사용된다.
시퀀스 DDL을 생성할 때 처음 시작하는 수를 지정한다.
1
allocationSize 시퀀스 한 번 호출에 증가하는 수 50
✅ JPA는 시퀀스에 접근하는 횟수를 줄이기 위해 @SequenceGenerator.allocationSize를 사용한다. 이 속성을 설정한 값만큼 한 번에 시퀀스 값을 증가시키고 나서 그만큼 메모리에 시퀀스 값을 할당한다. 예를 들어, 1~50을 메모리에 올려두고 식별자를 할당한다. 51이 되면 시퀀스 값을 100으로 증가시킨 뒤 메모리에 올린 후 식별자를 할당한다. 이 방법은 여러 JVM이 동시에 동작해도 기본 키 값이 충돌하지 않는 장점이 있다. 

 

4. 자동 생성 - TABLE 전략

키 생성 전용 테이블을 하나 만들어 여기에 이름과 값으로 사용할 컬럼을 만들어 DB에 시퀀스를 흉내내는 전략이다. 이 전략은 시퀀스 대신에 테이블을 사용한다는 것을 제외하면 시퀀스 전략과 내부 동작 방식이 동일하다.

 

 

참고 문헌: 자바 ORM 표준 JPA 프로그래밍 (김영한 지음)