Develop/Spring

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

코딩의성지 2021. 7. 4. 19:56

오늘은 간단하게 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();
반응형