Topic (오늘의 주제)
SQL의 기초: Inner Join과 Outer Join의 차이
Why (왜 사용하는가? 왜 중요한가?)
- 실무: RDB(관계형 데이터베이스)는 데이터를 여러 테이블에 쪼개서 저장(정규화)하므로, 이를 다시 합쳐서 조회하기 위해 JOIN은 숨 쉬듯이 사용됩니다. 잘못 쓰면 데이터가 누락되거나(Inner), 불필요한 NULL이 생기거나(Outer) 성능 이슈가 발생합니다.
- 구조적 의미: 집합 이론에서 **교집합(Intersection)**이냐 부분 합집합이냐의 차이입니다.
- 면접 의도: "A테이블에는 있고 B테이블에는 없을 때 데이터가 나오나요?"라는 질문에 정확히 답할 수 있는지, Left/Right Outer Join의 기준을 아는지 확인합니다.
Core Concept (핵심 개념 정리)
| 요소 | Inner Join (내부 조인) | Outer Join (외부 조인) |
| 개념 정의 | 두 테이블에서 조건이 일치하는 데이터만 조회. (교집합) | 조건이 일치하지 않아도, 기준 테이블의 데이터는 무조건 조회. (나머지는 NULL 채움) |
| 종류 | INNER JOIN | LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN |
| 동작 방식 | A와 B에 모두 존재하는 키 값만 결과로 나옴. 하나라도 없으면 결과에서 탈락. |
Left Join 예시: A(왼쪽)는 다 보여줌. B(오른쪽)에 매칭되는 게 없으면 B 컬럼은 NULL로 채워서 보여줌. |
| 상황 예시 | "주문을 한 적이 있는 회원만 뽑아라" (주문 없는 회원은 제외) | "모든 회원을 뽑되, 주문 내역이 있으면 같이 보여줘라" (주문 없어도 회원은 나옴) |
| 성능 | 일반적으로 처리할 데이터 양이 적어 더 빠름. | 처리 데이터가 많고 NULL 처리가 필요해 상대적으로 느릴 수 있음. |
Interview Answer Version (면접 답변식 요약)
"가장 큰 차이는 교집합이냐 아니냐입니다.
Inner Join은 두 테이블 간에 조인 조건이 일치하는 데이터만 가져오는 방식입니다.
반면 Outer Join은 매칭되는 데이터가 없더라도 기준이 되는 테이블(Left or Right)의 데이터는 모두 조회하고, 매칭되지 않는 빈 칸은 NULL로 채워서 가져오는 방식입니다.
데이터 누락 없이 전체 기준 데이터를 봐야 할 때는 Outer Join을 사용합니다."
Practical Tip (사용시 주의할 점 or 활용 예)
1. Left Join 시 순서 주의
- A LEFT JOIN B와 B LEFT JOIN A는 결과가 완전히 다릅니다. "누가 기준(주인)인가?"를 항상 생각해야 합니다.
- 보통 "데이터가 존재하는 쪽" 또는 "전체 목록을 보고 싶은 쪽"을 왼쪽에 둡니다. (예: 회원 목록을 다 보고 싶으면 Member가 왼쪽)
2. JPA에서의 사용 (Fetch Join)
- JPA에서 성능 최적화를 위해 사용하는 Fetch Join은 기본적으로 Inner Join으로 동작합니다.
- 만약 연관된 데이터가 없을 수도 있는 상황(예: 게시글에 댓글이 0개)에서 Fetch Join을 쓰면, Inner Join 특성상 게시글(기준 데이터)까지 아예 조회되지 않는 참사가 벌어집니다.
- 이때는 left join fetch를 명시적으로 써야 합니다.
3. NULL 처리 (Coalesce)
- Outer Join을 쓰면 필연적으로 NULL 값이 결과에 포함됩니다.
- SQL에서는 IFNULL이나 COALESCE 함수를, 애플리케이션에서는 Optional 등을 사용해 NULL 처리를 확실하게 해야 NullPointerException을 막을 수 있습니다.
예상 꼬리질문 정리
- Q: ON 절과 WHERE 절의 차이는 무엇인가요? (Outer Join 시)
- 핵심 키워드: Outer Join에서 ON 절에 조건을 걸면 조인하기 전에 필터링(조인 대상 결정)하지만, WHERE 절에 걸면 조인 결과를 다 만든 후에 필터링합니다. 결과가 달라질 수 있습니다.
- Q: Cross Join(Cartesian Product)은 무엇인가요?
- 핵심 키워드: 조인 조건 없이 두 테이블의 모든 경우의 수를 다 조합하는 것(A행 개수 × B행 개수). 성능 폭망의 주범.
- Q: Full Outer Join은 MySQL에 없는데 어떻게 구현하나요?
- 핵심 키워드: LEFT JOIN 결과와 RIGHT JOIN 결과를 UNION(합집합) 해서 구현합니다.
'Archive > Daily Dev Q&A' 카테고리의 다른 글
| Daily Dev Q&A: 3-Way Handshake (1) | 2026.01.20 |
|---|---|
| Daily Dev Q&A: TCP vs UDP (0) | 2026.01.20 |
| Daily Dev Q&A: ApplicationContext (0) | 2026.01.19 |
| Daily Dev Q&A: DNS (0) | 2026.01.14 |
| Daily Dev Q&A: N+1 문제 & 해결책 (0) | 2026.01.13 |