본문 바로가기

jpa

JPA 쿼리 최적화 기록 프로젝트에서 진행했던 쿼리 최적화들을 기록해본다. 1. join fetch 활용 ex) 게시물 상세 조회 쿼리를 3번 → 2번으로 줄임 //변경 전 User user = userRepository.findById(userId).orElseThrow(UserNotFoundException::new); Board board = allBoardRepository.findBoard(boardId).orElseThrow(BoardNotFoundException::new); boardLikeRepository.save(BoardLike.builder().user(board.getUser()).board(board).build()).getId(); //변경 후 Board board = allBoardRepositor.. 더보기
JPA Paging 삽질 기록 JPA에서의 Fetch join 조건 - @~ToOne은 몇 개든 사용 가능 - @~ToMany는 1개만 사용 가능 +) Entity Graph의 경우도 이 조건 동일하게 적용됨. Paging에서는 👉 N+1 해결하겠다고 fetch join, entity graph 잘못 쓰면 MultipleBagFetchException 발생 - @~ToOne은 join fetch 사용 가능(QueryDSL의 경우) BUT, jpql은 페이징에서는 fetch join 아예 사용 불가능 (Entity Graph는 사용 가능) 👉 페이징 시 QueryDSL 사용 권장! - @~ToMany는 페치 조인 불가능 👉 N+1 해결 방법 : default_batch_fetch_size 적용 👉또는, QueryDSL으로 쿼리문 작성하.. 더보기
JPA N+1 문제 해결 * 본 내용은 인프런 JPA 기본 강의(김영한)를 정리한 내용을 포함하고 있습니다. * 지연 로딩 fetch = FetchType.LAZY 프록시로 조회해서 필요한 것만 쿼리문을 날림.(한꺼번에 자동으로 조인해서 데이터를 미리 가져오는 “즉시 로딩”과 반대 개념) 프록시의 메소드를 건드려서 실제로 “사용하는 시점”에 초기화가 되어 해당 쿼리문을 사용함 실무에서는 가급적 “지연 로딩”만 사용할 것. (즉시 로딩은 N+1 문제를 일으킴) @~ToOne은 디폴트가 즉시로딩. LAZY로 설정할 것 @~ToMany는 디폴트가 LAZY 모든 연관관계를 지연로딩으로 깔기. 그 후, 문제 발생 시 해결방법 : 페치 조인 (대부분의 경우 해결 가능) 엔티티 그래프 batch size N+1 해결 방법 ① : 페치 조인 .. 더보기