Text-to-SQL로 다가가는 데이터 민주화

누구나 안전하고 빠르게 데이터 분석으로 인사이트를 얻을 수 있도록 AI와 BigQuery 연동한 ‘Text-to-SQL 프로젝트’를 소개합니다.
박재원's avatar
Oct 31, 2025
Text-to-SQL로 다가가는 데이터 민주화

1. 들어가며

안녕하세요! 잡플래닛의 Data Intelligence 팀 소속 AI Engineer 박재원입니다.
잡플래닛은 기업 리뷰와 더불어 여러분의 구직 활동을 도와줄 수 있는 다양한 데이터를 보유하고 있으며, Data Intelligence 팀(이하 DI팀)에서는 데이터 기반의 비즈니스 의사 결정을 내릴 수 있도록 관련 빌더분들을 지원해 드리고 있습니다.

1. 이 포스트에서 다루는 내용

이 글은 RAG + Text2SQL 기술을 실제 비즈니스 환경에 도입하는 과정에서 마주한 현실적인 문제들과 그 해결 방법을 다룹니다.
  • 누구에게 도움이 될까요?
    • 자사 데이터를 AI와 연동하고 싶은 데이터 엔지니어
    • Text2SQL 기술의 실무 적용을 고민하는 AI/ML 엔지니어
    • 데이터 접근성 개선을 원하는 CTO, 데이터팀 리더
    • AI Agent 아키텍처 설계에 관심 있는 개발자
  • 어떤 인사이트를 얻을 수 있나요?
    • 이론적인 Text2SQL을 넘어선 실제 운영 환경에서의 고려사항
    • MCP(Model Context Protocol)를 활용한 AI-데이터 연동의 새로운 접근법
    •  

2. 왜 중요한가요?

RAG와 Text2SQL은 이미 널리 알려진 기술입니다. 하지만 실제 비즈니스 환경에 도입하려면 "우리 회사의 데이터를 어떻게 안전하고 효율적으로 연동할 것인가?"라는 핵심 과제를 해결해야 합니다.
단순히 LLM API에 SQL 스키마를 전달하는 것을 넘어서, 실제 운영 환경에서는:
  • 수백 개의 테이블 중에서 적절한 데이터를 찾아야 하고
  • 비용 폭탄을 방지하면서도 유연한 쿼리를 허용해야 하며
  • 개발자가 아닌 사용자도 안전하게 사용할 수 있어야 합니다.

2. 프로젝트 배경(Pain point 분석)

최근 Claude, ChatGPT, Cursor AI 등 다양한 AI 도구들이 업무 현장에서 필수적인 도구로 자리 잡고 있습니다. 하지만 이들 AI 도구가 실제 비즈니스 데이터에 접근하여 분석을 수행하는 것은 여전히 제한적이었습니다.
특히 BigQuery와 같은 대용량 데이터 웨어하우스에서 데이터를 조회하고 분석하는 작업은:
  • 복잡한 SQL 쿼리 작성이 필요하고
  • 데이터 구조와 비즈니스 로직에 대한 도메인 지식이 필요하며
  • AI 도구와의 연동이 기술적으로 제한적이었습니다
그런데 최근 MCP(Model Context Protocol)와 Agent의 등장으로 이런 장벽이 허물어지기 시작했습니다. AI가 단순히 텍스트를 생성하는 것을 넘어서, 실제 데이터베이스와 직접 연동하여 분석 작업을 수행할 수 있는 새로운 가능성이 열린 것입니다.
이러한 기회를 활용하여 잡플래닛에서는 BigQuery 데이터 추출과 분석을 자동화하는 MCP 서버를 개발하게 되었습니다.

3. 문제 정의(Action planning)

1. 다양한 직군의 데이터 분석 니즈와 접근성 문제

잡플래닛에는 개발자뿐만 아니라 마케터, 콘텐츠 에디터, 기획자, 영업팀 등 다양한 비개발 직군이 함께 일하고 있습니다. 이들 모두가 업무를 위해 데이터 분석이 필요하지만, 현실은 다음과 같았습니다:
기존 프로세스의 한계:
  • 마케터: "이번 달 채용 공고 조회수가 높은 업종 TOP 10을 알고 싶어요"
  • 콘텐츠 에디터: "최근 리뷰가 많이 달린 회사들의 특징을 분석해 주세요"
  • 기획자: "사용자 행동 패턴을 보고 새로운 기능 아이디어를 얻고 싶어요"
