JPA JOIN 시리즈 (1/5)
다음 편: [JPA] 2. INNER JOIN
SQL에서 두 테이블을 연결하는 방법이 JOIN이다. JOIN의 유형에 따라 어떤 행이 결과에 포함되는지가 달라진다. JPA를 쓰더라도 결국 SQL이 실행되기 때문에, JOIN의 동작 원리를 이해해야 의도한 대로 데이터를 조회할 수 있다.
JOIN이란
두 테이블을 어떤 조건으로 연결해 하나의 결과로 만드는 연산이다. ON 절에 연결 조건을 지정하고, JOIN 유형에 따라 조건을 만족하지 않는 행을 포함할지 여부가 결정된다.
다이어그램 추가 예정
여기에 INNER JOIN, LEFT JOIN, RIGHT JOIN의 집합 관계(Venn Diagram)를 보여주는 다이어그램 필요.
유형별 비교
| 유형 | 포함되는 행 |
|---|---|
| INNER JOIN | 양쪽 테이블 모두에 매칭되는 행만 |
| LEFT OUTER JOIN | 왼쪽 테이블 전체 + 오른쪽 매칭 행 (없으면 NULL) |
| RIGHT OUTER JOIN | 오른쪽 테이블 전체 + 왼쪽 매칭 행 (없으면 NULL) |
| CROSS JOIN | 양쪽의 모든 행 조합 (조건 없음) |
기준이 되는 테이블 쪽의 행은 무조건 전부 포함된다는 게 OUTER JOIN의 핵심이다.
JPA에서의 JOIN
JPA는 JPQL로 JOIN을 표현한다. SQL과 차이점이 하나 있다.
SQL은 테이블명과 컬럼명으로 JOIN 조건을 작성하지만, JPQL은 엔티티의 필드명으로 작성한다.
-- SQL
SELECT f.*, u.*
FROM feed f
JOIN user u ON f.author_id = u.id
// JPQL — 테이블이 아니라 엔티티 필드로 JOIN
SELECT f FROM Feed f JOIN f.author
f.author는 Feed 엔티티의 author 필드를 가리킨다. JPA가 알아서 FK를 추적해 JOIN 조건을 만들어준다.
JPA JOIN의 두 가지 목적
JPA에서 JOIN은 목적에 따라 두 가지 방식으로 나뉜다.
- 일반 JOIN : 조건 필터링 목적. 연관 엔티티를 메모리에 올리지 않는다.
- fetch JOIN : 연관 엔티티를 함께 메모리에 올리는 목적. LAZY 로딩을 한 방에 해결한다.
자세한 내용은 05 JPA fetch join 참고.