JPA JOIN 시리즈 (4/5)

이전 편: [JPA] 3. LEFT OUTER JOIN

다음 편: [JPA] 5. JPA fetch join

RIGHT OUTER JOIN은 오른쪽 테이블의 모든 행을 결과에 포함시킨다. LEFT OUTER JOIN과 방향만 반대다. 왼쪽에 매칭되는 행이 없으면 왼쪽 컬럼은 NULL로 채운다.

시리즈 안내

- JOIN 유형 개요

- INNER JOIN

- LEFT OUTER JOIN

- RIGHT OUTER JOIN ← 현재 문서

- JPA fetch join

동작 원리

피드 목록을 조회하는데, 작성자(User)가 없는 피드도 포함시켜야 하는 상황이다.

SELECT u.*, f.*
FROM user u
RIGHT OUTER JOIN feed f ON u.id = f.author_id

feed 기준으로 전체를 보여준다. feed.author_id에 대응하는 User가 없으면 user 컬럼이 NULL로 채워진다.

다이어그램 추가 예정

여기에 RIGHT JOIN의 집합 관계(오른쪽 전체 + 교집합)를 보여주는 다이어그램 필요.

LEFT JOIN으로 대체 가능

RIGHT JOIN은 테이블 순서를 바꾸면 LEFT JOIN과 동일한 결과가 나온다.

-- RIGHT JOIN
SELECT u.*, f.*
FROM user u
RIGHT OUTER JOIN feed f ON u.id = f.author_id

-- 위와 동일한 결과
SELECT u.*, f.*
FROM feed f
LEFT OUTER JOIN user u ON f.author_id = u.id

테이블 순서를 feed를 왼쪽으로 바꾸고 LEFT JOIN을 쓰면 같다. 이 때문에 실무에서는 RIGHT JOIN을 거의 쓰지 않는다. LEFT JOIN으로 통일하면 쿼리를 읽을 때 기준 테이블이 항상 왼쪽이라 가독성이 좋다.

JPA에서의 RIGHT JOIN

JPQL도 RIGHT JOIN을 지원한다.

@Query("SELECT f FROM Feed f RIGHT JOIN f.author a")
List<Feed> findAllRightJoined();

하지만 위에서 설명한 이유로 실무에서는 테이블 순서를 바꾸고 LEFT JOIN으로 쓰는 게 일반적이다.

RIGHT JOIN보다 LEFT JOIN 권장

팀 코드에서 LEFT JOIN으로 통일하면 "왼쪽이 기준"이라는 일관된 읽기 방식이 만들어진다. RIGHT JOIN을 섞으면 기준 테이블을 파악하는 데 인지 비용이 올라간다.

자주 하는 실수

RIGHT JOIN과 LEFT JOIN을 혼용

같은 팀 코드에서 RIGHT JOIN과 LEFT JOIN을 섞어 쓰면 가독성이 떨어진다. 기준 테이블이 왼쪽인지 오른쪽인지 매번 확인해야 하기 때문이다. LEFT JOIN으로 통일하는 것이 관례다.