기본키 제약조건 : NULL 아님, 유일, 변하면 안된다.
(오랜 기간동안 변하면 안된다.)
Long + 대체키 + 키 생성 전략을 사용하는 것이 좋다.
(오토 인크리먼트나 시퀀스를 쓰는것을 권장 또는 UUID)
IDENTITY 전략은 id에 값을 넣으면 안된다.
id값을 DB에 들어가 봐야 알 수 있다.
JPA는 영속성 컨텍스트에 넣기 위해 id(pk)값이 필요하다. 그래서 트랜잭션 커밋 시점에 쿼리를 날리는 것이 아니라, 영속화 하는 단계에서 쿼리가 날아가게된다.
따라서 IDENTITY 전략을 사용할 경우 모아서 쿼리를 날릴 수 없게 된다.
SEQUENCE도 id 값을 DB에 들어가야 알 수 있다.
IDENTITY와 다르게 쿼리를 바로 날리지는 않는다.(버퍼링이 가능함)
그런데 중간에 자꾸 네트워크를 타기 때문에 성능에 문제가 있을 수 있을 것같다.
그래서 JPA는 다음을 지원한다.
@SequenceGenerator에서 allocationSize 옵션이 있는데 이 값이 기본으로 50이다.
미리 50개를 DB에 올려놓고 (DB는 51) 메모리에서 1씩 쓰는 것이다.
이렇게 하면 매 순간 DB에 요청하는 것이 아니라 한번 요청하고 메모리에서 설정한 만큼 쓴 후에 51을 마주치는 순간 다시 요청하게 된다.
좋은 글 감사합니다.