본문 바로가기
물음표

JPA) 두꺼운 쿼리 하나 VS 가벼운 쿼리 4개

by 킹차니 2021. 11. 22.

 

 

 

Product는 id, name 등등이 있고, 

Seller와는 ManyToOne 관계 ( 한명의 Seller가 여러개의 제품을 구매할 수 있으므로)

Category와는 ManyToOne 관계 ( 하나의 카테고리가 여러개의 제품에 적용될 수 있으므로)

Image와는 OneToMany 관계 ( 하나의 Product는 여러개의 이미지를 가지고 있으므로)

 

위와 같은 연관관계들을 가지고 있다.

product 엔티티

하여 product하나를 가져오기 위해 3개의 연관관계를 끌어와야 하는데 만약 제일 간단한 방법으로 가쟈온다면 

쿼리를 날리는 리퍼지토리는 아래와 같다.

하지만 이렇게 가져온다면 연관관계를 가진 엔티티들은 바이트 버디로 프록시 객체들이기 때문에 얘네들은 ProductDto를 만들 때 터치를 해서 강제로 쿼리를 또 날려야 한다.

하여 product select 외에 총 3번의 쿼리가 더 날라가는 N+1문제가 발생한다. 

product select

 

seller select

 

category select

 

image select

 

 

하여 이 문제를 해결하기 위해 이전에 학습한 것들을 봤더니 fetch join을 사용하였다. 그래서 fetch 조인을 사용하려 했는데, 이전에 학습한 것들은 하나의 product가 아닌 List로 2개 이상의 product들을 가져오는 쿼리였고 내 상황과는 달랐다. 

이전에 학습한 것.

 

하여 나는 아래와 같이 했다.

이렇게 수정했더니 쿼리는 한번만 나갔다.

아주아주 뚱뚱한 하나의 쿼리.....

 

내가 걱정되는 건 일단 조인을 먼저하고 나중에 product_id가 1인 것을 찾는 것이라면, DBMS 안에서 너무 버거워 오히려 늦어지지 않을까? 하는 것이다. 즉 가벼운 4개의 쿼리보다 과연 이게 더 빠를까?????

 

 

하여 본인은 JPA를 인프런에서 강의하시는 김영한 님의 JPA강의를 보고 학습한 터라 질문을 해보았고, 답변은 아래와 같으셨다.