모든 요청이 DI팀을 거쳐야 하는 병목 현상대기 시간 발생 (평균 2-3일)커뮤니케이션 오버헤드 및 요구사항 왜곡 가능성
 

2. 데이터 분석 요청 처리의 비효율성

DI팀 관점에서도 문제가 있었습니다:
  • 요구사항 해석의 어려움: "~~할 수 있지 않을까요?"와 같은 모호한 요구사항
  • 실시간 대응의 한계: 급하게 필요한 데이터도 대기 시간 필요
  • AI 도구 활용의 제약: ChatGPT로 SQL을 생성해도 실제 데이터 접근은 별도 과정 필요
 

3. 데이터 접근의 안전성과 비용 관리

BigQuery는 강력하지만, 조심스럽게 다뤄야 하는 도구입니다:
  • 비용 폭탄의 위험: 잘못된 쿼리 하나로 수십만 원의 비용 발생 가능
  • 권한 관리의 복잡성: 직군별로 다른 데이터 접근 권한 필요
  • 실수 방지의 어려움: 개발자가 아닌 사용자의 실수로 인한 장애 가능성
 

4. 자연어와 데이터 분석 간의 격차

"최근 3개월간 IT업계에서 연봉이 높은 회사들의 리뷰 점수는 어떨까?"
이런 자연스러운 질문을 데이터로 답하기 위해서는:
  • 복잡한 SQL 작성 (JOIN, 집계, 필터링 등)
  • 적절한 테이블과 컬럼 찾기
  • 비즈니스 로직 구현 (예: "높은 연봉"의 기준 정의)
결과적으로 데이터 기반 의사결정의 속도 저하 및 기회비용 증가

4. 핵심 요구 사항

우리가 해결하고자 한 핵심 요구사항은 다음과 같았습니다:

1. 원활한 AI 통합

  • Cursor AI, Claude, ChatGPT 등에서 직접 BigQuery 데이터 접근
  • 자연어 명령으로 복잡한 데이터 분석 수행
 

2. 강력한 비용 관리

  • 실행 전 비용 예측 및 사용자 승인 플로우
 

3. 직관적인 데이터 탐색

  • 스키마 자동 탐색 및 테이블 추천
  • 샘플 데이터 미리보기 및 시각화
  • 파티션 정보 및 최적화 제안
 

4. 고급 분석 기능

  • 자연어를 SQL로 자동 변환
  • 쿼리 성능 최적화 및 대안 제안
  • 데이터 품질 분석 및 비즈니스 임팩트 해석

5. 기술 스택 및 아키텍처

5. 1. 핵심 기술 스택

- Python 3.10+ (FastMCP) - Google Cloud BigQuery SDK - FastMCP (MCP 프로토콜 서버) - LangGraph (AI Agent 워크플로우 오케스트레이션) - TextEmbedding via GCP Vertex AI
 

5. 2. 사용 기술 소개

1. MCP(Model Context Protocol)

MCP는 AI 모델이 외부 시스템과 안전하게 상호작용을 할 수 있도록 하는 표준 프로토콜입니다.
notion image
기존 방식의 한계:
사용자 → ChatGPT → "BigQuery에서 데이터를 가져와주세요" ChatGPT → "죄송하지만 직접 데이터베이스에 접근할 수 없습니다"
MCP를 통한 해결:
사용자 → MCP 클라이언트 → MCP 서버 → DataSource → 실제 데이터 반환
MCP는 마치 "AI를 위한 API 게이트웨이"와 같습니다. AI가 필요한 도구들을 안전하고 표준화된 방식으로 사용할 수 있게 해주는 다리 역할을 합니다.
 

2. LangGraph: AI Agent의 두뇌 구조

