AI 개발

Snowflake Cortex Code 완전 가이드 2편 — CLI 실전, dbt 파이프라인 자동화, Claude Code·Kiro 비교

cell-devlog 2026. 6. 2. 11:00
반응형

1편에서 Snowsight 기반 기본 사용법을 다뤘어요.

2편은 파워유저를 위한 CLI 실전이에요.

"Snowsight는 웹 UI라서 로컬 레포 접근이 안 된다." "dbt 프로젝트를 AI로 자동화하고 싶은데 일반 코딩 툴은 스키마를 모른다." "Claude Code랑 Cortex Code 중에 데이터 팀은 뭘 써야 하나?"

CLI는 이 세 문제를 동시에 해결해요. 로컬 파일 접근 + Snowflake 컨텍스트 + dbt/Airflow 지원이에요.


🔑 핵심 요약

Cortex Code CLI 핵심 → 2026.02.23 dbt + Apache Airflow GA 지원 추가 — Snowflake 밖 워크로드로 확장 → AGENTS.md: 프로젝트별 컨벤션 주입 (Claude Code의 CLAUDE.md 포지션) → 로컬 파일 읽기·쓰기, bash 명령 실행, git 연동, SQL 직접 실행 → ! 접두사로 셸 커맨드 실행 → 결과가 에이전트 컨텍스트로 유입 → Agent Skills($ 문법): 재사용 가능한 커스텀 태스크 번들 → 3단계 승인 시스템 + OS 샌드박스 + 자동 위험도 평가


실전 1 — CLI 설치 및 초기 세팅

# CLI 설치
pip install snowflake-cli-labs

# 또는 공식 스탠드얼론 설치 (Python 불필요)
curl -fsSL https://sfc-repo.snowflakecomputing.com/cortex-code/install.sh | bash

# Snowflake 계정 연결
cortex auth login
# → 브라우저 OAuth 인증 또는 키페어 인증 선택
# → 기존 SnowSQL 프로필 재사용 가능

# 연결 확인
cortex --version

# 프로젝트 디렉토리에서 CLI 시작
cd my-dbt-project
cortex

AGENTS.md 프로젝트 컨벤션 설정:

<!-- AGENTS.md — 프로젝트 루트에 위치, 모든 세션에 자동 포함 -->

## 프로젝트 컨텍스트
Finance Analytics dbt 프로젝트
소스 데이터: FINANCE_DB.RAW (TRANSACTIONS, CUSTOMERS, COMPLIANCE_ALERTS)

## 네이밍 컨벤션
- 컬럼명: snake_case
- Staging 모델 접두사: stg_
- Intermediate 모델 접두사: int_
- Mart 모델 접두사: mart_
- 서로게이트 키: dbt_utils.generate_surrogate_key 사용

## 타입 규칙
- 금액: DECIMAL(18,2)
- 날짜: DATE 캐스팅
- 타임스탬프: TIMESTAMP_NTZ

## 구체화 전략
- Staging: view
- Intermediate: ephemeral
- Mart: table (100만 행 초과 시 incremental)
- 대형 Mart 테이블: cluster_by 적용

## 품질 기준
- 모든 모델: 기본키 테스트 필수 (unique + not_null)
- Staging: 소스 freshness 테스트
- Mart: row count reconciliation

AGENTS.md vs CLAUDE.md: 동일한 개념이에요. Claude Code의 CLAUDE.md처럼 Cortex Code는 AGENTS.md를 프로젝트 루트에서 자동으로 읽어서 모든 세션에 컨텍스트로 포함해요. Snowflake 특화 컨벤션(클러스터 키, 웨어하우스 설정 등)을 여기에 정의해요.


실전 2 — dbt 프로젝트 자동화

CLI가 로컬 dbt 레포를 직접 읽고 쓰는 패턴이에요.

# CLI 시작 후 자연어로 dbt 작업

> "TRANSACTIONS 테이블 기반으로 일별 매출 집계 mart 모델 만들어줘"

