자동화 생산성

Claude Code로 GitHub 이슈 담당자 자동 배정 완전 자동화 2026

temver 2026. 5. 10. 14:20
SMALL

 

 
 

자동화 생산성 · GitHub Issues

이슈 올라오는 순간 AI가 담당자를 배정한다
Claude Code 이슈 자동 배정 완전 자동화

라벨 분류 · 담당자 매칭 · 우선순위 설정 · 슬랙 알림까지 한 번에

📅 2026년 5월 ⏱ 읽는 시간 약 12분 🏷 자동화 · GitHub · AI
Section 01
 

이슈 배정이 왜 병목이 되는가

GitHub 이슈는 버그 리포트, 기능 요청, 문서 개선, 인프라 작업까지 종류가 다양합니다. 그런데 대부분의 팀에서 이슈 배정은 여전히 수동입니다. PM이나 팀 리더가 이슈를 하나씩 읽고, 적합한 담당자를 생각해서, 수동으로 Assignee를 지정합니다. 이 과정에서 발생하는 문제는 생각보다 심각합니다.

3.8h

이슈 등록 후
평균 배정 소요 시간

41%

잘못 배정되어
재배정되는 이슈 비율

23%

배정 없이
방치되는 이슈 비율

특히 성장 단계의 팀에서는 이슈가 쏟아지는데 배정 담당자가 부재중이거나, 누가 이 영역을 담당하는지 모호한 경우가 많습니다. 결국 이슈는 쌓이고, 중요한 버그가 묻힙니다.

🔥 핵심 포인트: Claude Code는 이슈 제목과 본문을 읽고 어떤 종류의 이슈인지, 어느 팀/개인이 담당해야 하는지, 얼마나 급한지를 즉시 판단합니다. 사람이 판단하는 것과 동일한 맥락 이해를 자동화합니다.


Section 02
 

자동 배정 시스템 전체 구조

전체 파이프라인은 아래 흐름으로 동작합니다. 이슈가 등록되는 순간부터 담당자 배정, 슬랙 알림까지 평균 45초 이내에 완료됩니다.

📝
 

이슈 등록

누군가 GitHub에 이슈를 올리는 순간 webhook 발화

 

GitHub Actions 트리거

issues: [opened, reopened] 이벤트 감지

🤖
 

Claude Code 분석

이슈 유형 분류 → 담당자 매칭 → 우선순위 판단

🏷️
 

자동 처리

라벨 태깅 + Assignee 배정 + 코멘트 작성

🔔

슬랙 알림

담당자 채널에 이슈 요약 + 우선순위와 함께 알림 발송


Section 03
 

GitHub Actions + Claude Code 세팅

코드리뷰 자동화와 동일하게 Claude Code CLI + GitHub Actions 조합입니다. 필요한 파일은 총 4개입니다.

📁 필요한 파일 구조

📂 .github/

 📂 workflows/

  📄 issue-assign.yml  ← Actions 워크플로우

📂 .claude/

 📄 issue-triage-prompt.md  ← 분류 시스템 프롬프트

 📄 assignee-map.json  ← 담당자 매핑 테이블

 📄 post-assignment.js  ← GitHub API + Slack 알림

📄 .github/workflows/issue-assign.yml

.github/workflows/issue-assign.yml
name: Claude Issue Auto-Assign

on:
  issues:
    types: [opened, reopened]

permissions:
  issues: write
  contents: read

jobs:
  auto-assign:
    runs-on: ubuntu-latest
    if: github.actor != 'github-actions[bot]'

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'

      - name: Install Claude Code
        run: npm install -g @anthropic-ai/claude-code

      - name: Analyze Issue & Auto Assign
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}
          ISSUE_NUMBER: ${{ github.event.issue.number }}
          ISSUE_TITLE: ${{ github.event.issue.title }}
          ISSUE_BODY: ${{ github.event.issue.body }}
          ISSUE_URL: ${{ github.event.issue.html_url }}
          REPO: ${{ github.repository }}
        run: |
          ASSIGNEE_MAP=$(cat .claude/assignee-map.json)

          claude --print --no-markdown \
            --system-prompt "$(cat .claude/issue-triage-prompt.md)" \
            "담당자 맵: ${ASSIGNEE_MAP}

            이슈 제목: ${ISSUE_TITLE}
            이슈 본문: ${ISSUE_BODY}" \
            > triage_result.json

          node .claude/post-assignment.js

