@GeneratedValue(stragey= 전략 )
전략에는 크게 4종류가 존재한다.
Identity - 기본키생성을 hibernate가 아니라 데이터베이스가 하도록 위임한다.
데이터를 저장한 후 commit 시점에 최적의 상황을 고려하여 쿼리를 실행시키는 것이 아니라, persist() 시점에 insert 문이 바로 실행되고 DB 에서 기본키 값을 생성한다. 그리고 이 키 값을 가져와서 JPA 1차 캐시에 (key, entity) 키, 값을 저장한다.
따라서 IDENTITY 옵션 사용시 write-behind (쓰기지연) 기능을 무시한다. write-behind 는 한 트랜잭션 안에서 이루어지는 성능 최적화이므로 이 부분은 이루어지지 않아도 양보가 가능하다. 단, bulk insert 가 안되는 문제가 있을 수 있다. (다른 해결책이 있음)
Sequence
Hibernate가만들어주는 Sequence를 사용한다.
데이터베이스(Oracle 등)가 제공해주는 시퀀스를 사용할 수 있다. @SequenceGenerator 등록이 필요하다.
@Entity
@SequenceGenerator(
name = "BADGE_SEQ_GENERATOR",
sequnceName = "BADGE_SEQ",
initialValue = 1,
allocationSize = 50)
public class Badge {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "BADGE_SEQ_GENERATOR")
private Long id;
private String name;
}
데이터 저장시 (persist()) 데이터베이스에서 시퀀스를 조회해서 JPA 1차 캐시에 (key, entity) 키, 값을 저장한다.
데이터베이스에 시퀀스를 조회하러 DB I/O 요청 cost가 생긴다. 하지만, initialValue 와 allocationSize 를 조정함으로써 메모리에 미리 순번을 저장해 놓을 수 있다. 따라서 대량의 insert 쿼리가 주로 발생하는 엔티티라면 이 값을 설정해주면 좋을 것이다.
initialValue 는 기본값이 1, allocationSize 는 기본값이 50이다. 즉 1부터 한번에 50개의 순번을 가져온다. 한 번에 더 많이 가져오려면 allocationSize = 100 등으로 이 값을 늘리면 될 것이다.
table
키 생성용 테이블을 별도로 사용하여 (마치 시퀀스처럼), 키를 생성한다.
모든 데이터베이스에서 적용가능하지만, 성능이 좋지 않으므로 실제 운영에서 잘 사용되지 않는다.
Auto
@Entity
public class Badge {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
}
이 전략옵션은 말그대로 '자동'으로 적절한 전략을 알아서 매핑시킨다. @GeneratedValue 라고만 쓰면 기본으로 AUTO 옵션을 사용한다.
Hibernate 는 적절한 옵션을 알아내기 위해 아래 논리대로 탐색한다.
- 기본키 타입이 UUID 일 때 UUID Generator가 된다.
- Number 타입이면, hibernate.id.new_generator_mapping 옵션(기본값 true)을 확인한다. 2-1. false 이면 Native Generator 를 사용한다. (MySQL 의 경우 auto_increment) 2-2. true 이면, Sequence Generator 를 사용한다. 2-2-1. 이 때 데이터베이스가 Sequence 를 지원하지 않는다면 TABLE Generator 를 사용한다.
Mysql을 사용하고 아무옵션도 주지않는다면 AUTO로 적용되어 SEQUENCE로 기본키를 자동으로 생성한다.
'JPA' 카테고리의 다른 글
REST API 생성시 고려사항1[회원등록] (0) | 2022.06.01 |
---|---|
엔티티 매핑 (0) | 2022.05.21 |