
PM도 Claude Code로 BigQuery 분석을 할 수 있는 기반을 만들었더니 대단했던 이야기
요약
Claude Code를 활용하여 PM이 GitHub Issue에 자연어로 요청하면 BigQuery 분석 결과를 자동으로 반환하는 시스템을 구축한 사례를 소개합니다. 보안 리스크를 방지하기 위해 읽기 전용 권한 부여, 쿼리 검증 스크립트, 실행 도구 제한 등 3단계 안전 설계를 적용했습니다.
핵심 포인트
- Claude Code와 GitHub Actions를 연동한 데이터 분석 자동화
- 비엔지니어가 SQL 없이 자연어로 DB 분석 가능
- 읽기 전용 권한 및 비용 캡을 통한 인프라 보안 강화
- 위험한 SQL 키워드를 차단하는 쿼리 검증 로직 구현
- allowedTools 설정을 통한 실행 명령어 제한
Globis에서 엔지니어로 근무하고 있는 호리오(堀尾)입니다. 사내 교육 플랫폼인 「나노단과(ナノ単科)」의 개발을 담당하고 있습니다.
이번에, PM이 GitHub Issue에 일본어로 작성하기만 하면, BigQuery의 분석 결과가 돌아오는 구조를 Claude Code로 구축했습니다.
"비엔지니어에게 AI를 통해 DB를 조작하게 하는 것, 무섭지 않나요?"
이 질문은 사내에 소개했을 때 반드시 들었던 질문입니다. 이 기사에서는 그 우려에 어떻게 대응했는지, 그리고 3단계 안전 설계로 어떻게 해결했는지에 대해 말씀드리겠습니다.
제품 개발 현장에서 다음과 같은 대화가 떠오르지 않으시나요?
PM으로부터 "이 데이터를 보고 싶다"라는 의뢰가 온다. 엔지니어는 현재 진행 중인 작업을 중단하고, 의뢰 내용을 확인하고, SQL을 작성하여 결과를 공유한다. 그리고 PM으로부터 돌아오는 대답은——
"데이터 감사합니다!"
"아, 이 조건도 조금 추가해서 보고 싶은데요..."
"지난달 데이터와 비교하면 어떻게 되나요?"
데이터 분석은 본질적으로 "반복"입니다. 한 번 결과를 보면 다음 질문이 생겨납니다. 하지만 그때마다 엔지니어가 손을 멈춰야 한다면, 개발 공수는 빼앗기고 PM의 의사결정도 늦어집니다. 리드 타임(Lead time)은 몇 시간에서 며칠이 걸립니다. 저는 이 구조적인 문제를 시스템으로 해결하고 싶었습니다.
만든 것은, GitHub Issue에 자연어로 분석 의뢰를 작성하면, Claude Code가 자동으로 BigQuery에 쿼리(Query)를 실행하고 결과를 댓글로 돌려주는 구조입니다.
GitHub Issue (@claude_analysis 로 의뢰)
↓
GitHub Actions 워크플로우(Workflow) 기동
...
PM의 경험은 심플합니다. Issue에 "@claude_analysis 어제의 DAU를 뽑아줘"라고 적습니다. 몇 분 후, 집계 결과와 비즈니스 인사이트(Business insight)가 댓글로 돌아옵니다. SQL에는 전혀 손댈 필요가 없습니다.
뒷단에서는 GitHub Actions가 기동하며, Claude Code가 백엔드(Backend) 코드베이스와 스키마(Schema) 정보를 읽어들인 후 적절한 SQL을 생성 및 실행합니다. 제품의 사양을 이해한 상태에서 분석하기 때문에, 단순히 SQL을 던지는 것뿐만 아니라 결과에 대한 시사점까지 제공해 줍니다.
이 구조를 소개하면 반드시 듣게 되는 것이 보안 리스크와 비용 폭발에 대한 우려입니다. AI가 예상치 못한 쿼리를 실행하면 어떻게 되는가. 솔직히 이 부분이 가장 시간을 들여 설계한 부분입니다.
저는 이를 "3단계 다층 방어"로 대처하기로 했습니다.
-
BigQuery에 접속하는 서비스 계정에는 **읽기 전용 권한(BigQuery Data Viewer)**만을 부여했습니다. 만에 하나 애플리케이션 계층이나 AI 계층이 돌파되더라도, 인프라 레벨에서 쓰기는 불가능합니다. 추가로 BigQuery의 비용 캡(Cost cap)도 설정해 두었습니다.
-
쿼리 실행용 Ruby 스크립트에
validate_query함수를 포함했습니다. 쿼리 실행 전에 검증(Validation)이 실행되며, 위험한 SQL 키워드가 포함되어 있으면 즉시 처리를 중단합니다.
def validate_query(query)
dangerous_keywords = %w[INSERT UPDATE DELETE DROP CREATE ALTER TRUNCATE MERGE]
normalized_query = query.upcase.gsub(/\s+/, ' ')
...
- Claude Code의
allowedTools설정으로, 실행 가능한 명령어를 *Read, Edit, Bash(ruby ) 3가지로 한정했습니다.Bash(ruby *)는 패턴 매칭이므로,ruby로 시작하는 명령어만 실행할 수 있습니다.bq,gcloud,docker,curl,mysql등은 전부 차단됩니다. 나아가 SKILL.md(Claude Code의 스킬 정의 파일)에서 상세한 금지 사항을 명시적으로 기술했습니다. "bq명령어는 존재하지 않는 것으로 취급할 것", "사용자에게 수동 실행을 요청하는 것도 금지"라고 명시하여, AI가 우회로를 찾지 못하도록 철저히 관리하고 있습니다.
이 3개 층은 독립적으로 기능하도록 설계되었습니다. 하나의 층이 설령 돌파되더라도 다른 층에서 차단됩니다.
| 지표 | Before | After |
|---|---|---|
| 분석 리드 타임 (Analysis Lead Time) | 수 시간 ~ 수 일 | 수 분 |
| ... |
숫자 이상으로 컸던 것은 정성적인 변화입니다. PM이 "이것도 좀 보고 싶다"라고 망설임 없이 실행할 수 있게 되었습니다. 데이터를 보고, 새로운 질문이 생기면, 즉시 다시 분석한다. 이 사이클이 엔지니어의 손을 전혀 빌리지 않고 돌아가게 된 점이 매우 큽니다.
부차적인 효과로, 분석 지식 (Knowledge)이 GitHub Issue에 축적되기 시작했습니다. "그때 어떤 분석을 했었지?"를 Issue 검색을 통해 되돌아볼 수 있습니다.
이 메커니즘은 "BigQuery + Claude Code"에만 국한된 이야기가 아닙니다. 비엔지니어가 AI를 경유하여 안전하게 시스템을 조작한다는 설계 패턴으로서, 다양한 상황에 응용할 수 있다고 생각합니다.
핵심은 안전 설계입니다. 3단계의 다층 방어 (인프라 → 애플리케이션 → AI 스킬)가 있기 때문에 비엔지니어가 안심하고 사용할 수 있습니다. Claude Code의 allowedTools와 SKILL.md를 조합하면, AI가 할 수 있는 일을 정밀하게 제어할 수 있습니다.
엔지니어가 "메커니즘"을 만듦으로써 팀 전체의 데이터 접근을 민주화한다. 그 하나의 형태로서 여러분도 시도해 보실 수 있다면 좋겠습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기