본문 바로가기

fetch join2

mybatis - ResultMap Collection을 통해 데이터 한번에 가져오기 프로젝트를 진행하던 중 member의 정보와 member가 작성한 article의 리스트, member가 속해 있는 group의 리스트를 가져와야 하는 기능을 구현해야 했다. member와 article와 group는 각각 테이블이고 member와 article는 일대다 관계, member와 group는 다대다 관계이며 중간에 member_group이라는 연결 테이블이 존재한다. member 정보 따로, article 리스트 따로, group 리스트 따로 구현하면 3번의 db접근이 일어난다. 그리고 설계를 잘못하면 N+1문제가 발생할 수 있다. 나는 이를 1번의 DB접근으로 표현하고 싶다. JPA에서는 fetch join 혹은 eager 한 방식으로 데이터를 가져오거나 배치사이즈를 조정하여 문제를 해결할.. 2023. 6. 18.
JPA 두번 이상의 left join fetch가 필요할 때 해결 방법(MultipleBagFetchException 문제 해결) 프로젝트를 진행하면서 두개 이상의 OneToMany 리스트를 가진 객체에 대한 정보를 가져올 때 N+1 문제에 걸리지 않으면서 각각의 리스트들을 가져올 필요가 있었다. 만약 하나의 OneToMany 리스트만을 같이 다룬다면 left join fetch 를 적용하여 해결할 수 있다. 하지만 문제는 두 개의 리스트라는 점이다. left join fetch는 두 번 이상 사용할 수 없다.(OneToOne는 가능하다) 이는 잘못하면 카티젼 곱과 같은 형식으로 데이터가 전달될 위험이 있기 때문에 서버는 미리 MultipleBagFetchException 를 띄우며 에러처리를 한다. 그렇다면 이러한 상황에서 어떻게 해야할까? 이는 한번의 select – from where a=b절을 select – from whe.. 2021. 8. 23.