JPA (5) 썸네일형 리스트형 [JPA] default_batch_fetch_size 동작 OneToMany 관계에서 N+1을 해결하기 위해 default_batch_fetch_size를 처음 접하게 되었습니다. 정리 글: https://lback.tistory.com/15 N+1 문제에 사용되는 원리는 위 글에 정리해두었지만, default_batch_fetch_size 자체의 동작에 대해 조금 더 살펴보겠습니다. 기본적인 동작 역시 위 글에 정리해두었지만, 의문이 들었던 점은 2가지 부분입니다. 1. default_batch_fetch_size가 적용되는 경우 먼저 default_batch_fetch_size가 적용되는 경우에 대해 명확히 알고 싶었습니다. 이에 대해서 찾아본 결과, 다음과 같은 설명을 찾을 수 있었습니다. 'N+1 문제를 해결하기 위해, 지연로딩 시 미리 batch 단위로.. [JPA] N+1 해결하기 (2) - OneToMany ※ 본 글은 김영한 님의 실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화 강의를 수강하고 작성한 글입니다. [JPA] N+1 해결하기 를 통해 N+1 문제를 해결하는 방법을 다뤘었는데, ~ToOne인 경우만 다뤘습니다. ~ToOne인 경우엔 fetch join을 통해 N+1 문제를 해결할 수 있지만, OneToMany 관계에서는 fetch join 만으로 해결할 수 없습니다. 위와 같이 엔티티가 관계를 맺고 있을 때, Team의 목록을 불러오는 코드를 통해 문제상황과 해결책을 살펴보겠습니다. 전체 코드는 깃허브에 공유해두었습니다! 1. Fetch join의 문제점 먼저 ToOne 관계에서 했던 것처럼, fetch join을 한번 사용해보겠습니다. public List getTeams_v.. [JPA] 동적쿼리, QueryDSL JPA, QueyrDSL을 통해 동적쿼리를 다루는 방법에 대해 살펴보겠습니다. 전체 소스코드는 아래에서 확인하실 수 있습니다. (https://github.com/LimYooyeol/blog/tree/main/dynamic-query) 1. 동적쿼리가 필요한 상황 이번에도 간단하게 Member와 Team을 활용해서 문제 상황을 재현해보겠습니다. @Entity @Getter @Setter @ToString public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private Long number; @ManyToOne(fetch = FetchType.LAZY.. [JPA] N+1 문제 해결하기 JPA를 사용하면 한번쯤 겪게 되는 N+1 문제와 해결방법에 대해 정리해보겠습니다. 1. N+1 문제란? 하나의 쿼리로 데이터 N개의 목록을 가져오려고 할 때, 각 데이터 별로 연관된 데이터를 조회하는 쿼리가 발생하여, 총 N개의 쿼리가 추가로 발생하는 문제를 N+1 문제라고 합니다. 한 회원이 여러 게시물을 작성할 수 있다고 가정하고, Board 에서만 N:1 단방향으로 회원을 참조하도록 설계해보겠습니다. 이제 BoardRepository와 MemberRepository를 작성해보겠습니다. 간단하게 삽입과 조회 기능만 추가해두겠습니다. 다음으로 회원과 게시물 데이터를 넣고, 게시물의 목록을 조회하는 findAllByViewDesc를 이용해 게시물 목록을 조회수 내림차순으로 조회해보겠습니다. 테스트 코드.. [JPA] 즉시로딩, 지연로딩 JPA의 즉시 로딩과 지연 로딩에 대해 정리해보겠습니다. 1. 도메인 설계 연관 관계를 설명할 때 가장 자주 쓰이는 예시인 Team, Member 도메인을 이용하겠습니다. 둘 다 id와 name만 갖도록 간단하게 설계했고, Member에서만 N:1 단방향으로 Team을 참조하계 설계했습니다. 2. 즉시로딩 FetchType.EAGER, 즉시로딩으로 설장하고, 팀과 회원을 하나씩 저장한 후, 회원만 조회했을 때 어떻게 조회되는지 확인해보겠습니다. 테스트 코드는 다음과 같습니다. 팀1과 팀1에 속하는 회원1을 저장하고, 영속성 컨텍스트를 한번 비워줍니다. 이후 회원을 조회하고, 회원의 팀의 이름을 출력해보았습니다. 이때 생성된 쿼리를 확인해보겠습니다. 회원을 조회하는 시점에서 left join을 이용하여 팀.. 이전 1 다음