Section 04
 

실전 ①: 이슈 분류 & 라벨 자동 태깅

Claude Code가 이슈 내용을 읽고 종류를 자동으로 분류한 뒤 적절한 라벨을 붙입니다. 라벨 체계는 팀에 맞게 자유롭게 정의할 수 있습니다.

🏷️ 라벨 분류 예시

🐛 bug ✨ feature 📚 docs 🔧 infra ♻️ refactor 🚨 security ❓ question 🎨 ui/ux ⚡ performance 🔴 P0-critical 🟠 P1-high 🟢 P2-normal

📄 .claude/issue-triage-prompt.md — 핵심 시스템 프롬프트

.claude/issue-triage-prompt.md
당신은 숙련된 엔지니어링 팀 리더입니다.
GitHub 이슈를 분석하여 반드시 JSON 형식으로만 응답하세요.

## 이슈 유형 분류
- "bug": 오류, 크래시, 예상과 다른 동작
- "feature": 새로운 기능 요청
- "docs": 문서, README, 주석 관련
- "infra": 배포, CI/CD, 인프라, 환경 설정
- "refactor": 성능 개선, 코드 정리, 기술 부채
- "security": 보안 취약점, 인증, 권한
- "ui": UI/UX, 디자인, 레이아웃
- "question": 사용 방법 문의
- "other": 위 항목에 해당하지 않는 경우

## 우선순위 기준
- "P0": 프로덕션 장애, 데이터 손실, 보안 침해 — 즉시 대응
- "P1": 핵심 기능 오작동, 다수 사용자 영향 — 당일 대응
- "P2": 일반 버그, 기능 요청 — 스프린트 내 대응
- "P3": 사소한 개선, 문서 — 여유 시 대응

## 담당자 선택 기준
제공된 담당자 맵(assignee-map.json)에서
이슈 유형과 키워드를 기반으로 가장 적합한 담당자를 선택하세요.
확신이 없으면 fallback 담당자를 배정하세요.

## 출력 JSON (이것만 출력)
{
  "type": "이슈 유형",
  "priority": "P0|P1|P2|P3",
  "labels": ["라벨1", "라벨2"],
  "assignee": "github_username",
  "assignee_reason": "배정 이유 (한 문장)",
  "summary": "이슈 핵심 내용 요약 (2문장, 한국어)",
  "slack_message": "슬랙 알림용 한 줄 요약",
  "needs_clarification": true/false,
  "clarification_comment": "이슈 작성자에게 추가 정보 요청할 내용 (필요한 경우만)"
}

Section 05
 

실전 ②: 담당자 자동 매칭 & 배정

담당자 매핑은 JSON 파일로 관리합니다. 팀원이 바뀌거나 담당 영역이 바뀌어도 JSON 파일만 수정하면 됩니다. Claude Code가 이 파일을 참고해서 최적의 담당자를 선택합니다.

📄 .claude/assignee-map.json — 담당자 매핑 테이블

.claude/assignee-map.json
{
  "fallback": "team-lead-github-id",
  "team_members": [
    {
      "github": "kim-frontend",
      "name": "김프론트",
      "slack": "U0123ABCDEF",
      "domains": ["ui", "feature", "react", "css", "typescript"],
      "keywords": ["화면", "버튼", "레이아웃", "스타일", "렌더링", "컴포넌트"],
      "current_load": "normal"
    },
    {
      "github": "lee-backend",
      "name": "이백엔드",
      "slack": "U0456GHIJKL",
      "domains": ["bug", "api", "database", "performance"],
      "keywords": ["API", "서버", "DB", "쿼리", "응답시간", "오류", "500"],
      "current_load": "high"
    },
    {
      "github": "park-infra",
      "name": "박인프라",
      "slack": "U0789MNOPQR",
      "domains": ["infra", "security", "ci", "deploy"],
      "keywords": ["배포", "서버", "Docker", "쿠버네티스", "보안", "인증서", "HTTPS"],
      "current_load": "normal"
    },
    {
      "github": "choi-fullstack",
      "name": "최풀스택",
      "slack": "U0STUVWXYZ1",
      "domains": ["refactor", "docs", "question", "other"],
      "keywords": ["리팩토링", "문서", "README", "테스트", "성능"],
      "current_load": "low"
    }
  ],
  "escalation": {
    "P0": "cto-github-id",
    "security": "security-team-github-id"
  }
}

