셀프호스팅 AI 도구를 고객에게 팔 때 — n8n의 내부 업무 목적과 Open WebUI의 50명이 갈리는 자리
셀프호스팅 AI 도구 다섯 개의 라이선스 원문을 직접 받아 읽었어요. n8n은 용도로, Dify는 구성으로, Open WebUI는 브랜딩 제거에 인원 임계로 선을 그어요. 선의 종류가 서로 달라요.
AI 기술을 누구나 쉽게 활용할 수 있도록 실전 가이드를 작성합니다. ChatGPT, Claude, AI 자동화, SEO 분야를 전문으로 다룹니다.
GitHub Actions에 Claude Code Action을 붙이면 PR이 열릴 때마다 봇이 변경 사항을 읽고 인라인 코멘트를 달아줘요. 이슈 라벨링이나 테스트 실행까지 같은 워크플로에 얹을 수도 있고요.
문제는 비용이에요. "이거 켜뒀다가 요금 폭탄 맞는 거 아닌가" 싶어서 도입을 미루는 경우가 많은데, 실제로 비용이 튀는 상황은 대체로 turn 제한을 안 걸었거나, 캐싱을 안 켰거나, 콘솔에 상한을 안 걸어둔 것 셋 중 하나예요. 반대로 말하면 이 세 가지만 챙기면 예산이 통제 범위 안에 들어와요.
이 글은 5단계 셋업 + 안전장치 + 비용 절감 노하우를 순서대로 정리한 내용이에요. 요금은 수시로 바뀌니 구체적인 금액은 Anthropic 공식 요금 페이지를 기준으로 잡으세요.

