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 프로그래밍 (김영한 지음)