반응형
JPA의 기본키 매핑전략에는 총 3가지가 있다!
1.Identity
-DB에게 ID생성을 맡기는 방법!
2.Sequence
-시퀸스를 이용하여 ID를 증가시키는 방법!
3.Table
-시퀸스처럼 사용할 수 있는 테이블을 생성하여 ID를 증가시키는 방법! (모든데이터베이스에 사용가능하다는 장점이 있다)
Table전략은 아직 고민할 경험은 해보지못했으므로 패스하고,
나는 Identity나 Sequence에서 골라서 사용해왔다.
그 중에서 Sequence를 사용하는 편이긴했는데,
왜냐하면 Identity의 경우에는 Persist후에 DB와의 통신을 통해 ID값을 얻어와야하기 때문이다.
이게무슨말이냐면..
JPA의 영속성 컨텍스트 내의 1차캐시는 다음과 같은 구조를 갖고있다.
여기서 개발자가 persist를 통해 엔티티를 생성하여 등록을 한다면
JPA에서는 바로 DB에 반영되는게 아니라, 1차캐시에 등록이된다. (쓰기지연 SQL저장소에도 Insert쿼리가 등록되게 된다.)
그런데, 1차캐시에는 ID값으로 해당 객체들을 구분을 한다.
그러나 아직 ID값이 없다.
왜냐하면, Identity전략의 경우에는 DB에게 ID생성을 맡기게되는데
아직 DB와의 통신을 하지않았으므로 ID를 모르니까!
따라서, 이 문제를 해결하기 위해 JPA는 Persist때마다 DB와의 통신을한다.
그렇다. 결과적으로
로직 상에 존재하는 Persist때마다 DB와의통신을 해야한다.
비지니스 로직이끝날때 한번에 DB에 쿼리들을 Flush하여 성능을 최적화 하기를 원했다면,
그러한 '버퍼링'의 이점을 취하지 못한다.
따라서 이런 '버퍼링'기능이 아쉬워서 나는 Sequence전략을 사용한다.
(사실 비지니스 로직이 너무복잡하지 않은이상, 버퍼링을 통한 성능향상은 그렇게 드라마틱하지는 않다고 한다는 의견이 있다곤 들었다.
반응형
'재학습 > JPA' 카테고리의 다른 글
ID생성전략 없이 Custom String ID를 만들어보자! (2) | 2021.07.26 |
---|---|
JPA 필요없는 쿼리가 나간다? (0) | 2021.07.21 |