“혼자였으면 며칠, AI와 함께라면 2시간”
테스트는 왜 항상 밀릴까
솔직히 말하면, 테스트 코드 작성은 늘 후순위였다.
기능 구현이 급하고, 버그 수정이 급하고, 배포가 급했다. “나중에 테스트 보강하지 뭐”라고 생각하며 미뤄왔다. 그 결과, Senior HealthNote의 테스트 커버리지는 26.83%에 머물러 있었다.
문제는 알고 있었다. 커버리지가 낮으면:
– 리팩토링이 무섭다 (뭐가 깨질지 모르니까)
– 버그가 프로덕션에서 터진다
– 코드에 자신감이 없어진다
하지만 테스트 작성은 반복적이고 지루한 작업이다. 서비스 하나에 테스트 케이스 20개. 컨트롤러 하나에 또 20개. 이걸 혼자 다 하려면 며칠이 걸린다.
그래서 항상 미뤘다.
AI는 반복 작업의 동반자
오늘 실험을 해봤다.
“Claude Code로 테스트 작성을 자동화할 수 있을까?”
결론부터 말하면, 된다. 그것도 아주 잘.
설정 한 줄이 바꾼 것
~/.claude/settings.json:
{
"permissions": {
"allow": [
"Bash(*)",
"Read(*)",
"Write(*)",
"Edit(*)"
]
}
}
이 설정으로 모든 파일 작업과 명령어 실행이 승인 없이 가능해졌다. 클릭 한 번 없이 백그라운드로 작업이 돌아간다.
2시간 동안 일어난 일
6개의 백그라운드 에이전트를 병렬로 실행했다:
| 작업 | 결과 |
|---|---|
| 서비스 테스트 4개 | 96 tests 작성, 버그 2개 발견/수정 |
| API Controller 테스트 5개 | 76 tests 통과 |
| Web Controller 테스트 6개 | 155 tests 작성 |
| Rubocop 자동 수정 | 86개 위반 → 0개 |
| 문서 자동 생성 | API 문서, 로드맵 통합 문서 |
결과: 26.83% → 46.28%
거의 20% 포인트 상승. 혼자 했으면 3-4일은 걸렸을 작업이다.
과정에서 배운 것들
1. AI는 패턴을 잘 따른다
기존에 잘 작성된 테스트 파일 3개(OpenAiService, NotificationService, VoiceUploadService)가 있었다. AI에게 “이 패턴을 따라서 나머지도 작성해”라고 했더니, 일관된 스타일로 테스트를 만들어냈다.
핵심: 좋은 예시 하나가 열 개의 설명보다 낫다.
2. 버그는 테스트를 작성할 때 드러난다
테스트 작성 과정에서 발견된 버그들:
– BulkCreateService: ActionController::Parameters 처리 오류
– UpdateService: 빈 해시 처리 누락
– BaseController: Devise/JWT 인증 충돌
– FamilyInvitationsController: 파라미터 이름 불일치
테스트를 작성하는 행위 자체가 코드 리뷰다.
3. 병렬 처리의 힘
6개 에이전트가 동시에 돌았다. 각각이 독립적인 파일을 담당했기 때문에 충돌 없이 작업이 진행됐다.
에이전트 1: 서비스 테스트
에이전트 2: API 컨트롤러 테스트
에이전트 3: Web 컨트롤러 테스트
에이전트 4: Rubocop 수정
에이전트 5: Silentia 문서화
에이전트 6: 통합 로드맵 작성
혼자였으면 순차적으로 했을 작업을 병렬로 처리하니 시간이 확 줄었다.
Silentia가 가르쳐준 것: 침묵의 기술
사실 오늘 작업에는 숨겨진 철학이 있다.
나는 Silentia라는 프로젝트를 만들고 있다. “말하지 않는 기술”을 구현하는 판단 엔진이다. 핵심 원칙은 이렇다:
침묵은 버그가 아니다.
침묵은 의도된 결과다.
Silentia에서 기본값은 SILENT다. 시스템이 말을 하려면 여러 조건을 통과해야 한다. 대부분의 경우, 시스템은 침묵한다. 그리고 그게 정상이다.
AI 협업에도 같은 원칙이 적용된다
오늘 6개의 에이전트가 백그라운드에서 돌아가는 동안, 나는 뭘 했을까?
아무것도 안 했다.
정확히 말하면, 개입하지 않았다.
- 진행 상황을 5분마다 체크하지 않았다
- “이거 제대로 하고 있어?” 확인하지 않았다
- 중간에 끼어들어 수정하지 않았다
그냥 기다렸다. AI가 완료 알림을 보낼 때까지.
이게 어려웠다. 손이 근질근질했다. “내가 직접 하면 더 빠를 텐데”라는 생각이 들었다. 하지만 참았다.
개입하지 않는 용기
Silentia의 Decision States를 보자:
SPEAK : 말한다 (극히 예외적)
WAIT : 지금은 아니다
SILENT : 아무 말도 하지 않는다 (기본값)
DEFER : 나중에 판단한다
SPEAK는 규칙이 아니라 예외다.
AI 협업도 마찬가지다. 내가 개입하는 건 예외여야 한다.
- 방향을 잡을 때만 말한다
- 결과를 검증할 때만 판단한다
- 나머지 시간은 침묵한다
모든 것을 직접 하려는 충동, 모든 과정을 통제하려는 욕구—이걸 내려놓는 게 진짜 협업이다.
HealthNote와 Silentia의 관계
Senior HealthNote는 건강 기록 앱이다. 사용자가 혈압, 혈당, 증상을 기록한다.
Silentia는 그 위에 얹어질 “판단 레이어”다. 언제 사용자에게 말을 걸고, 언제 침묵할지 결정한다.
HealthNote = 기록하는 앱
Silentia = 침묵하는 엔진
둘의 관계는 이렇다:
- HealthNote는 기록에 집중한다 (판단하지 않는다)
- Silentia는 판단에 집중한다 (기록하지 않는다)
- 각자의 역할에 충실하고, 서로의 영역을 침범하지 않는다
오늘 AI와의 협업도 같았다. AI는 테스트 작성에 집중하고, 나는 방향 설정에 집중했다. 서로의 역할을 존중했다.
침묵할 줄 아는 개발자
결국 오늘 배운 건 이거다:
좋은 개발자는 코드를 잘 짜는 사람이 아니다.
좋은 개발자는 언제 손을 떼야 하는지 아는 사람이다.
모든 걸 직접 해야 한다는 강박에서 벗어나자. AI가 잘하는 건 AI에게 맡기자. 그리고 그 시간에 나는 더 중요한 걸 하자—설계, 판단, 방향 설정.
Silentia�� 가르쳐준 침묵의 기술은, 결국 내려놓음의 기술이다.
당신도 할 수 있다
“AI로 코딩하면 실력이 안 늘지 않나요?”
이런 걱정을 많이 듣는다. 내 대답은 이렇다:
반복 작업에 시간을 쓰는 건 성장이 아니다.
테스트 케이스 100개를 손으로 타이핑하는 게 실력일까? 아니다. 그건 그냥 노동이다.
진짜 실력은:
– 어떤 테스트가 필요한지 판단하는 것
– 테스트 결과를 보고 버그를 분석하는 것
– 코드 품질을 설계하는 것
AI는 반복 작업을 대신해주고, 나는 판단과 설계에 집중한다. 이게 진짜 협업이다.
실전 가이드: 따라해보세요
Step 1: 권한 설정
# ~/.claude/settings.json
{
"permissions": {
"allow": ["Bash(*)", "Read(*)", "Write(*)", "Edit(*)"]
}
}
Step 2: 좋은 예시 준비
프로젝트에 잘 작성된 테스트 파일 2-3개를 준비한다. AI가 참고할 패턴이 된다.
Step 3: 백그라운드 작업 요청
"기존 OpenAiService 테스트 패턴을 참고해서
DailyBriefingService, HealthReportPdfService 테스트를 작성해줘.
백그라운드로 실행하고 완료되면 알려줘."
Step 4: 결과 검증
bundle exec rspec spec/services/
테스트가 통과하는지 확인하고, 실패하는 것들은 AI와 함께 수정한다.
마무리
“늦게 시작해도 괜찮다. AI와 함께라면.”
테스트 커버리지 26%를 46%로 올리는 데 2시간이 걸렸다. 혼자였으면 며칠이 걸렸을 것이다.
중요한 건 시작하는 것이다.
완벽한 테스트가 아니어도 된다. 46%도 100%에 비하면 부족하다. 하지만 26%보다는 낫다. 그리고 내일은 50%가 될 것이다.
당신의 프로젝트도 마찬가지다. 테스트가 없어서 걱정이라면, 오늘 AI와 함께 시작해보자.
나도 그랬으니까, 당신도 된다.