LangGraph는 복잡한 AI 워크플로우를 그래프 형태로 설계할 수 있는 프레임워크입니다.
전통적인 AI 처리:
notion image
LangGraph를 통한 AI Agent:
notion image
예를 들어, "최근 리뷰가 좋은 IT 회사들의 급여 수준을 분석해 줘"라는 요청이 들어오면:
  1. 분석 단계: "리뷰", "IT 회사", "급여" 키워드 추출
  1. 계획 단계: 필요한 테이블들 식별 (회사 정보, 리뷰 데이터, 급여 데이터)
  1. 실행 단계: 각 테이블에서 데이터 조회
  1. 검증 단계: 데이터 품질 확인, 결과 검토
  1. 재계획: 필요시 추가 데이터 수집 또는 분석 방법 조정
 

3. AI Agent와 Agentic 구조

AI Agent는 단순히 질문에 답하는 것을 넘어서, 스스로 계획을 세우고 도구를 사용하여 목표를 달성하는 AI입니다.
Agentic 구조의 핵심 특징:
  • 자율성(Autonomy): 사용자가 모든 단계를 지시하지 않아도 스스로 판단
  • 도구 사용(Tool Use): 외부 시스템과 상호작용 가능
  • 계획 수립(Planning): 복잡한 작업을 단계별로 분해
  • 피드백 학습(Feedback Loop): 결과를 보고 접근 방법 개선
예시:
사용자: "우리 회사 마케팅 성과를 분석해줘" 일반 AI: "죄송하지만 귀하의 회사 데이터에 접근할 수 없습니다" AI Agent: 1. 마케팅 관련 테이블 탐색 → 광고 지출, 전환율, 매출 데이터 발견 2. 적절한 기간 설정 → 최근 3개월 데이터로 결정 3. 데이터 조회 및 분석 → SQL 쿼리 실행 4. 시각화 및 인사이트 도출 → 그래프 생성, 트렌드 분석 5. 개선 제안 → 데이터 기반 추천사항 제시
이렇게 AI Agent는 사용자의 의도를 파악하고, 스스로 계획을 세우며, 필요한 도구를 활용해 목표를 달성하는 능동적인 AI 시스템입니다.
 

5. 3. 아키텍처 설계

1. 초기 설계 (단순한 구조)

초기에는 기본적인 MCP 연동을 목표로 순차적이고 단순한 워크플로우로 시작했습니다:
notion image
초기 워크플로우의 특징:
  • 순차 실행: 각 단계가 완료되어야 다음 단계 진행
  • 단일 경로: 모든 요청이 동일한 4단계를 거침
  • 에러 시 전체 실패: 한 단계에서 실패하면 처음부터 다시 시작 / 에러 반환
  • 상태 관리 없음: 이전 단계의 정보를 다음 단계에서 충분히 활용하지 못함
 

2. 현재 아키텍처 (문제 해결 후 발전된 구조)

실험과 피드백을 통해 다음과 같은 계층화된 아키텍처로 발전했습니다:
notion image

6. 초기 구축 이후 문제 해결

6. 1. 초기 테스트에서 발생한 주요 문제들

초기 버전을 팀 내에서 테스트하면서 다음과 같은 심각한 문제들이 발견되었습니다:

1. 대용량 쿼리 남발 문제 💸

  • 한 번의 실수로 큰 비용 발생
  • 테스트 단계에서만 예상치 못한 비용 누적
해결책:
# 다단계 비용 검증 시스템 def validate_query(query): # 1. Dry Run으로 비용 예측 cost_estimate = estimate_cost_with_dryrun(query) # 2. 비용별 차등 대응 (현실적인 임계값) if cost_estimate > 5.0: # $5 이상 승인 필요 (약 0.8TB) return request_user_approval() elif cost_estimate > 1.0: # $1 이상 경고 (약 160GB) return show_cost_warning() elif cost_estimate > 0.1: # $0.1 이상 알림 (약 16GB) return show_cost_info() # 3. 자동 LIMIT 추가로 안전장치 if "LIMIT" not in query.upper(): query = add_default_limit(query, 1000) return validated_query
 
해결 방법
AI가 과도한 범위를 탐색하지 않도록 하기 위해, Datetime 컬럼 조회 범위를 제한하거나, 샘플 데이터 Row 수를 조절하였습니다.
 

