-
2021.06.15 기록장TIL 2021. 6. 15. 00:38
ToDo
- 책 읽기
- 미션 (수정 사항 고치기)
- 이력서 작성
Done
- 책 읽기
- 미션 (수정 사항 고치기)
- 이력서 작성
Weekly goal
- 책 읽기
- 블로그 읽기
Feeling
오늘은 검색 부분 리팩터링을 진행했다.
아직도 많이 부족하지만 영한님 강의를 슬쩍슬쩍 보면서 진행을 했다.
이슈를 검색할 때 1+1+1 쿼리가 나갔었다. 영한님 강의에서 본 3.1V에서는 이게 최종 결과물이지만
뭔가 한방 쿼리로 가지고 오고 싶어서 리팩터링을 진행했다.
쿼리 최적화
오늘 영한님 강의를 보다 알았다. 저렇게 findAllById 할 필요 없이 batch size만 늘려주면 알아서 in쿼리로 나간다고 한다.
일단 이전에는 저렇게 1+1+1 쿼리로 나갔다. isuue -> issue_label -> label
근데 한방 쿼리로 다 긁어오고 싶어서 전부 패치 조인으로 묶어버렸다.
컬렉션을 패치 조인하면 페이징이 안되고 데이터의 중복이 많아서 데이터가 정확하지 않을 수 있다고 하셨지만 그냥 해버렸다.
issue_label에서 별칭을 줘서 label을 타고 들어간다.
별치 부분에 관해 써야 하나 쓰지 말아야 하나 고민했는데 일관성이 깨지지 않는 한에서는 괜찮다고 하신다. + 조회용으로만
https://www.inflearn.com/questions/15876
fetch join 시 별칭관련 질문입니다 - 인프런 | 질문 & 답변
안녕하세요 영한님 기다리던 2편도 어제부터 너무 즐겁게 보고 있습니다 항상 좋은 강의 감사드립니다 테스트 코드 작성 중 2가지 질문이 있어 질문 드립니다 기본편 패치조인 한계편 초반에 보
www.inflearn.com
쿼리 dsl에서도 동일하게 전부 패치 조인을 했다.
일대다 페이징
위에서 본 컬렉션 패치 조인을 하게 되면 row가 곱으로 나오기에 db상에서 페이징을 할 수 없다. 그래서 메모리로 다 끌고 와서 메모리에서 페이징을 한다. 이렇게 되면 OOM이 날 수 있다. OOM이 안나도 하이버네이트에서 경고를 보낸다
그럼 컬렉션 패치 조인을 할 때 어떻게 페이징을 해야 하는가?
이 점은 의도치 않게 내가 한 맨 처음 버전과 기능이 동일하다.
일단 toOne 관계는 패치 조인을 하고 컬랙션은 lazy로딩으로 가지고 온다.
여기서는 페이징이 가능함으로 페이징을 여기서 하고
이제 컬랙션을 in쿼리로 하나하나 긁어오면 된다.
위처럼 findAllById도 있지만 jpa 스럽게 풀자면 batch size 늘리고 lazy 된 컬랙션에 접근을 해서 쿼리를 날리자.
'TIL' 카테고리의 다른 글
2021.06.17 기록장 (0) 2021.06.17 2021.06.16 기록장 (0) 2021.06.15 2021.06.14 기록장 (0) 2021.06.14 2021.06.13 기록장 (0) 2021.06.13 2021.06.12 기록장 (0) 2021.06.12