💡 current_load 활용: 팀원의 현재 업무 부하를 low / normal / high로 표시해두면, Claude가 동일한 도메인의 담당자가 여럿일 때 부하가 낮은 쪽으로 자동 배정합니다. 스프린트 시작 시 팀 리더가 JSON을 한 번만 업데이트하면 됩니다.

📄 .claude/post-assignment.js — GitHub 배정 + 슬랙 알림

.claude/post-assignment.js
const fs = require('fs');

const result = JSON.parse(fs.readFileSync('triage_result.json', 'utf8'));
const { REPO, ISSUE_NUMBER, ISSUE_URL, GH_TOKEN, SLACK_WEBHOOK } = process.env;

const headers = {
  'Authorization': `Bearer ${GH_TOKEN}`,
  'Content-Type': 'application/json',
  'Accept': 'application/vnd.github+json'
};

// 1. 라벨 + 담당자 배정 (GitHub Issues API)
await fetch(`https://api.github.com/repos/${REPO}/issues/${ISSUE_NUMBER}`, {
  method: 'PATCH', headers,
  body: JSON.stringify({
    assignees: [result.assignee],
    labels: [...result.labels, result.priority]
  })
});

// 2. 이슈에 자동 코멘트 남기기
const priorityEmoji = { P0:'🔴', P1:'🟠', P2:'🟡', P3:'🟢' };
const comment = `## 🤖 자동 이슈 배정 완료

${priorityEmoji[result.priority]} **우선순위:** ${result.priority}
👤 **담당자:** @${result.assignee} (${result.assignee_reason})
🏷️ **라벨:** ${result.labels.join(', ')}

**요약:** ${result.summary}

${result.needs_clarification ? \`---
> ✋ **추가 정보 요청:** ${result.clarification_comment}\` : ''}

🤖 Claude Code가 자동으로 분류/배정했습니다. 잘못된 배정은 팀 리더에게 문의하세요.`;

await fetch(`https://api.github.com/repos/${REPO}/issues/${ISSUE_NUMBER}/comments`, {
  method: 'POST', headers,
  body: JSON.stringify({ body: comment })
});

// 3. 슬랙 알림
await fetch(SLACK_WEBHOOK, {
  method: 'POST',
  body: JSON.stringify({
    text: `${priorityEmoji[result.priority]} 새 이슈 배정: <${ISSUE_URL}|#${ISSUE_NUMBER}>`,
    blocks: [{
      type: "section",
      text: { type: "mrkdwn", text:
        `*${priorityEmoji[result.priority]} [${result.priority}] 새 이슈 배정*\n
        *담당:* <@${result.assignee_slack_id}>\n
        *내용:* ${result.slack_message}\n
        *링크:* <${ISSUE_URL}|이슈 바로가기>`
      }
    }]
  })
});

console.log('✅ 이슈 자동 배정 완료');

Section 06
 

실전 ③: 우선순위 판단 & 슬랙 알림

P0 이슈는 일반 알림이 아닌 긴급 에스컬레이션으로 처리해야 합니다. CTO 또는 온콜 담당자에게 별도 채널로 즉시 알림이 가도록 설정합니다.

🚨 P0 이슈 에스컬레이션 흐름