2. 엉뚱한 테이블 탐색 문제 🔍

문제 상황:
  • "연봉 정보"를 요청했는데 user_salary_temp (테스트 테이블) 발견
  • Description이 없는 테이블들로 인한 잘못된 매칭
  • 파티션 테이블 (salary_20201002, salary_20210315 등)을 개별 테이블로 인식
해결책:
# 벡터 검색 기반 스마트 테이블 탐색 def search_relevant_tables(user_query): # 1. 사용자 쿼리 임베딩 query_embedding = embed_text(user_query) # 2. 테이블 메타데이터 벡터 검색 # (description + schema 정보가 미리 임베딩되어 저장됨) similar_tables = vector_db.similarity_search( query_embedding, top_k=10 ) # 3. 테스트/임시 테이블 필터링 excluded_patterns = ['temp_', 'test_', 'backup_'] filtered_tables = filter_production_tables(similar_tables) # 4. 비즈니스 중요도로 재정렬 prioritized_tables = rank_by_business_priority(filtered_tables) return prioritized_tables
 

6. 2. Agentic 구조로의 전환 과정

단순 구조의 한계점 인식

초기 단순한 워크플로우를 실제 운영하면서 다음과 같은 심각한 문제점들이 드러났습니다:
  1. 복잡한 분석 작업 처리 불가:
      • "최근 3개월 IT업계 상위 10% 회사의 리뷰 트렌드 분석" 같은 다단계 요청
      • 여러 테이블 JOIN이 필요한 복합 분석 시나리오
  1. 워크플로우 롤백 불가능:
      • SQL 생성 단계에서 실패 → 테이블 탐색부터 다시 시작
      • 비용 검증 실패 → 전체 프로세스 재시작 (이미 찾은 테이블 정보 손실)
      • 중간 결과 활용 불가로 인한 비효율성
  1. 조건부 로직 구현의 한계:
      • 비용이 높으면 → 샘플링으로 재시도
      • 테이블을 못 찾으면 → 키워드 변경하여 재탐색
      • 이런 "if-then" 로직을 순차 구조로는 구현 불가
예시:
사용자: "최근 3개월 IT업계 연봉 상위 10% 회사의 리뷰 점수 분석해줘" 기존 시스템의 처리: 1. 테이블 탐색 → companies, reviews, salaries 발견 ✅ 2. SQL 생성 시도 → reviews 테이블에 salary 컬럼이 없음을 발견 ❌ 3. 전체 실패 → "SQL 생성 실패" 메시지만 반환 문제점: - 이미 찾은 3개 테이블 정보 모두 손실 - salaries 테이블과 reviews 테이블을 JOIN하면 되는데 로직 시도 불가 - 대안적인 접근법(테이블 관계 재분석, 다른 JOIN 방식 시도) 불가능 - 사용자는 처음부터 다시 요청해야 함
위와 같은 한계점들로 인해 Agentic 구조로의 전환을 결정하게 되었습니다. 단순한 순차 워크플로우로는 복잡한 데이터 분석 요청을 안정적으로 처리하기 어렵다는 것이 명확해졌기 때문입니다.
 

Agentic 구조의 장점

  • 책임 분리:
    • 단일 프롬프트로 모든 작업을 처리할 때 발생하는 복잡성과 예측 불가능성을 해결
    • 각 도구가 특정 영역에 집중함으로써 프롬프트 최적화가 용이해짐
  • 확장성과 유지보수성:
    • 새로운 기능 요구사항에 대해 독립적인 도구 추가로 대응 가능
    • 특정 도구의 수정이 다른 컴포넌트에 미치는 영향을 최소화
    • 도구별 독립적인 테스트 환경 구축으로 품질 관리 효율성 향상
  • 성능 최적화:
    • 병렬 처리를 통한 전체 응답 시간 개선
    • 도구별 캐싱 전략 적용으로 리소스 효율성 증대
    • 성능 병목 지점에 대한 선택적 최적화 가능
  • 재사용성: 각 Tool들을 다른 컨텍스트에서도 활용 가능
 

각 Tool의 역할과 책임

1. Data Explorer Tool

