Ch4. 서브에이전트 활용
context-gatherer·general-task-execution 서브에이전트로 컨텍스트 수집과 병렬·단계별 작업을 실행하고, v0.9 Custom Subagents·Agent Skills로 역할별 에이전트를 구성하는 법
핵심 요약
- 서브에이전트는 메인 세션과 독립된 컨텍스트로 실행되는 보조 에이전트로,
invokeSubAgent()로 호출합니다. - 기본 타입은 리포 구조·관련 파일을 찾는
context-gatherer와 독립 작업을 수행하는general-task-execution입니다. - 컨텍스트를 먼저 모은 뒤 작업하기, Promise.all 병렬 처리, 단계별 분할 패턴으로 복잡한 작업을 효율적으로 풉니다.
- v0.9 Custom Subagents(
.kiro/agents/*.json로 steering·tools·model 지정)와 agentskills.io 기반 Agent Skills(progressive disclosure)를 지원합니다. - 서브에이전트는 Autopilot 모드에서만 동작하고, 컨텍스트가 분리돼 있어 메인 세션의 이전 대화를 직접 참조하지 못합니다.
서브에이전트는 Kiro의 전문화된 보조 에이전트입니다. 메인 세션과 따로 돌아가면서 맡은 작업을 처리하고 결과를 돌려줍니다. 복잡한 작업을 잘게 나누거나 한꺼번에 처리할 때 유용합니다.
서브에이전트 종류
context-gatherer
리포지토리 구조를 분석하고 관련 파일들을 식별합니다.
// 사용 예시
invokeSubAgent({
name: "context-gatherer",
prompt: "사용자 인증 관련 버그를 조사하기 위해 관련 파일들을 찾아주세요",
explanation: "인증 시스템의 구조를 파악하여 버그 수정에 필요한 컨텍스트 수집"
})general-task-execution
일반적인 작업을 독립적으로 실행합니다.
// 사용 예시
invokeSubAgent({
name: "general-task-execution",
prompt: "API 문서를 생성하고 README에 추가해주세요",
explanation: "API 문서 생성 작업을 별도 컨텍스트에서 실행"
})서브에이전트 활용 패턴
1. 컨텍스트 수집 후 작업
1단계: context-gatherer로 관련 파일 식별
2단계: 메인 에이전트에서 수정 작업 수행예시: 버그 수정 워크플로우
// 1단계: 컨텍스트 수집
const context = await invokeSubAgent({
name: "context-gatherer",
prompt: "로그인 실패 시 에러 메시지가 표시되지 않는 버그와 관련된 파일들을 찾아주세요",
explanation: "로그인 에러 처리 관련 코드 구조 파악"
});
// 2단계: 메인 에이전트에서 버그 수정
// context 결과를 바탕으로 관련 파일들을 수정2. 병렬 작업 처리
// 동시에 여러 작업 실행
const [docs, tests, types] = await Promise.all([
invokeSubAgent({
name: "general-task-execution",
prompt: "API 문서 생성",
explanation: "API 엔드포인트 문서화"
}),
invokeSubAgent({
name: "general-task-execution",
prompt: "단위 테스트 작성",
explanation: "새로운 기능에 대한 테스트 코드 작성"
}),
invokeSubAgent({
name: "general-task-execution",
prompt: "TypeScript 타입 정의",
explanation: "API 응답 타입 정의 생성"
})
]);3. 단계별 작업 분할
// 복잡한 기능을 단계별로 분할
const step1 = await invokeSubAgent({
name: "general-task-execution",
prompt: "데이터베이스 스키마 설계",
explanation: "새로운 기능을 위한 DB 스키마 작성"
});
const step2 = await invokeSubAgent({
name: "general-task-execution",
prompt: "API 엔드포인트 구현",
explanation: "스키마 기반 API 로직 구현"
});
const step3 = await invokeSubAgent({
name: "general-task-execution",
prompt: "프론트엔드 컴포넌트 작성",
explanation: "API를 사용하는 UI 컴포넌트 구현"
});실전 활용 사례
사례 1: 새로운 기능 개발
// 1. 요구사항 분석 및 설계
const analysis = await invokeSubAgent({
name: "context-gatherer",
prompt: "사용자 프로필 편집 기능과 관련된 기존 코드들을 분석해주세요",
explanation: "기존 사용자 관리 시스템 구조 파악"
});
// 2. 백엔드 API 개발
const backend = await invokeSubAgent({
name: "general-task-execution",
prompt: "사용자 프로필 편집 API 엔드포인트를 구현해주세요",
explanation: "프로필 업데이트 API 로직 구현"
});
// 3. 프론트엔드 컴포넌트 개발
const frontend = await invokeSubAgent({
name: "general-task-execution",
prompt: "프로필 편집 폼 컴포넌트를 작성해주세요",
explanation: "사용자 인터페이스 구현"
});
// 4. 테스트 코드 작성
const tests = await invokeSubAgent({
name: "general-task-execution",
prompt: "프로필 편집 기능에 대한 통합 테스트를 작성해주세요",
explanation: "기능 검증을 위한 테스트 코드 작성"
});사례 2: 코드 리팩토링
// 1. 리팩토링 대상 분석
const analysis = await invokeSubAgent({
name: "context-gatherer",
prompt: "레거시 인증 시스템과 관련된 모든 파일들을 찾아주세요",
explanation: "리팩토링 범위 파악을 위한 코드 분석"
});
// 2. 새로운 아키텍처 설계
const architecture = await invokeSubAgent({
name: "general-task-execution",
prompt: "현대적인 JWT 기반 인증 시스템 아키텍처를 설계해주세요",
explanation: "새로운 인증 시스템 구조 설계"
});
// 3. 단계별 마이그레이션
const migration = await invokeSubAgent({
name: "general-task-execution",
prompt: "기존 시스템과 호환되는 마이그레이션 계획을 수립해주세요",
explanation: "무중단 마이그레이션 전략 수립"
});사례 3: 버그 수정
// 1. 버그 관련 코드 탐색
const bugContext = await invokeSubAgent({
name: "context-gatherer",
prompt: "결제 실패 시 사용자에게 알림이 가지 않는 버그와 관련된 파일들을 찾아주세요",
explanation: "결제 알림 시스템 관련 코드 구조 파악"
});
// 2. 근본 원인 분석
const rootCause = await invokeSubAgent({
name: "general-task-execution",
prompt: "결제 알림 시스템의 로직을 분석하고 버그의 원인을 찾아주세요",
explanation: "버그 발생 원인 분석"
});
// 3. 수정 및 테스트
const fix = await invokeSubAgent({
name: "general-task-execution",
prompt: "버그를 수정하고 관련 테스트 케이스를 추가해주세요",
explanation: "버그 수정 및 재발 방지 테스트 작성"
});서브에이전트 모범 사례
1. 적절한 작업 분할
// ✅ 좋은 예: 명확한 단일 책임
await invokeSubAgent({
name: "general-task-execution",
prompt: "사용자 인증 미들웨어만 구현해주세요",
explanation: "인증 로직만 집중적으로 구현"
});
// ❌ 나쁜 예: 너무 광범위한 작업
await invokeSubAgent({
name: "general-task-execution",
prompt: "전체 사용자 관리 시스템을 구현해주세요",
explanation: "범위가 너무 넓어 효과적이지 않음"
});2. 컨텍스트 활용
// ✅ 좋은 예: context-gatherer 결과 활용
const context = await invokeSubAgent({
name: "context-gatherer",
prompt: "API 라우팅 관련 파일들을 찾아주세요"
});
// context 결과를 바탕으로 구체적인 작업 수행
await invokeSubAgent({
name: "general-task-execution",
prompt: `${context.result}를 참고하여 새로운 API 엔드포인트를 추가해주세요`
});3. 독립성 보장
// ✅ 좋은 예: 독립적으로 실행 가능한 작업
await invokeSubAgent({
name: "general-task-execution",
prompt: "README 파일을 업데이트하고 설치 가이드를 추가해주세요",
explanation: "문서 업데이트는 독립적으로 수행 가능"
});Custom Subagents (v0.9+)
v0.9부터 역할별 커스텀 서브에이전트를 정의할 수 있습니다.
// .kiro/agents/frontend-agent.json
{
"name": "frontend-specialist",
"description": "React/Next.js 프론트엔드 전문 에이전트",
"steering": [".kiro/steering/frontend/*.md"],
"tools": ["file_edit", "shell_command", "web_search"],
"model": "claude-sonnet-4-6"
}활용 예시
| 커스텀 에이전트 | 역할 | 전문 영역 |
|---|---|---|
frontend-specialist | 프론트엔드 개발 | React, CSS, 접근성 |
backend-specialist | 백엔드 개발 | API, DB, 인증 |
test-engineer | 테스트 작성 | 단위/통합/E2E 테스트 |
docs-writer | 문서화 | README, API 문서 |
Agent Skills (v0.9+)
agentskills.io 표준을 따르는 모듈형 스킬 패키지를 서브에이전트에 붙일 수 있습니다. Progressive disclosure 방식이라 필요한 스킬만 켜서 컨텍스트를 아낍니다.
// .kiro/agents/review-agent.json
{
"name": "code-reviewer",
"skills": ["security-audit", "performance-review", "accessibility-check"],
"progressiveDisclosure": true
}주의사항
Autopilot 모드 필요
서브에이전트는 Autopilot 모드에서만 사용할 수 있습니다.
컨텍스트 제한
각 서브에이전트는 컨텍스트가 따로 분리돼 있어서 메인 세션의 이전 대화 내용을 직접 참조할 수 없습니다.
참고 문서
- Kiro 공식 사이트: https://kiro.dev
- Custom Subagents 블로그: https://kiro.dev/blog/custom-subagents-skills-and-enterprise-controls/
- Kiro 문서: https://kiro.dev/docs