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가 할 수 있는 일을 정밀하게 제어할 수 있습니다.
엔지니어가 "메커니즘"을 만듦으로써 팀 전체의 데이터 접근을 민주화한다. 그 하나의 형태로서 여러분도 시도해 보실 수 있다면 좋겠습니다.