새벽 2시. 아이가 드디어 잠들었다.
노트북을 열었더니 AI 에이전트 8개가 작업을 마쳐 있었다.
- 테스트 코드 318개 작성
- 코드 품질 경고 5,874개 → 0개
- 테스트 커버리지 26% → 46%
- 파일 318개 변경, 코드 24,897줄 추가
나는 “돌려”라고 두 글자만 쳤다.
테스트 커버리지 26%의 민낯
프로젝트를 시작한 지 3개월.
Rails 앱의 뼈대는 갖춰졌는데, 테스트 커버리지가 26%였다.
개발자들은 안다. 26%가 뭘 의미하는지.
“돌아가긴 하는데, 언제 터질지 모른다.”
문제는 시간이었다.
낮에는 육아, 밤에는 기능 개발.
테스트 코드 짤 시간이 없었다.
그래서 AI한테 물었다.
“백그라운드로 돌릴 수 있는 작업이 뭐야?”
8개 병렬 에이전트가 한 일
Claude Code의 Task 도구로 8개 에이전트를 동시에 실행했다.
각 에이전트가 맡은 작업:
| Agent | 작업 | 결과 |
|---|---|---|
| 1 | Phase 2 서비스 테스트 | 85개 테스트, 0 failures |
| 2 | API 컨트롤러 테스트 | 76개 테스트, 0 failures |
| 3 | Web 컨트롤러 테스트 | 149개 테스트, 25 pending |
| 4 | i18n 한국어 번역 | 17개 모델 번역 완료 |
| 5 | Rubocop 자동 수정 | 5,874개 → 0개 |
| 6 | UX 개선 – 로그인 유지 | 이미 구현 확인 |
| 7 | PWA Service Worker | 오프라인 지원 구현 |
| 8 | 통합 테스트 | 9개 시나리오 + 버그 3개 수정 |
핵심은 병렬 실행이었다.
순차적으로 했으면 8시간 걸렸을 작업이 병렬로 돌리니 40분 만에 끝났다.
GitHub Actions CI 파이프라인
테스트를 만들었으면 자동화해야 한다.
GitHub Actions로 CI 파이프라인을 구성했다.
# .github/workflows/ci.yml
jobs:
test:
runs-on: ubuntu-latest
services:
postgres:
image: postgres:16
redis:
image: redis:7
steps:
- name: Run RSpec
run: bundle exec rspec --format RspecJunitFormatter
- name: Upload coverage
uses: codecov/codecov-action@v4
이제 코드를 push할 때마다:
- PostgreSQL 16 + Redis 7 컨테이너 자동 실행
- RSpec 테스트 전체 실행
- 커버리지 리포트 자동 업로드
숫자가 말해주는 것
작업 전후 비교:
| 지표 | Before | After | 변화 |
|---|---|---|---|
| 테스트 커버리지 | 26.83% | 46.26% | +19.43% |
| Rubocop 경고 | 5,874개 | 0개 | -100% |
| 테스트 케이스 | ~50개 | 318개 | +536% |
| 변경된 파일 | – | 318개 | – |
| 코드 변경량 | – | +24,897 / -15,559 | – |
이 숫자들이 의미하는 건 단순하다.
“이제 코드를 고쳐도 뭐가 깨지는지 안다.”
테스트 없이 개발하는 건 눈 감고 운전하는 거다.
이제 최소한 앞유리는 생겼다.
당신의 26%는 뭔가요?
솔직히 말하면, 나도 무서웠다.
“AI가 짠 테스트 코드를 믿어도 되나?”
“뭔가 잘못되면 어쩌지?”
근데 결과물을 보니까 알겠더라.
AI는 내가 못하는 걸 대신하는 게 아니라, 내가 미루던 걸 대신하는 거였다.
테스트 코드. 코드 스타일 정리. 번역 파일.
다 해야 하는 줄 알면서 미뤘던 것들.
당신도 미루고 있는 거 있을 거다.
프로젝트의 “26%”. 해야 하는데 손 안 대는 영역.
AI한테 맡겨봐.
“이거 백그라운드로 돌릴 수 있어?”라고 물어봐.
아이 재우고 돌아오면 끝나 있을 수도 있다.
나도 그랬으니까.