# Cortex Code가 자동 생성:
# 1. models/mart/mart_daily_revenue.sql
# 2. models/mart/schema.yml (테스트 포함)
# 3. 실제 Snowflake 스키마 반영된 쿼리
-- Cortex Code가 생성한 mart_daily_revenue.sql
-- (실제 TRANSACTIONS 테이블 스키마 반영)
{{
    config(
        materialized='incremental',
        unique_key='revenue_date',
        cluster_by=['revenue_date'],
        on_schema_change='fail'
    )
}}

WITH source AS (
    SELECT
        DATE(created_at) AS revenue_date,
        merchant_id,
        SUM(gross_amount_usd) AS total_revenue,
        SUM(net_amount_usd) AS net_revenue,
        COUNT(DISTINCT transaction_id) AS transaction_count,
        COUNT(DISTINCT customer_id) AS unique_customers
    FROM {{ ref('stg_transactions') }}
    WHERE status = 'COMPLETED'
    {% if is_incremental() %}
        AND created_at >= (SELECT MAX(revenue_date) FROM {{ this }})
    {% endif %}
    GROUP BY 1, 2
)

SELECT
    {{ dbt_utils.generate_surrogate_key(['revenue_date', 'merchant_id']) }} AS revenue_key,
    *,
    CURRENT_TIMESTAMP() AS dbt_updated_at
FROM source
# schema.yml — 자동 생성
models:
  - name: mart_daily_revenue
    description: "일별 가맹점별 매출 집계 mart"
    config:
      contract:
        enforced: true
    columns:
      - name: revenue_key
        data_type: varchar
        constraints:
          - type: not_null
        data_tests:
          - unique
          - not_null
      - name: revenue_date
        data_type: date
        data_tests:
          - not_null
      - name: total_revenue
        data_type: number
        data_tests:
          - not_null
          - dbt_utils.accepted_range:
              min_value: 0

셸 커맨드 + 에이전트 루프 결합:

# ! 접두사로 bash 커맨드 실행 — 결과가 에이전트 컨텍스트로 유입

> !dbt compile --select mart_daily_revenue

# → 컴파일 에러 자동 감지 + 수정 제안
# Cortex Code: "mart_daily_revenue.sql 46번째 줄에서
#   ref('stg_transactions')가 없어요.
#   stg_transactions 모델을 먼저 만들어드릴까요?"

> !dbt test --select mart_daily_revenue

# → 테스트 실패 시 자동 원인 분석 + 쿼리 수정 제안

실전 3 — Agent Skills로 반복 작업 자동화

Agent Skills는 $ 문법으로 호출하는 재사용 가능한 태스크 번들이에요.

# 빌트인 Skills 목록 확인
> $list-skills

# 데이터 거버넌스 스킬 — 테이블 태그·마스킹 정책 자동 적용
> $governance CUSTOMERS.email

# 시맨틱 모델 검증 스킬
> $validate-semantic-model SALES_SEMANTIC_MODEL

# Intelligence 에이전트 생성 스킬
> $create-agent "월간 매출 리포트 에이전트"

커스텀 Skill 정의:

# .cortex/skills/daily-report.yaml
name: daily-report
description: "일별 KPI 리포트 생성 및 Slack 발송"
steps:
  - name: collect-metrics
    sql: |
      SELECT
        DATE(CURRENT_TIMESTAMP()) AS report_date,
        SUM(gross_amount_usd) AS daily_revenue,
        COUNT(DISTINCT customer_id) AS active_customers
      FROM PROD_DB.SALES.FACT_ORDERS
      WHERE DATE(created_at) = CURRENT_DATE()
  - name: send-slack
    tool: slack_mcp
    message: |
      📊 일별 KPI 리포트 ({{report_date}})
      • 매출: ${{daily_revenue:,.0f}}
      • 활성 고객: {{active_customers:,}}명
    channel: "#data-team"
# 커스텀 Skill 실행
> $daily-report