핵심 책임: 벡터 검색 기반 데이터 구조 탐색 및 테이블 추천
프롬프트:
사용자 요청: "{user_query}"에 대해 관련 테이블을 찾아주세요. 분석 과정: 1. 키워드 추출 및 비즈니스 용어 매핑 2. 벡터 유사도 검색으로 후보 테이블 발견 3. 테스트/임시 테이블 제외 필터링 4. 비즈니스 중요도 점수 계산 5. 상위 5개 테이블 추천 및 JOIN 관계 분석 출력 형식: 테이블명, 관련도 점수, 추천 이유, JOIN 가능 테이블
 
실행 과정:
notion image
 

2. Query Generator Tool

핵심 책임: 자연어를 SQL로 변환하고 최적화
프롬프트:
다음 정보를 바탕으로 BigQuery SQL을 생성해주세요: 사용자 요청: "{user_request}" 선택된 테이블: {selected_tables} 테이블 스키마: {table_schemas} 생성 규칙: 1. BigQuery 문법 준수 (표준 SQL) 2. 성능 최적화: WHERE 절 우선 적용, 적절한 LIMIT 사용 3. JOIN 필요 시 적절한 키 활용 4. 복잡도에 따라 템플릿 또는 동적 생성 선택 출력: SQL 쿼리, 신뢰도 점수, 쿼리 설명, 복잡도 수준
 
실행 과정:
notion image
 

3. Query Validator Tool

핵심 책임: 쿼리 안전성 검증 및 비용 관리
프롬프트:
다음 SQL 쿼리를 종합적으로 검증해주세요: {generated_sql} 검증 항목: 1. 보안 검사: SQL Injection 패턴, 위험한 명령어 탐지 2. 권한 검증: 사용자 접근 권한 내 테이블/컬럼 사용 여부 3. 비용 예측: Dry Run 기반 정확한 처리 비용 계산 4. 성능 분석: 실행 시간, 리소스 사용량 예측 비용 임계값: - $5 이상: 승인 필요 - $1 이상: 경고 표시 - $0.1 이상: 정보 제공 출력: 안전성 여부, 예상 비용, 승인 필요 여부, 경고사항, 최적화 제안
 
실행 과정:
notion image
 

4. BigQuery Executor Tool

핵심 책임: 안전한 쿼리 실행 및 결과 처리
프롬프트:
검증된 SQL 쿼리를 BigQuery에서 실행하고 결과를 처리해주세요: {validated_sql} 실행 절차: 1. 승인 필요 시 사용자 확인 대기 2. BigQuery 클라이언트로 쿼리 실행 3. 실행 메타데이터 수집 (비용, 시간, 행 수) 4. 결과 데이터 사용자 친화적 포맷팅 5. 에러 발생 시 기술적 메시지를 일반 사용자 언어로 변환 성능 모니터링: - 실행 시간 추적 - 리소스 사용량 기록 - 실행 히스토리 저장 출력: 실행 상태, 포맷된 결과, 메타데이터, 인사이트 제안
 
실행 과정:
notion image
 

5. Orchestrator Agent

핵심 책임: 전체 워크플로우 조정 및 에이전트 간 통신
프롬프트:
사용자 요청을 전체 워크플로우를 통해 처리해주세요: "{user_request}" 처리 단계: 1. Data Explorer → 관련 테이블 탐색 및 추천 2. Query Generator → 자연어를 SQL로 변환 3. Query Validator → 보안 및 비용 검증 4. BigQuery Executor → 안전한 쿼리 실행 5. 결과 통합 → 인사이트 생성 및 최종 답변 각 단계별 실패 처리: - 테이블 미발견 → 키워드 확장 제안 - 낮은 신뢰도 → 명확화 요청 - 검증 실패 → 보안 이슈 설명 - 실행 오류 → 사용자 친화적 에러 메시지 출력: 최종 분석 결과, 인사이트, 실행 메타데이터, 개선 제안
 
실행 과정:
notion image
 
이러한 Agentic 구조로의 전환을 통해 복잡한 데이터 분석 요청도 체계적이고 안전하게 처리할 수 있게 되었습니다.

6. 3. LangGraph 도입과 State 관리

