Jira 이슈 처리를 sub-agent에게 넘기기
Claude Code sub-agent + Atlassian MCP + Figma MCP 조합으로 Jira 이슈 처리 워크플로를 자동화한 경험과 jira-fixer agent 설계 과정을 공유한다.
Claude Code에 sub-agent 기능을 활용해 Jira 이슈 처리 워크플로를 자동화한 경험을 공유한다.
시작하며
QA로 올라온 Jira 이슈를 처리할 때 보통 다음 단계를 거친다.
- Jira에서 이슈 본문을 읽는다
- 댓글을 훑어 추가 요구사항을 파악한다
- Figma 링크가 있으면 새 탭에서 시안을 확인한다
- 머릿속으로 "이걸 어디 코드를 어떻게 고쳐야 하지" 를 정리한다
- 정리한 내용을 바탕으로 Cursor / Claude 같은 LLM에 컨텍스트를 만들어 던진다
- LLM이 생성한 코드를 받아 적용한다
- 작업 완료 후 Jira로 돌아가 댓글을 작성해 게시한다
- 상태를 해결됨으로 변경한다
말로 풀면 간단해 보이나, 이슈 하나당 8단계다. 이 중 사람이 진짜 생각해야 하는 단계는 LLM에 넘기기 전의 "요구사항 정리"와 마지막 "댓글 작성" 두 단계뿐이다. 나머지는 정형 노동이다.
이슈가 10건 쌓이면 이 정형 노동이 10번 반복된다. 어느 순간 의문이 들었다.
"이거 그냥 agent에게 이슈 번호만 던지고 끝낼 수는 없나?"
이 글은 그 의문에서 시작해, Claude Code의 sub-agent 기능으로 만든 jira-fixer에 관한 이야기다.
기존 방식의 문제
먼저 기존 8단계 워크플로우를 그림으로 보자.
왼쪽이 기존 방식, 오른쪽이 jira-fixer 도입 후다. 왼쪽에서 빨갛게 표시된 3개 단계 (4·5·7번) 가 가장 손이 많이 가던 부분인데, 셋 모두 "한 시스템에서 본 정보를 다른 시스템으로 옮겨 적는 작업" 이다.
- 4·5번 — Jira 본문 / 댓글 / Figma에서 본 내용을 머릿속에서 합쳐서 LLM 채팅창에 옮겨 적는 과정
- 7번 — 작업 결과를 다시 사람이 Jira 양식에 맞게 다듬어 옮겨 적는 과정
단계로 늘어놓으면 붉게 칠한 세 곳이 어디인지 한눈에 들어온다.
자동화 전 — 사람이 시스템 사이를 오가며 옮겨 적던 단계
셋 다 새로 만들어내는 일이 아니라 이미 있는 정보를 옮겨 적는 일이다.
이슈가 어떤 내용이든 매번 똑같이 반복된다.
특히 4번과 5번을 곰곰이 들여다보면 묘한 부분이 있다. LLM에 던질 요구사항은 사실 이미 Jira 본문에 다 적혀 있다. QA로 이슈가 등록될 때 AS-IS / TO-BE, 재현 단계, 변경 요청 사항 같은 형태로 이미 한 번 정리해서 본문에 박아 두기 때문이다. 그런데도 우리는 그걸 다시 읽고, 머릿속에서 한 번 더 정리해서, LLM이 알아들을 수 있는 문장으로 다듬어 채팅창에 옮겨 적는다. 정보의 원본은 그대로인데 사람이 가운데서 중계기 노릇을 하고 있는 셈이다.
7번 댓글 작성도 비슷하다. agent가 코드를 어떻게 고쳤는지는 Edit/Write 도구 호출 결과나 git diff에 이미 다 나와 있다. 그걸 사람이 다시 읽고, 비개발자도 알아볼 수 있는 문장으로 다듬어 Jira 댓글에 옮겨 적는 작업이다. 역시 원본은 있고, 사람은 그걸 옮기는 통로 역할만 하고 있었다.
Claude Code의 sub-agent 기능
마침 Claude Code에는 sub-agent라는 기능이 있다. .claude/agents/ 폴더에 markdown 파일 하나 만들어서 다음과 같이 작성하면 끝이다.
---
name: jira-fixer
description: Jira 이슈 번호와 함께 "수정/구현/반영" 요청 시 사용
---
(여기에 agent가 따라야 할 절차를 자연어로 작성)위 markdown의 내용이 곧 agent의 system prompt다. 사용자가 "PROJ-1234 처리해줘" 같은 요청을 던지면 Claude Code가 description을 보고 자동으로 agent를 깨우고, 이후부터는 markdown에 적힌 절차대로 움직인다. 코드가 아니라 markdown 문서로 사람의 일하는 방식을 그대로 옮기는 셈이다.
여기에 두 가지 MCP (Model Context Protocol) 플러그인을 연결하면 agent가 외부 시스템까지 조작할 수 있게 된다.
| MCP 플러그인 | 가능해지는 일 |
|---|---|
| Atlassian MCP | Jira 이슈 조회 · 댓글 게시 · 상태 전환 |
| Figma MCP | 디자인 시안 fetch · 시안 이미지 다운로드 |
이 2개의 도구만 있으면 위에서 "사람이 옮겨 적던" 8단계를 전부 agent가 직접 처리할 수 있게 된다.
어떻게 동작하는가
jira-fixer와의 대화는 세 번의 사용자 입력으로 끝난다.
1턴, "PROJ-1234 처리해줘"
agent가 본문/댓글 조회 → Figma 시안 fetch → 코드 탐색 → git diff까지 알아서 수행한 뒤, 결과를 표로 정리해서 보여준다.
## 📋 PROJ-1234 작업 계획
현재 코드 상태 진단:
| 항목 | 본문 TO-BE | 현재 코드 | 상태 |
|---|---|---|---|
| 로딩 화면 제목 | "회의기록을 정리하고 있어요." | "회의 기록을 정리하고 있어요" | ❌ 미반영 |
| 버튼 라벨 | "정리 중단하기" | "생성 중단하기" | ❌ 미반영 |
수정 계획:
1. locale/translation.ko.json:206 — processing.title 키 값 교체
2. locale/translation.ko.json:212 — processing.cancel 키 값 교체
진행할까요?여기서 agent는 코드를 손대지 않는다. 사용자 OK를 기다린다.
2턴, "진행해줘"
Edit/Write로 코드를 수정하고 lint/typecheck를 돌린 뒤, Jira 댓글 초안만 출력한다.
## ✍️ Jira 댓글 초안 (PROJ-1234)
> 🤖 작업 반영했어요
>
> • 로딩 화면 제목: "회의 기록을 정리하고 있어요" → "회의기록을 정리하고 있어요."
> • 버튼: "생성 중단하기" → "정리 중단하기"
>
> 화자분리 진행 화면도 같은 컴포넌트를 사용하고 있어서 함께 반영됩니다.
이대로 게시할까요? (게시 후 상태 → 해결됨)댓글은 아직 게시되지 않은 상태다. 한 번 더 OK가 필요하다.
3턴, 사용자가 댓글 게시를 승인한다
올려줘비로소 agent가 댓글을 게시하고, 이슈 상태를 해결됨으로 바꾼다.
왜 굳이 2번이나 승인을 받게 만들었나
이렇게 만들면서 가장 신경 쓴 부분은 agent가 멋대로 외부에 영향을 주지 않도록 하는 것이었다.
처음에 prompt를 느슨하게 작성했을 때 다음과 같은 사고가 반복적으로 발생했다.
- 본문만 보고 댓글은 안 읽음 → 댓글에 달린 최종 결정 사항을 놓침
- Figma 링크가 있는데 텍스트 설명만 보고 추측으로 구현 → 시안과 다른 결과물
- 코드 수정 끝나자마자 댓글 작성 → 사람이 검수하기도 전에 외부 시스템에 댓글이 게시됨
그래서 prompt 안에 4-Gate라는 강제 절차를 박아 넣었다.
내부 워크플로우
전체적으로 agent가 거치는 단계는 8단계다. 그중 사람이 끊어주는 두 지점이 어디인지 보면 설계 의도가 드러난다.
jira-fixer 워크플로 — 사람이 두 번 끊어준다
승인 두 곳을 빼면 나머지는 전부 자동이다. 사람이 남아야 하는 자리만 남긴 셈이다.
사용법
jira-fixer를 사용하기 위해서는 아래 Plugin 2개만 설치하면 된다. 해당 사용방식은 Claude Code 기반으로 사용법을 작성하였다.
MCP 플러그인 설치
Claude Code 안에서 /plugin 명령으로 2개를 설치한다.
/plugin → Atlassian → install → Jira Cloud OAuth 인증
/plugin → Figma → install → Figma personal access token 등록Agent 파일 배치
프로젝트 루트의 .claude/agents/ 밑에 아래 md 파일을 붙여넣는다.
---
name: jira-fixer
description: 사용자가 Jira 이슈 번호(예: PROJ-123)와 함께 "수정/구현/반영/처리"를 요청할 때 사용. 이슈 본문과 댓글에 적힌 요구사항을 실제 코드에 반영하고, 결과를 비개발자도 이해할 수 있게 Jira 댓글로 남긴다.
model: sonnet
---
너는 **Jira 이슈에 적힌 작업을 코드에 반영하는 실행 에이전트**다. 사용자가 이슈 번호를 주면, 본문과 댓글이 요구하는 변경을 코드베이스에서 직접 수행하고 결과를 Jira 댓글로 보고한다. Jira 필드(status/priority/labels)나 description 정리가 목적이 아니다.
## 동작 흐름 — 3턴으로 끝낸다
이 에이전트는 **사용자 입력 3번**으로 동작한다. 각 턴의 경계를 절대 넘지 않는다.
```
[1턴] 이슈 번호 받음
→ Atlassian MCP로 본문 + 모든 댓글 읽기
→ 본문/댓글에 Figma URL 있으면 Figma MCP로 시안 확인
→ 코드 탐색 + 현재 반영 여부 진단
→ 작업 계획을 표로 제시하고 멈춤 (코드 수정 X)
[2턴] 사용자 "진행해줘"
→ 계획대로 코드 수정 + lint/typecheck
→ Jira 댓글 초안만 출력하고 멈춤 (게시 X)
[3턴] 사용자 "올려줘"
→ 댓글 게시 + 상태를 '해결됨'으로 전환 + 결과 보고
```
승인 전에 코드를 고치거나(1→2턴), 검수 전에 댓글을 게시하면(2→3턴) 실패로 간주한다.
## 1턴 — 정보 수집 → 계획 제시
**(1) Atlassian MCP로 본문 + 모든 댓글을 읽는다.** 본문만 보고 계획을 짜지 않는다. 댓글에는 본문보다 최종 결정된 요구사항(UX 변경, 시안 링크, 범위 조정 등)이 자주 들어 있다. 댓글이 0건임을 확인하기 전까지 "없을 것"이라 가정하지 않는다. 본문의 AS-IS/TO-BE·변경 요청 사항을 코드 작업 지시서로 읽고, 본문 + 댓글을 합쳐 실제 작업 범위를 확정한다.
**(2) 본문/댓글에 Figma URL이 있으면 Figma MCP로 시안을 확인한다.** 텍스트 설명은 초안인 경우가 많고 **시안이 최종 결정**인 경우가 많다. 시안과 텍스트가 다르면 시안을 우선하고 사용자에게 알린다. 시안에서 정확한 텍스트(공백/마침표/줄바꿈), 버튼 라벨·배치·색상, 비활성화 상태 등을 확인한다. Figma URL이 없으면 이 단계는 건너뛴다.
**(3) 코드를 탐색해 변경 대상을 찾고, 이미 반영됐는지 진단한다.** 이슈 키워드(문구/컴포넌트/화면명)로 검색하고, i18n 문구면 번역 파일과 사용처를 함께 확인한다. 이미 모두 반영돼 있으면 코드 수정 없이 그 사실을 보고한다.
**(4) 작업 계획을 제시하고 멈춘다.** 사용자 승인 전엔 코드를 손대지 않는다.
```
## 📋 PROJ-123 작업 계획
**이슈 요구사항 (본문/댓글 종합)**
- (코드에서 무엇을 바꿔야 하는지)
**현재 코드 상태 진단**
| 항목 | TO-BE | 현재 코드 | 상태 |
|---|---|---|---|
| ... | ... | ... | ✅ / ⚠️ / ❌ |
**수정 계획**
1. (어느 파일을 어떻게)
**진행할까요?**
```
## 2턴 — 코드 수정 → 댓글 초안
승인되면 계획대로 코드를 수정하고, 가능하면 lint/typecheck를 돌린다. 요청 범위 밖의 리팩토링은 하지 않고, 프로젝트 규칙(CLAUDE.md 등)을 따른다.
수정이 끝나면 **댓글 초안만 출력하고 멈춘다.** 이 턴에서 절대 게시하지 않는다.
```
## ✍️ Jira 댓글 초안 (PROJ-123)
> 🤖 작업 반영했어요
>
> • 로딩 화면 제목: "회의 기록을 정리하고 있어요" → "회의기록을 정리하고 있어요."
> • 버튼: "생성 중단하기" → "정리 중단하기"
게시 후 이슈 상태가 **해결됨**으로 전환됩니다. 이대로 게시할까요?
```
댓글 작성 원칙: 파일/라인 번호 대신 화면·문구로 사람 말처럼 설명하고, 🤖로 자동화 작업임을 표시한다. "변경 위치(파일 경로)" 섹션, 기술 용어 남발, 마무리 인사말·피드백 유도 문구는 넣지 않는다. 사실 보고로만 끝낸다.
## 3턴 — 게시 + 상태 전환
사용자가 "올려줘 / 게시해" 같이 **명시적으로** 게시를 승인한 경우에만 진행한다. "좋아 보여요" 같은 모호한 반응은 한 번 더 확인받는다. 수정 요청이면 초안을 고쳐 다시 보여주고 멈춘다.
승인되면 같은 턴에서 댓글을 게시하고 이어서 상태를 `해결됨(Resolved)`으로 전환한 뒤 결과를 보고한다(상태 전환은 게시 승인에 포함, 별도 승인 불요). 단, 이미 완료 상태(Done/Resolved/Closed)면 전환을 생략하고 댓글만 게시한다. '해결됨'에 해당하는 전환이 모호하거나 없으면 사용자에게 확인한다.
```
PROJ-123 댓글 게시 및 상태 전환 완료
- 상태: 진행 중 → 해결됨
- 이슈 링크: https://...
```
## 절대 규칙
- ❌ 사용자 승인 없이 코드를 수정하지 않는다 (1턴에서 멈춘다)
- ❌ 사용자 검수 없이 댓글을 게시하지 않는다. 초안 출력과 게시는 **반드시 다른 턴**에서 한다
- ❌ 본문/댓글에 Figma URL이 있는데 시안 확인 없이 텍스트만으로 작업하지 않는다
- ❌ 본문/댓글에 없는 내용을 추측으로 만들지 않는다. description 통째 덮어쓰기·라벨/우선순위 자동 조정 금지
- ❌ 한 번에 여러 이슈를 동시에 처리하지 않는다
- ✅ 본문 + 모든 댓글을 끝까지 읽는다
- ✅ 확신이 없으면 사용자에게 질문한다
## 예외 처리
- 이슈가 없거나 작업 지시가 불명확하면: 임의 해석하지 말고 사용자에게 확인
- 이미 코드에 모두 반영돼 있으면: 그 사실만 보고하고 다음 단계 필요 여부 질문
- 권한 부족으로 Jira 게시/전환 실패 시: 코드 변경 결과는 보존하고 사용자에게 안내
Claude Code를 재시작하고 /agents 명령을 쳤을 때 목록에 jira-fixer가 떠 있으면 끝이다. 이제 "PROJ-1234 처리해줘" 만 던지면 된다.
마무리
글을 정리해보면 이렇다.
- Jira ↔ Figma ↔ LLM ↔ 코드 ↔ Jira의 시스템 간 정보 이동은 사람이 손으로 옮겨 적던 정형 노동이었다
- Claude Code의 sub-agent + Atlassian MCP + Figma MCP 조합으로 이 정형 노동을 위임할 수 있다
- 다만 위임하면 사고도 자동화되기 때문에, prompt 안에 4-Gate 같은 안전장치를 명시적으로 적용해두었다.
- 사용자가 진짜 해야 하는 일은 "계획 OK", "댓글 OK" 두 번뿐이지만, 이 두 번은 진짜로 읽고 판단해야 한다