
1. 스파게티 코드의 구원자: 인라인 뷰란 무엇인가?
10화에서 우리는 쿼리 내부에 또 다른 조회를 중첩하여 다단계 비즈니스 로직을 구현하는 서브쿼리(Subquery)의 개념과 메인 쿼리에서 서브쿼리가 위치하는 절(SELECT절, FROM절, WHERE 절)에 따른 문법 규칙을 살펴보았습니다.
현업에서 연차가 쌓이고 복잡한 데이터 마트 구조를 다루기 시작하면, 한 화면에 담기지도 않을 정도로 길고 복잡하게 꼬인 이른바 ‘스파게티 쿼리’를 마주하거나 직접 작성해야 하는 순간이 필연적으로 찾아옵니다. 여러 테이블의 조인과 다단계 필터링, 그리고 복잡한 집계 연산이 한 문장 안에 뒤섞여 있으면 작성한 본인조차도 몇 주 뒤에 코드를 해독하기 어려워지는 문제가 발생하곤 합니다.
이처럼 거대하고 복잡한 질의를 책의 목차처럼 일목요연하게 모듈화하고, 단계별로 로직을 분리하여 가독성을 극대화해 주는 해결사가 바로 ‘인라인 뷰(Inline View)’입니다. 인라인 뷰는 서브쿼리의 한 종류로서, 메인 쿼리의 FROM 절 내부에 위치하는 서브쿼리를 의미합니다.
데이터베이스 내에 물리적으로 저장되는 일반 테이블과 달리, 인라인 뷰는 쿼리 실행과정에서만 유효한 논리적 결과 집합(가상 테이블) 역할을 수행합니다. 본 연작 시리즈는 대용량 처리에 활용되는 테라데이터 SQL 환경을 기준으로 인라인 뷰의 문법 구조와 리팩토링 전략을 설명하겠습니다.
2. 인라인 뷰의 기본 문법 구조와 필수 규칙
인라인 뷰는 FROM 절 안에서 괄호 ()로 감싸진 형태로 선언되며, 괄호 밖에는 마치 일반 테이블처럼 취급할 수 있도록 반드시 별칭(Alias)을 지정해야 합니다.
-- 인라인 뷰의 가장 표준적인 문법 구조
SELECT
A.DEPT_CD
, A.AVG_AMT
FROM
(
-- [인라인 뷰] 가상의 테이블 역할을 하는 내부 서브쿼리
SELECT
DEPT_CD
, AVG(SALARY_AMT) AS AVG_AMT
FROM
DW_MART.EMPLOYEE_BASE
GROUP BY
DEPT_CD
) A -- 내부 가상 테이블에 'A'라는 명확한 별칭을 부여
WHERE
A.AVG_AMT >= 5000000;
⚠️ 인라인 뷰 작성 시 절대로 누락하면 안 되는 2가지 문법 체크포인트
- 독자적인 테이블 별칭(Alias) 부여: 인라인 뷰를 닫는 괄호 뒤에
A나V_TAB같은 별칭을 지정하지 않으면, 데이터베이스 엔진은 구문 오류(Syntax Error)를 일으키며 쿼리 실행을 중단합니다. 메인 쿼리가 내부의 가상 테이블을 인식하기 위한 이정표가 필요하기 때문입니다. - 내부 칼럼의 명확한 네이밍(Naming): 인라인 뷰 내부에서
AVG(SALARY_AMT)와 같은 집계 함수나SALARY_AMT * 0.1같은 연산식을 사용할 경우, 반드시 별칭을 지정해 주어야 합니다. 이름을 지정하지 않으면 메인 쿼리의SELECT절이나WHERE절에서 해당 가상 칼럼을 참조할 수 없습니다.
3. 현업 비즈니스 사례로 보는 복잡한 쿼리의 리팩토링 전략
인라인 뷰가 실무 비즈니스 데이터 가공 과정에서 가독성과 정확성을 어떻게 끌어올리는지, 실제 유통 기업이나 이커머스 매출 분석 부서에서 자주 발생하는 가상의 시나리오를 통해 짚어보겠습니다.
📊 [실무 사례 예시: 영업 팀 강 과장의 매장별 실적 대비 분석]
유통 대기업의 매출 분석 담당자인 강 과장은 기획 부서로부터 다음과 같은 다단계 데이터 추출 요청을 받았습니다.
- 요청 내용: “7월 한 달간 발생한 오프라인 매장별 거래 데이터에서 **’매장별 총 매출액’**을 먼저 구한 뒤, 그 결과 테이블을 별도의 매장 마스터 테이블과 결합하여 매장명, 점장 ID, 그리고 해당 매장의 총 매출액 리포트를 도출해 주세요.”
이 문제를 해결하기 위해 강 과장은 조인(Join) 연산과 그룹화(GROUP BY) 연산이 한데 뒤섞인 스파게티 코드를 짜는 대신, 인라인 뷰를 활용해 ‘매출액 집계 단계’와 ‘마스터 테이블 결합 단계’를 분리하는 리팩토링 전략을 선택했습니다.
-- [올바른 예시] 인라인 뷰를 활용해 집계와 조인 단계를 명확히 분리한 리팩토링 쿼리
SELECT
M.SHOP_ID
, M.SHOP_NM
, M.MANAGER_ID
, S.TOTAL_SALES_AMT -- 인라인 뷰가 생성해낸 가상 칼럼을 매칭
FROM
DW_MART.SHOP_MASTER M -- [1] 기준 매장 마스터 테이블
INNER JOIN
(
-- [2] 인라인 뷰: 매장별 매출액을 미리 계산하여 가상 테이블로 모듈화
SELECT
SHOP_ID
, SUM(SALE_AMT) AS TOTAL_SALES_AMT
FROM
DW_MART.DAILY_OFFLINE_SALES
WHERE
SALE_DT BETWEEN '2026-07-01' AND '2026-07-31'
GROUP BY
SHOP_ID
) S -- 가상 테이블 별칭 'S' 정의
ON
M.SHOP_ID = S.SHOP_ID -- 마스터와 가상 테이블 간의 연결고리 지정
ORDER BY
S.TOTAL_SALES_AMT DESC;
💡 리팩토링된 쿼리의 비즈니스적 이점 분석
위와 같이 인라인 뷰를 활용해 코드를 구조화하면 다음과 같은 실무적 이점이 발생하는 것으로 평가받습니다.
- 가독성의 획기적 향상: 코드를 읽는 동료나 미래의 자기가 쿼리를 볼 때, 괄호 안의 내용물만 따로 떼어내어 “아, 여기서는 7월 매장별 매출 합계를 구하는구나”라고 직관적으로 파악할 수 있어 로직 분석이 매우 수월해집니다.
- 8화에서 언급한 ‘데이터 뻥튀기’ 방지: 수백만 건의 상세 거래 내역이 존재하는 상태에서 마스터 테이블과 무턱대고 조인하면 중복 행이 생길 리스크가 큽니다. 하지만 인라인 뷰 내부에서
GROUP BY SHOP_ID를 통해 데이터를 매장당 1행으로 집계한 상태에서 마스터와 일대일(1:1)로 결합하기 때문에 계산 오류가 날 확률을 원천 차단해 줍니다.
4. 팩트 체크 및 데이터 분석가의 관점 점검
기술적 정확성을 확보하기 위해, 실무에서 인라인 뷰를 다룰 때 초보 분석가들이 흔히 가질 수 있는 오해들을 명확히 점검해 보겠습니다.
- 인라인 뷰를 많이 쓰면 시스템 연산 속도가 무조건 느려지는가?
- 팩트 체크: 대용량 데이터웨어하우스(DW) 환경인 테라데이터의 지능형 옵티마이저(Optimizer)는 사용자가 인라인 뷰 구조로 쿼리를 작성하더라도 이를 텍스트 그대로 기계적으로 실행하지 않는 경향이 있습니다. 내부적으로 뷰의 경계를 허물어 전체 조건을 통합하거나, 더 효율적인 인덱스 검색 경로를 찾아 실행 계획을 스스로 최적화(Merge/Fold)하는 능력이 탁월한 것으로 알려져 있습니다. 따라서 “인라인 뷰는 속도가 느리다”는 주장은 일방적인 오해에 가까우며, 오히려 로직을 깔끔하게 정리하여 불필요한 행의 조인을 막아주기 때문에 경우에 따라서는 성능 최적화에도 도움이 될 수 있습니다.
- 인라인 뷰 내부에 또 다른 인라인 뷰를 중첩해서 넣을 수 있는가?
- 팩트 체크: 문법적으로 뷰 내부에 또 다른 뷰를 다단계로 중첩하여 작성하는 것은 완전히 가능합니다. 그러나 가독성을 높이기 위해 도입한 인라인 뷰의 깊이(Depth)가 3단계, 4단계 이상으로 지나치게 깊어지면, 오히려 전체 쿼리 구조를 한눈에 파악하기 힘들어지는 역효과를 낳게 됩니다. 복잡도가 임계치를 넘어설 경우에는 인라인 뷰 대신 차후 연재될 임시 테이블(Volatile Table) 기법이나 표준 ANSI 문법인
WITH절(CTE) 구조로 전환하여 코드를 평탄화하는 접근이 실무 관점에서 현명할 수 있습니다.
- 팩트 체크: 문법적으로 뷰 내부에 또 다른 뷰를 다단계로 중첩하여 작성하는 것은 완전히 가능합니다. 그러나 가독성을 높이기 위해 도입한 인라인 뷰의 깊이(Depth)가 3단계, 4단계 이상으로 지나치게 깊어지면, 오히려 전체 쿼리 구조를 한눈에 파악하기 힘들어지는 역효과를 낳게 됩니다. 복잡도가 임계치를 넘어설 경우에는 인라인 뷰 대신 차후 연재될 임시 테이블(Volatile Table) 기법이나 표준 ANSI 문법인
5. 11화 요약 및 실무 쿼리 구조화 체크리스트
쿼리를 최종 빌드하여 운영 환경에 상정하기 전, 가독성과 데이터 무결성의 결점이 없는지 스스로 진단할 수 있는 요약 가이드를 제공합니다.
| 체크포인트 | 발생 가능한 실무 에러 및 리스크 | 현직 분석가의 권장 대안 및 조치 |
| 인라인 뷰 우측 괄호 뒤 별칭 누락 | “Syntax Error” 발생하며 쿼리 자체 중단 | 괄호 뒤에 한 칸 띄우고 A, S 등 명확한 가상 테이블 명칭 기재 |
| 내부 함수 연산 결과의 별칭 누락 | 메인 쿼리에서 가상 칼럼을 호출할 수 없어 바깥쪽 연산 실패 | 연산 결과에 명확한 칼럼 별칭 부여 |
| 조인 전 행수의 고유성(Uniqueness) | 조인 대상 데이터 모수가 복사되어 최종 합계 왜곡 | 뷰 내부에서 GROUP BY나 필터링을 완벽히 끝내 고유한 상태로 압축 후 결합 |
6. 결론 및 다음 화 예고
이번 11화에서는 FROM 절 내부에서 독립적인 임시 테이블처럼 작동하며 복잡한 비즈니스 로직을 단계별로 깔끔하게 쪼개어 가독성을 극대화해 주는 인라인 뷰(Inline View)의 필수 문법 규칙과 비즈니스 리팩토링 전략을 다각도로 점검해 보았습니다. 거대하게 꼬인 수백 줄짜리 코드를 유기적인 모듈 단위로 쪼개어 다루는 역량은 시니어 데이터 분석가로 도약하기 위한 가장 강력한 무기가 됩니다.
인라인 뷰나 서브쿼리가 데이터를 ‘안으로 중첩하여’ 결합하는 방식이라면, 성격이 유사한 데이터를 ‘위아래로 일렬로’ 결합해야 하는 비즈니스 상황도 실무에서 자주 발생합니다.
이어지는 12화에서는 두 개 이상의 데이터 집합을 세로 방향으로 길게 이어 붙여 하나의 결과 집합(Result Set)을 만들어 주는 집합 연산자인 UNION과 UNION ALL의 세계를 집중 분석합니다. 중복 데이터를 제거하는 연산 유무에 따라 두 명령어 간에 발생하는 속도 차이의 본질을 파악하고, 대용량 조회 환경에서 시스템 자원을 획기적으로 절약할 수 있는 현직자들의 집합 연산 선택 기준을 비즈니스 사례와 함께 상세히 파악해 보겠습니다.