본문 바로가기
Develop/Spring

[querydsl] queryDsl 기본 문법 정리 - 조인 ( inner join, theta join , on 절 사용, left outer join, right outer join, fetch join)

by 코딩의성지 2021. 7. 4.

오늘은 간단하게 querydsl 에서 여러가지 join을 사용하는 방법을 정리해보고자 한다.

 

1. join (inner join)

 

먼저 가장 일반적인 inner join은 아래와 같이 사용하면 된다.

주석의 내용은 참고만 하길 바란다.

List<Member> result = queryFactory
		.selectFrom(member)
		.join(member.team, team) // innerJoin 과 같음
		//.rightJoin(member.team, team) // right outer join		
        //.leftJoin(member.team, team) // left outer join
		.where(team.name.eq("a"))
		//.on(team.name.eq("a")) // 이것과 where 절은 결과가 같음.. inner join이라서
		.fetch();

 

2. theta Join

아예 연관관계가 없는 테이블 끼리 join이 가능하다.

예시로 만든건 회원 정보를 저장하는 member 테이블과 팀정보를 저장하는 team 테이블 에서 회원이름과 팀이름이 같은 경우 join을 하는 방법을 작성해 놓았다. 즉 이렇게 from 절에서 여러 엔티티를 선택하는 경우를 세타 조인이라고 한다.

 

(엄밀히 말해서 세타 조인을 정의해보면 조인(join) 연산은

카타시안 곱 (cartesian product) + 선택 연산 (select operation)

의 형태로 이루어 지는데 선택연산의 비교 연산자가 = , < , > 등이 사용되는 연산이 세타조인이다.

여기서 비교연산자가 = 이면 동등 조인 (equi join) 이라고 한다. )

 

세타 조인에서 left outer join이나 right outer join 같은 외부 조인은 불가능하다.

 

사용 예제는 아래를 참고하자.

 

List<Member> result = queryFactory
		.select(member)
		.from(member, team)
		.where(member.userName.eq(team.name))
		.fetch();

 
3. on 절

querydsl에서 on절은 JPA 2.1 이상부터 적용이 가능하다.

 

1) 필터링 기능

on절을 이용하여 조인 대상을 필터링하는 기능을 사용할 수 있다.

예시를 보면 팀이름이 "a" 인 팀만 조회하고 회원은 모두 조회하는 left outer join기능을 구현했다.

이렇게 하면 team 이름이 "a" 인 팀 정보는 표시가 되고 그외의 팀정보는 null 로 표시된 tuple 값들이 나올 것이다.

List<Tuple> result = queryFactory
		.select(member, team)
		.from(member)
		.leftJoin(member.team, team).on(team.name.eq("a"))
		.fetch();

 

 

2) 연관관계 없는 테이블끼리 외부 조인

아까전에 세타 조인에서는 외부조인이 불가능하다고 했다. 이럴 때 외부조인을 할 일이 있으면 on 절을 이용하면된다.

여기서 문법을 잘 봐야한다. 일반 조인에서는 id 값을 매핑시키기 때문에 연관관계 주인 객체에서 join하고자하는 객체를 꺼내서 매핑 시키는 방식이라면 on 절에서는 그냥 그 객체를 그대로 꺼낸다. 

흠 ... 조금 말이 어렵나..?

예제를 보면 좀 쉽게 이해 되실수도 있다.

List<Tuple> result = queryFactory
		.select(member, team)
		.from(member)
		//.leftJoin(member.team, team) // 기존에 leftJoin을 할때 member의 team을 꺼내서 함 , 이렇게하면 id 값으로 매칭
		.leftJoin(team).on(member.userName.eq(team.name)) // 이름으로만 매칭
		.fetch();

 

3. fetch join

페치 조인은 jpa 사용시 가장 기본적으로 사용하는 성능 최적화 방식이다. 연관된 엔티티나 컬렉션을 한번에 같이 조회해온다.

Member findMember = queryFactory
		.selectFrom(member)
		.join(member.team, team).fetchJoin()
		.where(member.userName.eq("kang"))
		.fetchOne();
반응형

댓글