소개
게시글
질문&답변
2021.03.27
batch size 와 Limit 질문입니다
안녕하세요! 답변 감사드립니다. 2 번에서 최근에 들어온 데이터들을 미리 캐싱하는 것처럼 사용하는 건 정말 좋은 아이디어 같습니다! 영한님 말씀을 듣고 1 번에 대해서 고민을 해보았는데 Fetch Join 에서는 Limit 가 적용 안되어서 Inner Join 과 Limit 을 함께 JPQL 로 작성했습니다. 혹시 다른 방법을 말씀하셨던 걸까요? @Repository public interface PostRepository extends JpaRepository { @Query(value = "SELECT p" + " FROM Post p" + " INNER JOIN Follow f" + " ON p.member.id = f.toMember.id" + " WHERE p.id findByJoinFollow(@Param("memberId") Long memberId, @Param("lastPostId") Long lastPostId, Pageable pageable); } @RequiredArgsConstructor @Service public class PostService { private final PostRepository postRepository; public List getFeeds(Long lastPostId) { PageRequest pageRequest = PageRequest.of(0, 5, Sort.by("id").descending()); return postRepository.findByJoinFollow(getCurrentMember().getId(), lastPostId, pageRequest); } } 최대한 간단하게 질문하려고 했었는데 오히려 질문의 목적을 파악할 수 없어 혼란만 드렸던 것 같네요 ㅠ 토이프로젝트로 진행 중인 건 인스타 클론 코딩이고 구현중인 API 는 인스타그램 처음 들어가면 나오는 첫 화면입니다. 인스타그램 첫 화면에서는 내가 팔로우 중인 모든 사람들의 게시글을 최신 순서대로 노출하기 때문에 자칫 잘못하면 많은 데이터를 가져오게 되어 최적화 하는 방법을 고민해보던 중이었습니다. 영한님이 말씀해주신 대로 Inner Join 을 사용하니 List 나 List 를 DB 에서 많이 끌어오지 않고 처리할 수 있는 것 같아요! 자꾸 질문 드리는데 친절하게 답변해주셔서 감사합니다.
- 0
- 4
- 804
질문&답변
2021.03.26
batch size 와 Limit 질문입니다
안녕하세요. 영한님 친절한 답변 감사합니다! 핵심은 DB 에서 너무 많은 양의 데이터를 한번에 끌어오지 않는 거군요. 추가적으로 두 가지만 더 질문드려도 될까요? 1. postRepository.findTop5ByMemberIn(members) 로 조회할 때 members 의 사이즈가 크다면 IN 쿼리 사이즈를 직접 나누어서 호출해야 하나요? 모든 Member 의 Post 를 조회하는 게 아니라 임의의 조건으로 필터링된 Member 리스트를 먼저 가져올 예정이라서 Fetch Join 사용이 불가능할 것 같습니다. 결국 members 를 대상으로 호출을 해야 하는데 MySQL 같은 경우는 IN 조건에 최대 1000 개 밖에 넣지 못한다고 알고 있습니다. 여기서는 Batch Size 적용이 안될 것 같은데 개발자가 임의로 사이즈를 조절해서 IN 쿼리를 나누어 호출해야 하는지 궁금합니다. 2. 말씀해주신 대로라면 Comment 를 뽑을 때도 쿼리를 직접 호출해야 할 것 같은데 BatchSize 적용이 안되어서 Post 갯수만큼 Comment 조회 쿼리가 날아갈 건 어쩔 수 없는 부분인가요? 제가 구현하려고 하는 건 Post 5 개에 대해서 호출하니 5 개의 Comment 조회 쿼리만 나갈테지만 커지면 커질수록 부담이 될 것 같습니다. Post 의 갯수가 한정되어 있으니 그 갯수만큼 쿼리가 발생하는 건 감수하고 가야하는 건가요?
- 0
- 4
- 804