# GitHub Actions에서 스케줄 실행
# .github/workflows/daily-report.yml
name: Daily KPI Report
on:
  schedule:
    - cron: '0 9 * * 1-5'  # 평일 오전 9시 KST
jobs:
  report:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Run Cortex Code Report
        env:
          SNOWFLAKE_ACCOUNT: ${{ secrets.SF_ACCOUNT }}
          SNOWFLAKE_TOKEN: ${{ secrets.SF_TOKEN }}
        run: cortex run $daily-report

실전 4 — Cortex Code vs Claude Code vs Kiro 선택 기준

┌──────────────┬─────────────────┬──────────────┬──────────────┐
│              │  Cortex Code    │  Claude Code │     Kiro     │
├──────────────┼─────────────────┼──────────────┼──────────────┤
│ 데이터 컨텍스트│ 네이티브 (스키마│ 없음 (MCP    │ 없음         │
│              │ RBAC 자동 인식) │ 설정 필요)   │              │
│ dbt 지원     │ GA (2026.02)    │ 일반 코드    │ 일반 코드    │
│ Airflow 지원 │ GA (2026.02)    │ 일반 코드    │ 일반 코드    │
│ 데이터 보안  │ Snowflake 경계  │ API 외부 전송│ Bedrock 경유 │
│ 비Snowflake  │ 제한적          │ 강점         │ AWS 스택     │
│ SWE-bench    │ 미공개          │ 87.6%        │ 미공개       │
│ 가격         │ Pay-as-you-go   │ $20/월~      │ $19/월       │
│ 오픈소스     │ ❌              │ ❌           │ ❌           │
└──────────────┴─────────────────┴──────────────┴──────────────┘

Cortex Code가 맞는 팀:

✅ Snowflake 중심 데이터 팀 (데이터 엔지니어, 애널리스트)
✅ dbt + Snowflake 프로덕션 파이프라인 운영 중
✅ 금융·의료·보험 — 데이터 외부 전송 금지 환경
✅ Snowflake Intelligence 에이전트 빌딩
✅ SQL/Python 데이터 워크로드 중심 (백엔드 코드 거의 없음)

Claude Code가 맞는 팀:

✅ 풀스택 개발 (백엔드 API, 프론트엔드, 인프라)
✅ Snowflake 외 다양한 DB/클라우드 혼합 환경
✅ 복잡한 멀티파일 자율 리팩토링
✅ SWE-bench 87.6% — 고복잡도 에이전트 태스크

현실적인 조합:

데이터 팀:
→ Cortex Code: SQL·dbt·데이터 파이프라인·Snowflake 관리
→ Claude Code: 데이터 앱 백엔드(FastAPI, Lambda), 복잡한 Python 로직

데이터 + 소프트웨어 혼합 팀:
→ Cortex Code: Snowflake 데이터 레이어
→ Kiro: AWS 인프라(CDK, Lambda) + 스펙 기반 기능 개발
→ Claude Code: 복잡한 자율 리팩토링

✅ 결론

데이터 엔지니어에게 Cortex Code CLI는 지금 당장 쓸 수 있는 가장 실용적인 AI 코딩 에이전트예요. dbt 모델 생성, 스키마 테스트 자동화, Airflow DAG 빌딩까지 Snowflake 컨텍스트 그대로 처리해요.

AGENTS.md + Agent Skills 조합으로 팀 표준을 강제할 수 있어요. Kiro의 Steering, Claude Code의 CLAUDE.md와 동일한 패턴이에요. Git에 커밋하면 팀 전체에 적용돼요.

Snowflake 밖 코드베이스 작업은 여전히 Claude Code나 Cursor가 더 나아요. React 프론트엔드, FastAPI 백엔드, 복잡한 Python 라이브러리 작업은 일반 AI 코딩 툴이 더 유연해요.

MCP, ACP, Plugins, Agent SDK는 아직 Preview예요. GA 전 API 변경 가능성이 있어서 프로덕션 크리티컬 파이프라인에 의존하기 이른 기능들이에요.


관련 글

반응형