작성
·
297
0
[질문 내용]
안녕하세요 강의 너무 잘 듣고 있습니다.
@BatchSize에 관해서 의문점이 생겨서 질문을 드리게 되었습니다.
@BatchSize를 사용하면 특정 Entity에서 조회 쿼리가 필요한 필드를 초기화 할 때, 1차 캐시로부터 같은 종류의 Entity id값을 @BatchSize에 지정한 size값만큼 가져와 IN에 넣어서 필요한 데이터를 함께 조회하고 초기화하는 것으로 이해했습니다.
근데, 이 때 단순히 1차 캐시에서 랜덤으로 id값을 가져와서 IN에 넣으면 원하지 않는 Entity에 초기화가 잘못 이뤄질 수 있지 않을까 하는 의문이 있었지만, 당연하게도 이런 부분에 대해서는 알아서 최적화를 해 둔 것 같았습니다.
예를 들면 JPQL의 결과로 조회된 Entity컬렉션 내부에서 하나를 집어 Entity 필드를 지연 로딩 초기화할 경우 같은 컬렉션 내부의 Entity들이 우선순위를 갖고 함께 초기화되는 것 같았습니다.
하지만 이것이 정확히 어떤 원리로 동작하는 지는 알 수가 없었습니다..ㅠㅠ
JPQL로 조회한 컬렉션에 대해서 따로 영속성 컨텍스트가 참조하고 있다거나 하는 식으로 동작하는 것일까요?
이런 원리를 모르다 보니 @BatchSize가 IN에 넣을 Entity를 결정하는 우선순위를 알 수가 없었습니다.
@BatchSize의 size값이 JPQL로 조회한 컬렉션의 size보다 클 때에는 1차 캐시에서 부족한 만큼의 Entity id를 더 끌어와서 IN에 추가하는데, 이 때 함께 초기화될 Entity가 어떤 Entity일 지 예측이 안 됩니다. 이런 것들도 우선순위가 따로 존재하나요?
크게 중요한 내용은 아닌 것 같은데, 그냥 같은 컬렉션에 있는 Entity들이 IN의 우선순위가 된다고 이해하고 사용하는 정도면 문제가 없을 지 궁금합니다..!
답변 1
0
안녕하세요. 공부용님, 공식 서포터즈 y2gcoder입니다.
정확한 원리나 작동 과정에 대해서는 알 수 없으나, 어떻게 작동하는지는 대략적으로 알 수 있는 링크들을 첨부하겠습니다. 답변에 있는 링크도 타고 들어가면 좀 더 도움이 될 것 같습니다!
https://www.inflearn.com/questions/592528
https://www.inflearn.com/questions/34469
감사합니다.
@BatchSize의 동작 알고리즘에 대해 잘 나와 있어서 도움이 되었습니다!
몰랐다면 나중에 쿼리가 size값을 준 것에 비해 많이 나갈 경우 의문을 가졌을텐데, 미리 방지할 수 있게되었습니다^^
BatchSize의 우선순위 관련해서는 영한님께서 올리신 hibernate사이트의 @BatchSize에 대한 부분을 읽어 보았는데, 따로 IN에 들어가는 entity와 관련해 작성된 내용은 없었던 것 같습니다.
크게 중요한 내용이 아닌 듯 하니 지금 이해한 수준으로 넘어가겠습니다 감사합니다!