LangGraph 선택 이유: 초기 Agentic 구조 구현 시 여러 워크플로우 오케스트레이션 도구를 검토했습니다:
  • n8n: 시각적 워크플로우 구성이 가능하지만 복잡한 에이전트 간 상태 공유와 동적 조건부 로직 처리에 제약 → GUI 기반 설정의 한계
  • LlamaIndex: RAG 파이프라인에 특화되어 있고 최근 워크플로우 기능도 추가되었지만, 학습 비용 대비 효율성 고려
  • LangGraph: 에이전트 간 상태 공유와 조건부 플로우에 최적화
 
LangGraph를 선택한 결정적 이유:
  • 🔄 상태 기반 워크플로우: 각 에이전트 간 컨텍스트 공유 용이
  • 🌊 조건부 플로우: 동적인 분기 처리 및 에러 복구 지원
  • 🔍 디버깅 지원: 각 단계별 상태 추적 및 시각화 가능
  • 🚀 확장성: 새로운 에이전트 추가 시 기존 플로우 영향 최소화
 

LangGraph State 관리 구조

notion image
 

LangGraph 도입 후 개선 효과

  • 상태 추적 개선: 각 단계별 상태가 명확하게 관리되어 디버깅 용이
  • 조건부 플로우: 동적인 분기 처리로 복잡한 비즈니스 로직 구현
  • 에러 복구: 단계별 실패 시 적절한 복구 전략 적용
  • 성능 모니터링: 각 노드별 실행 시간 및 성능 메트릭 수집
  • 확장성: 새로운 에이전트 추가 시 기존 플로우에 미치는 영향 최소화
이러한 LangGraph 기반 구조를 통해 복잡한 데이터 분석 요청도 안정적이고 체계적으로 처리할 수 있게 되었습니다.

7. 실행 결과

잡플래닛 플랫폼에 최근 7일간 등록된 리뷰 개수와 추이를 분석해 본 결과입니다. 사용 모델은 Claude 4 Sonnet입니다.
notion image
notion image
notion image
notion image
notion image

8. 향후 발전 방향

1. AI 기능 강화

  • Business Glossary 구축 : 더 정교한 비즈니스 용어 및 정책 이해
    • ex)멤버십 : 멤버십 상품은 크게 2가지로 나뉩니다.(개인멤버십, 기업멤버십)
    • ex) 매출 지표 : 멤버십 매출 == 개인멤버십 매출 + 기업멤버십 매출
    • → 위와 같은 형태로 비즈니스 지표에 대한 정의, 산출식 등을 LLM Context로 제공해 줌으로써, 더 정확한 매칭이 가능하도록 구현할 예정입니다.
  • 자동 인사이트 생성: 데이터에서 자동으로 비즈니스 인사이트 추출
    • 매출에 대한 추출 요청 → 알아서 추이를 분석하고, 비즈니스 플랜 등을 제안해주는 기능.
    •  

2. 실행 시간 단축

  • 현재는 복잡한 요청의 경우 최대 5분까지 소요되는 경우가 존재하나, 이를 개선하여 1분대에 사용자에게 답변을 줄 수 있는 시스템을 구축하고자 합니다.
 

3. 고급 시각화

  • 자동 차트 생성: 데이터 특성에 맞는 최적 시각화 제안
  • 대화형 대시보드: 실시간 데이터 탐색 인터페이스
  • 보고서 자동 생성: 정기 보고서 템플릿 및 자동화

9. 마치며

BigQuery 분석 MCP 서버를 통해 우리는 AI와 데이터 분석의 경계를 허물고, 누구나 쉽게 데이터 인사이트를 얻을 수 있는 환경을 만들고자 합니다.
이 프로젝트의 핵심 가치는 이제 SQL을 모르는 기획자도, Python을 다루지 못하는 빌더들도, 자연어만으로 복잡한 데이터 분석을 수행할 수 있다는 점이라고 생각합니다.
현재도 다양한 인터페이스(slack, Web UI 등)를 구축 중입니다! 다음 포스팅 때 공유해 드릴 예정이니 많은 관심 부탁드려요!
 
 
Share article

#잡플래닛 테크블로그 #잡플래닛 기술블로그