Agile
애자일
반복적, 점진적 소프트웨어 개발 방법론. Scrum, Kanban이 대표적. 폭포수 모델의 대안.
애자일
반복적, 점진적 소프트웨어 개발 방법론. Scrum, Kanban이 대표적. 폭포수 모델의 대안.
Agile(애자일)은 2001년 "애자일 선언문"에서 시작된 소프트웨어 개발 철학입니다. 핵심은 변화에 빠르게 대응하는 것입니다. 6개월 계획을 세워놓고 세상이 바뀌어도 그대로 진행하는 게 아니라, 2주 단위로 작동하는 소프트웨어를 만들고 피드백을 받아 방향을 조정합니다.
가장 널리 쓰이는 애자일 프레임워크는 Scrum과 Kanban입니다. Scrum은 스프린트(보통 2주)라는 고정된 주기로 일하고, Daily Standup, Sprint Planning, Retrospective 같은 의식(ceremony)이 있습니다. Kanban은 WIP(Work In Progress) 제한을 두고 흐름을 최적화하는 데 집중합니다. 팀 상황에 따라 둘을 섞어 쓰는 Scrumban도 많이 사용됩니다.
DevOps와 Agile은 궁합이 좋습니다. Agile이 "빨리 만들어 빨리 피드백 받자"라면, DevOps는 "빨리 만든 걸 빨리 배포하자"입니다. CI/CD 파이프라인, 자동화 테스트, 인프라 자동화가 뒷받침되어야 스프린트마다 실제로 배포할 수 있습니다.
실무에서 애자일을 제대로 하려면 "의식" 보다 "원칙"에 집중해야 합니다. Daily Standup을 형식적으로 하는 것보다, 팀이 블로커(blocker)를 빠르게 공유하고 해결하는 문화가 중요합니다. "애자일 했는데 왜 더 느려졌지?"라는 상황은 보통 도구만 도입하고 마인드셋 변화가 없을 때 발생합니다.
# GitHub Projects를 활용한 Agile 보드 자동화 (GitHub Actions)
# .github/workflows/agile-automation.yml
name: Agile Board Automation
on:
issues:
types: [opened, closed, labeled]
pull_request:
types: [opened, closed, review_requested]
jobs:
update-board:
runs-on: ubuntu-latest
steps:
# 새 이슈가 열리면 자동으로 Backlog에 추가
- name: Add issue to project
if: github.event_name == 'issues' && github.event.action == 'opened'
uses: actions/add-to-project@v0.5.0
with:
project-url: https://github.com/orgs/myorg/projects/1
github-token: ${{ secrets.PROJECT_TOKEN }}
# PR이 열리면 연결된 이슈를 "In Progress"로 이동
- name: Move to In Progress
if: github.event_name == 'pull_request' && github.event.action == 'opened'
run: |
# PR 본문에서 "Fixes #123" 패턴으로 연결된 이슈 찾기
ISSUE_NUM=$(echo "${{ github.event.pull_request.body }}" | grep -oP 'Fixes #\K\d+')
if [ -n "$ISSUE_NUM" ]; then
gh api graphql -f query='
mutation {
updateProjectV2ItemFieldValue(
input: {projectId: "PVT_xxx", itemId: "PVTI_xxx", fieldId: "PVTF_xxx",
value: {singleSelectOptionId: "in_progress"}}
) { projectV2Item { id } }
}'
fi
env:
GH_TOKEN: ${{ secrets.PROJECT_TOKEN }}
# Sprint velocity 계산 (스프린트 종료 시)
- name: Calculate Sprint Velocity
if: github.event.label.name == 'sprint-complete'
run: |
# 완료된 이슈의 story point 합계
VELOCITY=$(gh issue list --state closed --label "sprint-10" \
--json number,labels --jq '[.[] | .labels[] | select(.name | startswith("sp:")) | .name | ltrimstr("sp:") | tonumber] | add')
echo "Sprint 10 Velocity: $VELOCITY points"
PM: "이번 스프린트 velocity가 32포인트였는데, 다음 스프린트에 35포인트 커밋해도 될까요?"
개발자: "지난 3개 스프린트 평균이 30인데, 연휴도 있어서 28정도로 잡는 게 안전할 것 같아요."
시니어: "동의해요. Sustainable pace 유지하는 게 장기적으로 더 빨라요. 번아웃 오면 다음 스프린트 망합니다."
면접관: "Agile 환경에서 일해보신 경험이 있으신가요?"
지원자: "네, 2주 스프린트 기반의 Scrum을 3년간 진행했습니다. 스프린트 플래닝에서 story point로 추정하고, 데일리 스탠드업에서 블로커를 공유했어요. 가장 도움됐던 건 레트로스펙티브인데, 팀이 지속적으로 개선점을 찾아 적용하면서 배포 주기를 월 1회에서 주 2회로 단축했습니다."
리뷰어: "이 PR이 스프린트 목표랑 어떻게 연결되죠? 이슈 번호 좀 달아주세요."
작성자: "아, 깜빡했네요. Fixes #234 추가하겠습니다. 스토리 'API 응답 속도 개선'의 서브태스크예요."