금액을 외우는 것보다 어떤 항목이 비용을 밀어 올리는지 아는 게 훨씬 쓸모 있어요. 트리거 종류별 부담은 대략 이렇게 갈려요.
| 항목 | 상대적 비용 부담 | 통제 방법 |
|---|---|---|
| 평균 크기 PR 분석 (수백 라인) | 낮음 | 캐싱 활성화 |
| 대형 PR (수천 라인) | 높음 | PR 분할 가이드 |
| 보안 감사 트리거 | 높음 | 라벨 붙은 PR만 |
| 테스트 자동 작성 | 중간 | 필요한 PR에만 |
| GitHub Actions 빌드 시간 | 무료 (Public 레포) | 해당 없음 |
정리하면 비용의 대부분은 대형 PR과 깊은 분석 트리거에서 나와요. 평범한 리뷰는 캐싱만 켜두면 부담이 크지 않은 편이고요. 그래서 예산 관리의 핵심은 요금제 고르기가 아니라 "깊게 볼 PR을 어떻게 골라낼 것인가"예요.
판단 기준은 단순해요. 트리거 횟수가 적고 들쭉날쭉하면 쓴 만큼만 내는 API가 맞고, 매일 꾸준히 도는 팀이라면 금액이 고정되는 구독이 예산 짜기 편해요. 구독제는 rate limit이 걸리는 대신 추가 청구 걱정이 없다는 점이 장점이고요.
순서를 추천하자면 첫 달은 API로 시작해서 실제 사용 패턴을 재보고, 그 데이터를 근거로 구독 전환을 판단하는 방식이 안전해요. 감으로 요금제부터 고르면 과하게 결제하거나 반대로 한도에 계속 걸리기 쉬워요. 각 요금제의 실제 금액과 한도는 도입 시점에 공식 페이지에서 직접 확인하세요.
claude.ai 콘솔 → API Keys → "Create Key" 누르고 'github-actions-pr-review-bot' 같은 명확한 이름. 권한은 최소한으로 — Read/Write 만, Admin 안 줌.
발급 즉시:
ANTHROPIC_API_KEY, 값 붙여넣기name: Claude PR Review
on:
pull_request:
types: [opened, synchronize, ready_for_review]
branches: [main, develop]
jobs:
review:
runs-on: ubuntu-latest
if: github.event.pull_request.draft == false
permissions:
contents: read
pull-requests: write
issues: write
environment: production
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Claude Code Review
uses: anthropics/claude-code-action@v1
with:
anthropic_api_key: secrets.ANTHROPIC_API_KEY
# 모델 ID는 Anthropic 공식 문서에서 최신 값을 확인해 채우세요
model: MODEL_ID
max-turns: 8
system-prompt: |
너는 코드 리뷰 전문가야.
PR 변경 사항을 7가지 관점에서 분석하고 인라인 코멘트 작성:
1. 잠재적 버그
2. 타입 안전성
3. 테스트 커버리지
4. 성능 회귀
5. 보안 위험
6. 코드 스타일
7. 비즈니스 로직 모순
prompt: |
이 PR을 리뷰하고 인라인 코멘트 작성해줘.
심각도 상 5개 이상이면 'changes-requested' 리뷰,
그 외는 'commented' 리뷰로 마무리.
주의: 위 YAML 의 secrets.ANTHROPIC_API_KEY 부분은 GitHub 표준 표현식 문법 (대괄호 둘러싸인 문법) 인데, 이 글에서 마크다운 렌더링 문제로 단순 표기. 실제 작성 시엔 표준 시크릿 참조 문법 사용하세요.
.github/CODEOWNERS 파일:
# 모든 PR 에 Claude 봇이 코드 리뷰 어사인
* @claude-bot
# 보안 민감 영역은 사람도 추가
src/auth/ @claude-bot @senior-dev
src/payment/ @claude-bot @senior-dev @cto
이렇게 두면 PR 오픈 시 자동으로 Claude 봇 어사인 + 사람 리뷰어도 자동.
특정 라벨일 때만 깊은 분석. .github/workflows/deep-review.yml:
name: Claude Deep Security Review
on:
pull_request:
types: [labeled]
jobs:
security:
if: github.event.label.name == 'security-review'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: anthropics/claude-code-action@v1
with:
anthropic_api_key: secrets.ANTHROPIC_API_KEY
# 모델 ID는 Anthropic 공식 문서에서 최신 값을 확인해 채우세요
model: MODEL_ID
max-turns: 15
system-prompt: |
너는 보안 감사 전문가.
OWASP Top 10 기준 + 최신 CVE 검토.
prompt: 이 PR 의 보안 취약점 5가지 깊이 분석.
라벨 'security-review' 붙은 PR 만 깊은 분석. 평소엔 단순 리뷰만, 큰 변경에만 보안 감사.
PR 자동 리뷰 결과를 별도 레포 claude-review-logs 에 저장:
- name: Save Review Log
if: always()
uses: actions/upload-artifact@v4
with:
name: review-${{ github.event.pull_request.number }}
path: review-output.json
retention-days: 90
매주 1번 메트릭 집계: 처리 PR 수·평균 코멘트 수·발견 이슈 심각도 분포·자동 머지 비율·비용 합계. 이걸로 운영 효율 추적.

