[Querydsl] 조인(join)
QueryDSL - Join: 다양한 Join 방식으로 데이터 연결하기
안녕하세요! 오늘은 QueryDSL에서 제공하는 join
에 대해 알아보겠습니다. 데이터베이스에서 여러 테이블 간에 관계가 형성되어 있을 때, 이를 활용하여 효과적으로 데이터를 가져오는 방법을 살펴보겠습니다. 다양한 Join 방식과 함께 예시 코드를 통해 실제 사용법을 익혀봅시다.
✅Inner Join
Inner Join은 두 테이블 간에 일치하는 데이터만을 가져옵니다.
예시 코드
1
2
3
4
5
6
List<Order> orders = new JPAQueryFactory(entityManager)
.selectFrom(order)
.innerJoin(order.customer, customer)
.fetch();
위 코드에서는 order
테이블과 customer
테이블을 Inner Join하여 관련된 주문 정보를 가져옵니다.
✅Left Join
Left Join은 왼쪽 테이블의 모든 데이터를 가져오고, 오른쪽 테이블과 일치하는 데이터가 있으면 함께 가져옵니다.
예시 코드
1
2
3
4
5
6
List<Order> orders = new JPAQueryFactory(entityManager)
.selectFrom(order)
.leftJoin(order.customer, customer)
.fetch();
위 코드에서는 order
테이블을 기준으로 Left Join하여 모든 주문 정보를 가져오고, 해당 주문과 연결된 고객 정보가 있다면 함께 가져옵니다.
✅Fetch Join
Fetch Join은 연관된 엔티티를 함께 로딩하여 N+1 문제를 해결하는 방식입니다.
예시 코드
1
2
3
4
5
6
List<Order> orders = new JPAQueryFactory(entityManager)
.selectFrom(order)
.innerJoin(order.customer, customer).fetchJoin()
.fetch();
위 코드에서는 order
테이블과 customer
테이블을 Inner Join하면서 Fetch Join을 적용하여 관련된 고객 정보를 함께 로딩합니다.
✅On 절 활용
on
절을 사용하여 Join 조건을 추가할 수 있습니다.
예시 코드
1
2
3
4
5
6
7
List<Order> orders = new JPAQueryFactory(entityManager)
.selectFrom(order)
.leftJoin(order.customer, customer)
.on(customer.grade.eq("VIP"))
.fetch();
위 코드에서는 customer
테이블과 VIP
등급을 가진 주문 정보만을 Left Join하여 가져옵니다.
📌주의사항과 팁
- Join을 사용할 때는 데이터베이스의 인덱스 등을 고려하여 성능을 최적화해야 합니다.
- Fetch Join은 N+1 문제를 해결하지만, 데이터 양이 많을 경우 부하를 일으킬 수 있으므로 주의가 필요합니다.
- Join 조건을 명확하게 설정하여 의도하지 않은 결과가 나오지 않도록 주의해야 합니다.
This post is licensed under CC BY 4.0 by the author.
Comments powered by Disqus.