인프런 김영한님의 '자바 ORM 표준 JPA 프로그래밍 - 기본편'을 듣고 정리한 내용입니다.
1. Identity 전략
@Id @GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
- GeneratedValue는 키 생성을 db에게 맡긴다는 뜻이다. 이 때 사용되는 전략이 4가지 있는데, 그 중 하나가 바로 identity 전략입니다.
- Identity 전략의 개요는 다음과 같습니다.
- Identity 전략의 경우, insert 쿼리를 때려서 db에 데이터를 넣어보기 전까지는 id를 알 수가 없습니다. 따라서 jpa는 보통 commit 시점에 한 번에 쿼리를 때리는 반면, 여기서는 어쩔 수 없이 EntityManager.persist() 메서드 호출 즉시 insert 쿼리를 날리게 됩니다.
2. Sequence 전략
@SequenceGenerator(name = "GENERATOR_NAME",
sequenceName = "매핑할 데이터베이스 시퀸스 이름",
initialValue = '시작 값', allocationSize = '증가 값')
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
- initialValue : 말 그대로 시작할 값
- allocationValue : 한 번 sequence generator를 호출할 때 마다 증가시킬 값. Default = 50
Sequence 전략 개요는 다음과 같습니다.
- 왜 allocationValue의 default 값이 50일까?
- allocationValue = 1일 때는 identity 전략과 다를 것이 없습니다.
- allocationValue = 50일 때는 다음과 같은 일이 일어납니다.
→ 한 번 호출 시 DB에는 50개를 땡겨놓습니다. (미리 확보)
→ 메모리에서 1 ~ 50까지 씁니다.
→ 50까지 다 쓰면 다시 DB에서 땡겨옵니다. 이렇게 하면 계속해서 DB와 통신할 필요가 없습니다.
그렇다면 멀티스레딩 상황 등에서는 어떻게 동작할까요?
- DB에서 미리 값을 올려놓기 때문에 멀티스레드 환경에서도 안전하게 동작이 가능합니다.
3. Identity v.s Sequence
4. 기타 전략
- Table : 키 생성용 테이블을 운영하는 것으로, 모든 DB에서 적용 가능하나 성능이 떨어지는 단점이 있습니다.
- Auto : 각 데이터베이스의 방언에 따라 자동으로 기본키 매핑을 할 수 있도록 해줍니다. @GeneratedValue의 디폴트 값입니다.