JPAコレクションページ
🖊 パッチ結合の制限
1 : N 관계(xToMany)에서 패치 조인을 하게되면 1의 시점이 아닌 N의 시점으로
DB에서 데이터를 가져온 후 distinct 키워드에 따라 중복을 제거한다.
이 방식으로 페이징을 하게 되면 하이버네이트는 N의 시점으로 쿼리를 날려서 어플리케이션으로
데이터를 가져온 후 메모리에 맞춰서 페이징을 한다.
데이터 크기가 커지면 장애가 생길 수 있는 방법이기 때문에 페이징을 할 수 없다.
🖊 配置寸法の設定
이전 포스트에서 JPA 배치 사이즈 설정을 소개한 적이 있는데, 이를 활용하는 방법이다.
1. N : 1 관계는 그대로 패치 조인을 하고 1 : N 관계는 패치조인에서 뺀다. (페이징해도 문제 없음)
2. application.properties나 yml에
jpa.properties에 default_batch_fetch_size를 지정한다.(global)
-> 설정한 사이즈만큼 컬렉션의 개수를 SQL in 쿼리에 반영해서 어플리케이션으로 한 번에 가져온다.
컬렉션 엔티티 필드에 @BatchSize를 적용해도 같은 효과를 낸다.
in쿼리 최적화로 DB 데이터 전송량이 최적화 된다.
쿼리 호출 수는 join보다 증가하지만 페이징이 가능하다.
🖊 サイズはいくらがいいですか。
100 ~ 1000개가 적당하다.
데이터베이스에 따라 순간 부하가 증가할 수 있어서 1000개 이하로 지정하는 것이 좋다.
애플리케이션 입장에서는 100이든 1000이든 결국 전체 데이터를 로딩해야 하므로 메모리 사용량이 같다.
Reference
この問題について(JPAコレクションページ), 我々は、より多くの情報をここで見つけました https://velog.io/@cherish8513/JPA-컬렉션-페이징テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol