데이터 분석 자동화의 새로운 패러다임: SQL RAG 에이전트로 리포트 작성 시간 90% 줄이기
매주 반복되는 데이터 추출과 리포트 작성 업무에 지치셨나요? SQL RAG 에이전트를 활용하면 데이터베이스에 새 데이터만 업로드하면 AI가 자동으로 쿼리를 작성하고, 분석하고, 리포트까지 생성해줍니다. 이 글에서는 일반 RAG와 SQL RAG의 차이부터 실제 구축 방법까지 초보자도 따라할 수 있게 상세히 설명합니다.
매주 월요일의 악몽: 반복되는 데이터 리포트 작업

당신은 지금 이런 상황에 놓여 있지 않나요?
- 매주 월요일 아침, 지난주 매출 데이터를 엑셀에서 추출
- 피벗 테이블로 이리저리 돌려가며 숫자 계산
- 구글 문서에 정리해서 상사와 팀원에게 이메일 발송
- 다음 주 월요일이 되면 똑같은 작업 반복
한두 번은 괜찮습니다. 하지만 이 작업이 매주, 매달 반복된다면? 시간 낭비라는 생각이 들 수밖에 없습니다.
최근에는 ChatGPT나 Claude 같은 AI 도구로 데이터를 분석하는 분들도 늘어났습니다. 하지만 여전히 데이터를 복사해서 붙여넣고, 결과를 다시 복사해서 문서에 옮기고, 이메일로 수동 발송하는 과정은 피할 수 없었죠.
오늘 소개할 SQL RAG(Retrieval-Augmented Generation) 에이전트는 이 모든 과정을 자동화합니다. 데이터베이스에 새 데이터만 업데이트하면, AI가 알아서 SQL 쿼리를 작성하고, 데이터를 분석하고, 리포트를 생성해서 이메일까지 보내줍니다.
일반 RAG vs SQL RAG: 왜 숫자 분석엔 SQL RAG가 필수인가?

일반 RAG의 작동 원리 (문서 기반)
일반적인 RAG 시스템은 비정형 텍스트 데이터를 다룹니다. 마치 도서관 사서가 책을 정리하듯이 작동하죠.
작동 과정:
- 문서를 작은 조각(청크)으로 분할
- 각 조각을 숫자 벡터로 변환(임베딩)
- 벡터 데이터베이스에 저장
- 질문이 들어오면 질문도 벡터로 변환
- 유사도가 높은 문서 조각을 찾아서 AI에게 제공
- AI가 해당 문서를 참고해서 답변 생성
예시: "우리 회사의 환불 정책이 뭐야?"라고 물으면, 저장된 정책 문서에서 관련 부분을 찾아서 답변합니다.
한계: 숫자 계산이 필요한 질문에는 부정확합니다. "지난주 매출이 얼마야?"라고 물으면 문서에서 비슷한 내용을 찾으려 하지만, 실시간 계산은 불가능합니다.
SQL RAG의 작동 원리 (정형 데이터 기반)
SQL RAG는 정형 데이터(엑셀, CSV, 데이터베이스)를 다룹니다. 마치 은행 창구 직원이 장부를 조회하듯이 작동합니다.
작동 과정:
- 정형 데이터를 행과 열 그대로 데이터베이스에 저장 (벡터 변환 없음)
- 질문이 들어오면 AI가 SQL 쿼리를 자동 생성
- 생성된 쿼리로 데이터베이스에서 정확한 값 추출
- 추출된 데이터를 바탕으로 답변 생성
예시: "지난주 매출이 얼마야?"라고 물으면:
SELECT SUM(sales_amount)
FROM sales_data
WHERE date BETWEEN '2024-01-08' AND '2024-01-14';
이런 쿼리를 AI가 자동으로 만들어서 정확한 숫자를 계산합니다.
비교표: 어떤 상황에 무엇을 써야 할까?
| 구분 | 일반 RAG | SQL RAG |
|---|---|---|
| **데이터 형태** | 문서, 텍스트, PDF | 엑셀, CSV, 데이터베이스 |
| **주요 용도** | 정책 문의, 매뉴얼 검색 | 매출 분석, 재고 조회, 통계 계산 |
| **정확도** | 맥락 파악은 우수하나 숫자는 부정확 | 숫자 계산은 100% 정확 |
| **적합한 질문** | "환불 절차가 어떻게 돼?" | "이번 달 베스트셀러 TOP 5는?" |
| **처리 방식** | 유사도 검색 | SQL 쿼리 실행 |
핵심: 매출, 재고, 고객 데이터처럼 숫자가 중요한 비즈니스 데이터를 다룬다면 SQL RAG가 필수입니다.
실전 구축: 자동 주간 매출 리포트 시스템 만들기

이제 실제로 SQL RAG 에이전트를 구축해보겠습니다. 우리가 만들 시스템의 흐름은 다음과 같습니다.
시스템 아키텍처 개요
[구글 드라이브에 엑셀 업로드]
↓
[자동 감지 및 데이터 추출]
↓
[Supabase 데이터베이스에 저장]
↓
[AI가 SQL 쿼리 자동 생성]
↓
[데이터 분석 및 리포트 작성]
↓
[이메일 자동 발송]
1단계: 데이터베이스 구축 (Supabase 활용)
Supabase란? Firebase의 오픈소스 대안으로, PostgreSQL 기반의 무료 데이터베이스 서비스입니다. 복잡한 서버 설정 없이 클릭 몇 번으로 데이터베이스를 만들 수 있습니다.
프로젝트 생성
- supabase.com 접속 후 로그인
- "New Project" 클릭
- 프로젝트명: "SQL_RAG_Report"
- 데이터베이스 비밀번호 설정 (안전한 곳에 저장!)
- 리전: Seoul 선택 (속도 최적화)
테이블 설계
우리는 두 개의 테이블이 필요합니다.
테이블 1: document_info (문서 메타데이터)
- 목적: 업로드된 파일의 기본 정보 저장
- 컬럼:
-
id: 파일 고유 ID-
title: 파일명 (예: "2024년 4월 매출")-
url: 파일 접근 링크-
schema: 컬럼명 목록 (예: ["날짜", "제품명", "매출액", "수량"])-
created_at: 업로드 시각왜 schema를 따로 저장하나요? AI가 SQL 쿼리를 작성할 때 "어떤 컬럼이 있는지" 알아야 합니다. 예를 들어 "매출액을 조회해줘"라고 하면 AI는 schema를 보고 sales_amount 컬럼을 사용해야 한다는 걸 알 수 있습니다.
테이블 2: document_table (실제 데이터)
- 목적: 엑셀의 각 행 데이터 저장
- 컬럼:
-
id: 행 고유 ID (자동 증가)-
document_id: 어떤 파일의 데이터인지 (document_info와 연결)-
row_data: 행의 모든 데이터를 JSON 형태로 저장왜 row_data를 JSON으로 저장하나요? 파일마다 컬럼 구조가 다를 수 있습니다. 4월 데이터는 5개 컬럼, 5월 데이터는 7개 컬럼일 수 있죠. JSON 형태로 저장하면 유연하게 대응할 수 있고, PostgreSQL의 강력한 JSON 쿼리 기능을 활용할 수 있습니다.
SQL 쿼리로 테이블 생성
Supabase의 "SQL Editor"에서 다음 쿼리를 실행합니다.
-- 문서 정보 테이블
CREATE TABLE document_info (
id TEXT PRIMARY KEY,
title TEXT NOT NULL,
url TEXT,
schema TEXT[],
created_at TIMESTAMP DEFAULT NOW()
);
-- 문서 데이터 테이블
CREATE TABLE document_table (
id SERIAL PRIMARY KEY,
document_id TEXT REFERENCES document_info(id),
row_data JSONB NOT NULL
);
JSONB란? JSON의 이진 버전으로, 검색과 인덱싱이 빠릅니다. 일반 JSON보다 저장 공간은 조금 더 쓰지만, 쿼리 성능이 훨씬 좋습니다.
2단계: 자동 데이터 수집 워크플로우 구축 (N8N 활용)
N8N이란? Zapier나 Make.com처럼 작업을 자동화하는 도구인데, 오픈소스라서 무료로 자체 서버에 설치할 수 있습니다. 노코드 방식으로 드래그 앤 드롭만으로 자동화 워크플로우를 만들 수 있습니다.
워크플로우 설계 개요
구글 드라이브 감지 → 파일 다운로드 → 데이터 추출 → 중복 제거 → DB 저장 → 스키마 업데이트
구체적인 구현 단계
STEP 1: 파일 업로드 감지
- 노드: Google Drive Trigger (2개)
- 설정:
- 트리거 1: 파일 생성 시 (File Created)
- 트리거 2: 파일 업데이트 시 (File Updated)
- 감시 폴더: "SQL_RAG" (미리 생성)
왜 두 개의 트리거가 필요한가요? 새 파일을 업로드할 때와 기존 파일을 수정할 때 모두 감지해야 최신 데이터를 유지할 수 있습니다.
STEP 2: 여러 파일 동시 처리
- 노드: Loop Over Items
- 목적: 한 번에 여러 파일이 업로드되어도 하나씩 순차 처리
- 배치 크기: 1 (파일 하나씩 처리)
실제 상황 예시: 월요일 아침에 4월, 5월, 6월 매출 데이터 3개를 한꺼번에 업로드했다면, 루프가 3번 돌면서 각 파일을 처리합니다.
STEP 3: 파일 정보 추출
- 노드: Edit Fields ("Set Document Info")
- 추출 데이터:
- 파일 ID: 고유 식별자
- 파일 타입: 엑셀인지 구글 시트인지 구분
- 파일명: 리포트에 표시할 제목
- URL: 원본 파일 링크
STEP 4: 중복 데이터 방지
같은 파일을 다시 업로드하면 어떻게 될까요? 중복 데이터가 쌓이면 분석 결과가 왜곡됩니다. 따라서 새 데이터를 추가하기 전에 기존 데이터를 먼저 삭제해야 합니다.
- 노드: Supabase Delete (2개)
- 삭제 순서:
1. document_table에서 해당 파일의 모든 행 삭제
2. document_info에서 파일 정보 삭제
왜 이 순서인가요? document_table이 document_info를 참조하고 있기 때문에(외래 키), 자식 데이터를 먼저 삭제해야 오류가 발생하지 않습니다.
STEP 5: 파일 다운로드 및 변환
- 노드: Google Drive Download File
- 중요 설정: Google File Conversion 활성화
- 구글 시트 → CSV 변환
- 엑셀 파일 → 그대로 유지
왜 CSV로 변환하나요? CSV는 가장 단순한 텍스트 형식이라 파싱(데이터 추출)이 빠르고 오류가 적습니다.
STEP 6: 파일 타입별 분기 처리
- 노드: Switch
- 조건:
- 엑셀 파일 (.xlsx) → Extract from Excel 노드로
- 구글 시트 (.gsheet) → Extract from CSV 노드로
STEP 7: 데이터 추출
- 노드: Extract from File
- 결과: 500개 행이 있다면 500개의 개별 아이템으로 분리
예시 출력:
[
{"날짜": "2024-04-01", "제품명": "노트북", "매출액": 1500000, "수량": 3},
{"날짜": "2024-04-02", "제품명": "마우스", "매출액": 30000, "수량": 10},
...
]
STEP 8: 데이터베이스 저장
- 노드: Postgres Insert
- 테이블: document_table
- 매핑:
-
document_id: 파일 ID-
row_data: 추출된 행 데이터 전체를 JSON으로STEP 9: 스키마 추출 및 저장
500개 행을 모두 처리한 후, 컬럼명을 추출해서 document_info 테이블에 업데이트합니다.
- 노드: Aggregate (500개 아이템을 1개로 합침)
- 노드: Edit Fields (첫 번째 행에서 키값 추출)
- 노드: Postgres Update (document_info의 schema 컬럼 업데이트)
왜 스키마를 따로 저장하나요? AI가 쿼리를 작성할 때 "이 테이블에 어떤 컬럼이 있지?"를 알아야 합니다. 예를 들어 "매출액 합계를 구해줘"라고 하면 AI는 schema를 보고 sales_amount 컬럼을 사용해야 한다는 걸 판단합니다.
성능 최적화 팁
문제: 500개 행을 삭제할 때 삭제 쿼리가 500번 실행되면 느립니다.
해결책: Edit Fields 노드에 "Execute Once" 옵션 활성화
- 첫 번째 아이템만 통과시키고 나머지는 스킵
- 삭제는 한 번만 실행되고, 이후 작업은 정상 진행
3단계: AI 에이전트 구축 (SQL 쿼리 자동 생성)
이제 데이터베이스에 데이터가 쌓였으니, AI가 이를 분석할 수 있게 만들어야 합니다.
AI 에이전트의 역할
- 사용자 질문을 이해
- 적절한 SQL 쿼리 자동 생성
- 쿼리 실행 및 결과 해석
- 자연어로 답변 생성
구현 방법
노드: AI Agent (N8N)
모델 선택: GPT-4 Turbo (또는 GPT-4.1)
- 이유: SQL 쿼리 생성은 복잡한 논리적 사고가 필요하므로 최신 고성능 모델 필수
- Temperature: 0.2 (낮을수록 일관되고 정확한 답변)
Temperature란? AI의 창의성 수준입니다.
- 0에 가까울수록: 항상 같은 답변 (사실 기반 작업에 적합)
- 1에 가까울수록: 매번 다른 답변 (창작 작업에 적합)
SQL 쿼리는 창의성보다 정확성이 중요하므로 0.2로 설정합니다.
프롬프트 설계 (핵심)
당신은 SQL 전문가입니다. 사용자의 질문을 분석하여 PostgreSQL 쿼리를 작성하세요.
사용 가능한 테이블:
1. document_info: 파일 메타데이터
- id, title, schema
2. document_table: 실제 데이터
- document_id, row_data (JSONB)
중요 규칙:
1. row_data는 JSONB 타입이므로 -> 연산자로 접근
예: row_data->>'매출액'
2. 날짜 비교 시 TO_DATE 함수 사용
3. 집계 함수 사용 시 CAST로 타입 변환
예: SUM(CAST(row_data->>'매출액' AS INTEGER))
4. 쿼리 실행 전 반드시 schema를 확인하여 컬럼명 검증
예시:
질문: "4월 총 매출은?"
쿼리:
SELECT SUM(CAST(row_data->>'매출액' AS INTEGER)) as total
FROM document_table
WHERE document_id = (SELECT id FROM document_info WHERE title LIKE '%4월%')
도구(Tool) 연결
AI 에이전트가 실제로 데이터베이스에 접근하려면 "도구"를 제공해야 합니다.
도구 1: Postgres Query
- AI가 생성한 SQL을 실행
- 결과를 다시 AI에게 전달
도구 2: Get Schema
- document_info에서 schema 조회
- AI가 올바른 컬럼명을 사용하도록 도움
4단계: 자동 리포트 생성 및 발송
리포트 생성 프롬프트
다음 데이터를 바탕으로 주간 매출 리포트를 작성하세요.
포함 내용:
1. 총 매출액 및 전주 대비 증감률
2. 베스트셀러 TOP 5
3. 카테고리별 매출 분포
4. 주요 인사이트 3가지
5. 다음 주 액션 아이템
형식: 마크다운
톤: 전문적이지만 읽기 쉽게
이메일 자동 발송
- 노드: Gmail Send Email
- 수신자: 팀원 이메일 목록
- 제목: "[자동 생성] 2024년 6월 3주차 매출 리포트"
- 본문: AI가 생성한 마크다운 리포트
실전 활용 시나리오

시나리오 1: 이커머스 브랜드
상황: 매주 월요일 오전 9시에 지난주 매출 리포트 필요
구현:
- 매주 일요일 밤 12시에 ERP에서 매출 데이터 자동 추출
- 구글 드라이브 "주간리포트" 폴더에 자동 업로드
- N8N 워크플로우가 감지하여 데이터베이스 업데이트
- 월요일 오전 8시에 스케줄 노드가 AI 에이전트 실행
- 리포트 생성 후 전 직원에게 이메일 발송
효과: 매주 3시간 소요되던 작업이 완전 자동화
시나리오 2: 재고 관리
상황: 재고가 안전 재고 이하로 떨어지면 알림 필요
구현:
- 매일 자정에 재고 데이터 업데이트
- AI 에이전트가 "안전 재고 이하 품목은?" 쿼리 실행
- 해당 품목이 있으면 구매팀에 슬랙 알림
효과: 품절 사태 사전 방지
시나리오 3: 고객 분석
상황: 이탈 위험 고객 조기 발견
구현:
- 주간 고객 활동 데이터 수집
- AI가 "최근 30일 구매 없고 이전 90일 구매 3회 이상인 고객" 추출
- 마케팅팀에 리타겟팅 캠페인 대상 리스트 전달
효과: 고객 이탈률 15% 감소
주의사항 및 문제 해결

문제 1: AI가 잘못된 SQL을 생성해요
원인: 스키마 정보가 부정확하거나 프롬프트가 불명확
해결책:
- document_info의 schema가 정확히 저장되었는지 확인
- 프롬프트에 예시 쿼리 3~5개 추가
- AI에게 "쿼리 실행 전 schema를 반드시 확인하라"고 명시
문제 2: 대용량 데이터 처리 시 느려요
원인: 한 번에 너무 많은 행을 처리
해결책:
- Batch 크기를 100으로 설정 (한 번에 100개씩 처리)
- 데이터베이스 인덱스 추가
CREATE INDEX idx_document_id ON document_table(document_id);
CREATE INDEX idx_row_data ON document_table USING GIN(row_data);
문제 3: 날짜 형식이 다양해서 쿼리가 실패해요
원인: "2024-04-01", "2024/04/01", "4월 1일" 등 다양한 형식
해결책:
- 데이터 업로드 시 날짜 형식 통일하는 전처리 노드 추가
- AI 프롬프트에 "날짜는 항상 YYYY-MM-DD 형식으로 변환" 명시
보안 및 개인정보 보호

데이터베이스 보안
- Row Level Security (RLS) 활성화
- Supabase에서 제공하는 행 단위 접근 제어
- 사용자별로 볼 수 있는 데이터 제한
- API 키 관리
- Service Role Key는 절대 클라이언트에 노출 금지
- 환경 변수로 안전하게 저장
- 정기적인 백업
- Supabase는 자동 백업 제공하지만, 중요 데이터는 별도 백업 권장
개인정보 처리
고객 데이터를 다룬다면:
- 개인정보는 암호화하여 저장
- 리포트 생성 시 개인정보는 마스킹 (예: 홍길동 → 홍**)
- 데이터 보관 기간 설정 (예: 1년 후 자동 삭제)
비용 분석

무료로 시작 가능
- Supabase: 월 500MB까지 무료
- N8N: 자체 호스팅 시 서버 비용만 (월 $5~10)
- OpenAI API: 첫 달 $5 크레딧 제공
실제 운영 비용 (월 1000건 리포트 생성 기준)
| 항목 | 비용 |
|---|---|
| Supabase Pro | $25 |
| N8N Cloud | $20 (또는 자체 호스팅 $10) |
| OpenAI API (GPT-4) | $30~50 |
| **총계** | **$75~95** |
ROI 계산:
- 직원 1명이 주 3시간 절약 = 월 12시간
- 시급 3만원 기준 = 월 36만원 절감
- 투자 대비 300% 이상 효과
핵심 정리
✅ SQL RAG는 숫자 기반 비즈니스 데이터 분석에 최적화된 기술입니다
- 일반 RAG는 문서 검색용, SQL RAG는 정형 데이터 분석용
- 매출, 재고, 고객 데이터처럼 정확한 계산이 필요한 경우 필수
✅ 완전 자동화로 반복 작업을 제거할 수 있습니다
- 데이터 업로드만 하면 분석부터 리포트 발송까지 자동
- 주간 리포트 작성 시간을 90% 이상 단축
✅ 초기 구축에 2~3일, 이후 유지보수는 거의 불필요합니다
- 한 번 설정하면 계속 작동
- 새로운 데이터 형식 추가도 간단
✅ 중소기업도 충분히 도입 가능한 비용입니다
- 월 10만원 이하로 운영 가능
- 직원 시간 절감 효과가 비용보다 훨씬 큼
✅ 보안과 정확성을 동시에 확보해야 합니다
- 데이터베이스 접근 권한 철저히 관리
- AI 생성 쿼리는 실행 전 검증 단계 필수
다음 단계: 지금 바로 시작하세요

오늘 할 일:
- Supabase 계정 만들고 프로젝트 생성 (10분)
- 샘플 데이터 3개월치 준비 (엑셀 또는 CSV)
- N8N 설치 또는 클라우드 계정 생성
이번 주 목표:
- 데이터베이스 테이블 생성
- 구글 드라이브 연동 워크플로우 구축
- 샘플 데이터로 첫 자동 업로드 테스트
다음 주 목표:
- AI 에이전트 구축 및 테스트
- 간단한 쿼리부터 시작 ("총 매출은?")
- 리포트 자동 생성 기능 추가
한 달 후:
- 실제 업무에 적용하여 시간 절감 효과 측정
- 팀원들에게 공유하여 조직 전체 효율 향상
데이터 분석 자동화는 더 이상 대기업만의 특권이 아닙니다. 오늘 소개한 방법으로 당신도 AI 기반 자동 리포트 시스템을 구축할 수 있습니다. 반복 작업에서 해방되어 더 창의적이고 전략적인 일에 집중하세요!