리뷰마다 같은 코드베이스를 통째로 다시 보내면, 실제로 바뀐 건 몇십 라인인데 입력 토큰은 매번 최대치로 잡혀요. 비용이 튀는 지점이 대체로 여기예요. prompt caching을 켜두면 첫 호출에서 캐시를 만들고 이후 호출은 캐시를 읽는 방식이라 반복되는 부분의 입력 부담이 줄어들어요. 캐시 쓰기·읽기 단가 배수와 캐시 유지 시간은 Anthropic 공식 문서 기준으로 확인하세요.
Claude Code Action 은 자동으로 cache 적용하지만, 직접 API 호출 시 명시 필요:
system=[{
"type": "text",
"text": codebase_content,
"cache_control": {"type": "ephemeral"}
}]
같은 ai-blog의 Claude AI 키워드 분석 블로그 글 최적화 에서도 캐싱 활용 사례 다뤘는데, 코드 리뷰 자동화에서도 동일 원리예요.
값을 비워두면 액션 기본 동작을 그대로 따라가서, 무한 루프나 과도한 분석으로 이어질 여지가 있어요. PR 리뷰는 5~10턴이면 충분하니 명시적으로 걸어두세요.
2000라인 넘는 PR은 비용 + 분석 품질 둘 다 떨어져요. 의뢰인(개발자)에게 "PR 500 라인 이하로 쪼개주세요" 가이드 PR 템플릿에 명시.
평범한 리팩터링 PR까지 보안 감사를 돌리면, turn 수도 늘고 읽는 파일 범위도 넓어져서 같은 PR인데 비용 부담이 훨씬 커져요. 라벨 'security-review' / 'deep-review' 붙은 PR만 깊게 보도록 분기하세요.
긴급하지 않은 PR(의존성 업데이트·문서 수정)은 batch mode로 돌려도 충분해요. Anthropic의 Message Batches API는 즉시 응답 대신 비동기로 처리하는 대신 단가가 낮게 책정돼 있어요. 할인 폭과 결과 보장 시간은 공식 문서 기준으로 확인하시고, "리뷰가 몇 시간 늦어도 되는 PR"을 골라내는 게 핵심이에요.
batch = client.messages.batches.create(
requests=[{...}, {...}, ...]
)
코드·로그·디스코드·이메일 절대 X. .env 파일에 적었다가 commit 사고 흔함. .gitignore 에 .env* 추가 + git pre-commit hook 으로 secret 패턴 검출.
본인 개인 ANTHROPIC_API_KEY 와 봇용 분리. 봇용은 claude.ai 콘솔에서 별도 발급. 사고 시 봇 키만 회수, 본인 작업 영향 0.
jobs:
review:
environment: production
environment: production 명시하면 GitHub UI에서 "production environment 의 secrets" 만 접근. 다른 환경(staging)에서 이 secret 못 쓰게 격리.
set -x 또는 echo $ANTHROPIC_API_KEY 같은 디버그 코드 사고 방지. 의심스러우면 ::add-mask:: 으로 마스킹.
claude.ai 콘솔 → Settings → Spending limits:
설정을 잘못 걸어 호출이 폭주하더라도, 상한선이 있으면 피해가 그 금액에서 끊겨요. 안전장치 중에 품이 가장 적게 드는 항목이니 도입 첫날 바로 걸어두세요.
턴 수를 안 걸면 한 번의 리뷰가 어디까지 늘어날지 예측이 안 돼요. 8~10 으로 명시 필수.
상한이 없으면 잘못된 트리거 하나가 그대로 청구로 이어져요. 콘솔에서 한도 설정만 해둬도 사고 대부분이 막혀요.
평범한 리팩터링까지 보안 감사를 돌리면 turn 수와 읽는 파일 범위가 함께 늘어 비용이 불필요하게 커져요. 라벨로 분기하세요.
.bashrc 에 export ANTHROPIC_API_KEY=... 두면 자식 프로세스 모두 상속. claude -p 같은 CLI 실수로 폭주 가능. GitHub Secrets만.
.dockerignore·.gitignore 에 secrets 파일 패턴 명시. PR diff 에 포함되면 Claude가 그대로 분석에 쓰면서 로그·결과에 노출 위험.
남의 숫자를 가져다 쓰면 우리 레포에서 그대로 재현되지 않아요. 코드베이스 크기·PR 문화·팀 규모가 전부 다르기 때문이에요. 그래서 도입 첫 달에는 아래 항목을 직접 기록해서 본인 기준선을 만드는 게 맞아요.
이 중에서 하나만 본다면 코멘트 채택률을 보세요. 코멘트 수가 아무리 많아도 개발자가 전부 무시하면 비용만 나가는 거예요. 채택률이 낮으면 모델을 바꾸기 전에 system-prompt의 관점 목록부터 손보는 게 순서예요. 팀이 실제로 자주 놓치는 항목만 남기고 나머지는 빼는 식으로요.
측정 주기는 주 1회면 충분해요. 5단계에서 만든 아티팩트 로그를 그대로 집계하면 별도 작업 없이 숫자가 쌓여요. 같은 ai-blog의 n8n + Claude API 자동화 5단계 에서 다룬 지표 수집 방식도 같은 원리로 응용할 수 있어요.
모든 레포에 필요한 건 아니에요. 도입 전에 한 번 걸러보세요.
잘 맞는 경우
안 맞는 경우
특히 마지막 항목을 조심하세요. 봇이 'changes-requested'를 남발하면 개발자들이 리뷰 자체를 무시하기 시작하고, 그러면 자동화가 오히려 방해물이 돼요. 처음에는 'commented' 수준으로만 두고, 팀이 코멘트 품질을 신뢰하게 된 뒤에 강도를 올리는 걸 권해요.
5단계 셋업 익숙해지면 다음 확장:
확장할수록 트리거가 늘어나는 만큼 비용도 같이 올라가니, 하나 켤 때마다 콘솔 사용량을 확인하고 다음 단계로 넘어가세요. 같은 ai-blog의 Claude Code 자동화 5가지 실전 사용기 와 함께 보면 전체 자동화 흐름 잡기 쉬워요.
처음엔 단순 PR 리뷰 1단계만 켜고 한 달 데이터 쌓아보세요. 비용 패턴 + 정확도 둘 다 검증되면 단계별 확장. 처음부터 다 켜면 디버깅 어려워서 결국 다 끄는 사례 많아요.
정해진 금액이 있는 게 아니라 변수에 따라 달라져요. 비용을 좌우하는 건 ① PR 하나의 변경 라인 수 ② prompt caching 사용 여부 ③ max-turns 설정값 ④ 보안 감사처럼 깊은 분석을 몇 번 돌리는지, 이 네 가지예요. 작은 PR 위주에 캐싱까지 켜두면 부담이 크지 않은 편이고, 큰 PR이 몰리거나 turn 제한을 안 걸면 금액이 빠르게 불어나요. 정확한 단가와 최신 요금은 Anthropic 공식 요금 페이지에서 확인하고, 첫 달은 콘솔의 사용량 대시보드로 실제 패턴을 직접 재보는 걸 권해요.
트리거 빈도에 따라 달라요. PR 수가 적으면 쓴 만큼만 내는 API가 대체로 유리하고, 트리거가 늘어날수록 정액 구독이 예측 가능해서 편해요. 구독제는 API 호출이 요금에 포함돼 추가 청구가 없는 대신 rate limit이 걸리니, 일과 시간에 PR이 몰리는 팀은 API로 분산하는 편이 나을 수 있어요. 요금제별 금액과 한도는 수시로 바뀌므로 결정 전에 공식 요금 페이지를 확인하세요.
5가지 장치 모두 적용. ① GitHub Secrets에만 저장 (코드·로그·디스코드 절대 X) ② API 키 권한을 'PR 자동 리뷰 봇' 전용으로 분리, claude.ai 콘솔에서 한도 설정 ③ Workflow 의 environment에 한정 (environment: production ) — 분기별 키 로테이션 ④ Workflow 로그 verbose 끄기 (echo $API_KEY 같은 사고 방지) ⑤ Anthropic 콘솔에서 'Spending limits' $100/월 설정 — 폭주 시 자동 차단. 이 5개 갖춰지면 사고 위험 거의 0.
claude-code-action 의 max-turns 파라미터로 설정. PR 리뷰엔 보통 5~10이 적절. 5 미만 = 분석 부족. 15 이상 = 무한 루프·과도 분석 위험. 설정 예: max-turns: 8. 작업 성격별 추천 — 단순 코드 리뷰 5, 보안 감사 12, 리팩터링 제안 10, 테스트 작성 7. 값을 아예 안 적으면 액션이 정한 기본 동작을 따르게 되는데, 그 기본값이 우리 레포에 맞는다는 보장이 없으니 항상 명시하는 편이 안전해요.
공식 Claude Code Action 추천. 직접 API 호출 대비 ① 인증·secrets 자동 처리 ② PR 컨텍스트 자동 수집 ③ 인라인 코멘트 작성 자동 ④ 에러 핸들링 검증됨. 직접 작성 시 같은 기능 만드는 데 200~300줄 코드. 단 매우 커스텀한 워크플로우(예: 특정 라벨 + 특정 파일 변경 시만 트리거)는 직접 호출이 유연함.