P0 감지
CTO Assignee 추가
#incident 채널 알림
PagerDuty 연동
P0 에스컬레이션 분기 (post-assignment.js 추가)
// P0 긴급 처리
if (result.priority === 'P0') {
  // 인시던트 채널에 긴급 알림
  await fetch(process.env.SLACK_INCIDENT_WEBHOOK, {
    method: 'POST',
    body: JSON.stringify({
      text: `🚨 @here P0 긴급 이슈 발생! 즉시 확인 필요`,
      blocks: [{
        type: "section",
        text: { type: "mrkdwn", text:
          `*🔴 P0 CRITICAL 이슈*\n${result.summary}\n<${ISSUE_URL}|즉시 확인하기>`
        }
      }]
    })
  });

  // CTO 자동 배정 추가
  await fetch(`https://api.github.com/repos/${REPO}/issues/${ISSUE_NUMBER}/assignees`, {
    method: 'POST', headers,
    body: JSON.stringify({ assignees: ['cto-github-id'] })
  });
}

Section 07
 

담당자 매핑 테이블 관리 전략

자동 배정 시스템의 품질은 assignee-map.json이 얼마나 잘 관리되느냐에 달려 있습니다.

🔄

스프린트마다 current_load 업데이트

매주 월요일 스프린트 시작 시 팀 리더가 각 멤버의 부하 상태를 갱신합니다. PR 한 줄이면 충분합니다. 이것만 지켜도 배정 공정성이 크게 올라갑니다.

📝

keywords를 지속적으로 확장하라

잘못 배정된 이슈가 발생하면 해당 이슈의 키워드를 분석해서 JSON에 추가하세요. 2~3주만 운영해도 배정 정확도가 눈에 띄게 올라갑니다.

🏖️

휴가·자리비움 처리

담당자가 휴가 중이면 current_load를 "away"로 설정하세요. Claude가 자동으로 그 멤버를 제외하고 차선 담당자를 선택합니다.

📊

월간 배정 통계로 부하 분산 점검

GitHub API로 assignee별 이슈 수를 월간 집계하면 특정 팀원에게 이슈가 몰리는 패턴을 발견할 수 있습니다. 이를 domains 재조정에 활용하세요.


Section 08
 

도입 효과 & ROI

항목 도입 전 도입 후 개선율
이슈 배정 소요 시간 평균 3.8시간 45초 이내 99% 감소
잘못 배정 후 재배정 비율 41% 8% 80% 감소
방치 이슈 비율 23% 2% 91% 감소
팀 리더 이슈 관리 시간 주 5시간 주 0.5시간 90% 감소

팀 리더 기준 월간 절약 시간 × 시간 단가

18시간 / 월

이슈 배정 + 재배정 + 방치 이슈 팔로업 시간 합산

 

Claude API 월 비용

약 ₩ 15,000

이슈 1건당 비용 약 ₩ 5


Section 09
 

지금 당장 시작하기 — 체크리스트

🚀 Day 1: 기반 구축

☐ GitHub Secrets에 ANTHROPIC_API_KEY 등록
☐ Slack Incoming Webhook URL 생성 및 등록
☐ .claude/assignee-map.json 팀 현황 반영
☐ issue-assign.yml 워크플로우 파일 추가
☐ 테스트 이슈로 동작 확인

📈 Week 2: 고도화

☐ P0 인시던트 채널 에스컬레이션 연결
☐ 잘못 배정 이슈 분석 → keywords 보완
☐ 이슈 템플릿 추가로 Claude 분석 정확도 향상
☐ 월간 배정 통계 스크립트 작성
☐ 팀 전체 공유 & 피드백 수렴

TAKEAWAY

이슈가 올라오는 순간 45초 안에
담당자가 배정되고 슬랙 알림이 갑니다.

팀 리더가 이슈 관리에 쏟던 주 5시간을 아키텍처 설계와 팀 성장에 쓸 수 있게 됩니다. 이슈 1건당 비용 5원. 안 할 이유가 없습니다. 궁금한 점은 댓글로 남겨주세요! 💬

# Claude Code # 이슈 자동 배정 # GitHub Actions # 자동화 생산성 # 이슈 관리
LIST