사전 설계에서 반복 설계로
과도한 사전 설계를 버리고 AI와 빠르게 반복하며 구조를 발견하기
"설계를 충분히 하고 구현에 들어가라." 개발자라면 수없이 들어온 말이다. 그리고 대부분의 경우 맞는 말이었다.
하지만 에이전틱 시대에는 이 원칙의 전제가 바뀌었다. 구현 비용이 극적으로 줄었기 때문이다.
Big Design Up Front의 역사
사전 설계 방식은 구현 비용이 높던 시대의 합리적 전략이었다.
1970s — 폭포수 모델
구현 비용이 극히 높아 설계에 최대한 투자하던 시대.
1990s — RUP
반복적이지만 여전히 무거운 설계 프로세스.
2001 — 애자일 선언
"작동하는 소프트웨어를 자주 전달." 설계와 구현의 반복이 시작됨.
2010s — 린 스타트업
MVP 중심 빠른 검증. 필요한 만큼만 설계.
2024+ — 에이전틱 코딩
구현 비용이 급격히 하락하면서 설계의 의미 자체가 재정의됨.
각 시대의 설계 강도는 구현 비용에 비례했다.
관찰 기반 모델
퍼센트는 업계 평균 통계가 아니라, 설계 강도가 어떻게 이동했는지 보여주기 위한 개념적 비중입니다.
| 시대 | 구현 비용 | 변경 비용 | 최적 설계 전략 | 설계 문서 비중 |
|---|---|---|---|---|
| 폭포수 1970s | 매우 높음 | 극히 높음 | 최대한 사전 설계 | 전체 시간의 40% |
| 애자일 2000s | 보통 | 관리 가능 | 충분히 설계하되 반복 | 전체 시간의 20% |
| 에이전틱 2024+ | 매우 낮음 | 매우 낮음 | 최소 설계 후 빠르게 반복 | 전체 시간의 5-10% |
구현 비용의 극적 변화: 예시 수치
구현 비용이 줄었다는 것은 구체적으로 무엇을 의미하는가?
동일 기능의 시간 비교
"사용자 알림 시스템: 이메일 + 슬랙 채널, 실패 시 재시도, 확장 가능한 구조"
| 단계 | BDUF 방식 소요 시간 | 반복 설계 방식 소요 시간 | 시간 차이 |
|---|---|---|---|
| 요구사항 분석 | 2시간 | 30분 | 1.5시간 절약 |
| 설계 문서 작성 | 4시간 | 의도 문서 15분 | 3.75시간 절약 |
| 설계 리뷰 미팅 | 1시간 | - | 1시간 절약 |
| 설계 수정 | 2시간 | - | 2시간 절약 |
| 구현 | 8시간 | AI 생성 + 검증 2시간 | 6시간 절약 |
| 테스트 작성 | 3시간 | AI 생성 + 검증 1시간 | 2시간 절약 |
| 통합 테스트 | 2시간 | 1시간 | 1시간 절약 |
| 합계 | 22시간 | 약 5시간 | 17시간 절약 |
이 비교의 함정
22시간 대 5시간은 극단적 비교다. 실제로는 반복 설계에서 예상치 못한 문제로 추가 반복이 필요한 경우가 많아, 현실적 차이는 2-3배 수준이다. 핵심은 절대 시간이 아니라 피드백 루프의 속도다.
변경 비용의 차이가 만드는 전략 변화
구체적 예시: 동일 기능을 두 방식으로 설계
"주문 상태 변경 시 관련자에게 알림을 보내는 시스템"을 BDUF 방식과 반복 설계 방식으로 비교한다.
BDUF 방식의 설계 결과
설계 문서에서 결정한 구조:
src/
notifications/
interfaces/
NotificationChannel.ts
NotificationStrategy.ts
NotificationFormatter.ts
channels/
EmailChannel.ts
SlackChannel.ts
SmsChannel.ts # 아직 필요 없지만 "확장성을 위해"
strategies/
OrderCreatedStrategy.ts
OrderShippedStrategy.ts
OrderDeliveredStrategy.ts
formatters/
HtmlFormatter.ts
PlainTextFormatter.ts
SlackBlockFormatter.ts
factories/
ChannelFactory.ts
StrategyFactory.ts
NotificationService.ts
NotificationQueue.ts
NotificationRetry.ts13개 파일, 3개의 인터페이스, 2개의 팩토리. 설계에 6시간, 구현에 12시간. 그런데 출시 후 첫 달에 사용된 채널은 이메일과 슬랙 2개뿐이었다.
반복 설계 방식의 진행 과정
1회차 - 의도 전달:
"주문 상태가 바뀌면 이메일과 슬랙으로 알림을 보내줘. 전송 실패 시 3회 재시도."
AI가 생성한 첫 구조:
src/
notifications/
notify.ts # 메인 함수
channels.ts # 이메일, 슬랙 전송
retry.ts # 재시도 로직3개 파일. 검증 10분. 동작 확인 완료.
2회차 - 피드백:
"새 채널 추가 시 기존 코드 수정 없이 가능하게 해줘."
src/
notifications/
notify.ts
channels/
email.ts
slack.ts
index.ts # 채널 레지스트리
retry.ts4개 파일로 확장. 동작 확인 + 구조 검토 15분.
3회차 - 프로덕션 정제:
"에러 로깅 추가하고, 알림 전송 이력을 DB에 저장해줘."
최종 5개 파일. 총 소요 시간 약 2시간.
YAGNI 원칙의 자연스러운 적용
반복 설계에서는 "나중에 필요할 수도 있으니까"라는 이유로 미리 만드는 코드가 사라지는 경향이 있다. 실제로 필요해질 때 AI에게 맡기면 되기 때문에, 현재 필요한 것에 정확히 집중할 수 있다. 이것이 에이전틱 시대에 YAGNI가 더욱 강력해지는 이유다.
BDUF vs 반복 설계: 상황별 판단
모든 상황에서 반복 설계가 최적인 것은 아니다. 상황별로 어떤 접근이 더 적합한지 달라진다.
| 판단 기준 | BDUF가 적합한 경우 | 반복 설계가 적합한 경우 |
|---|---|---|
| 변경 영향 범위 | 여러 팀이 의존하는 인터페이스 | 한 팀 내부 구현 |
| 실수 비용 | 보안, 결제, 의료 등 치명적 영역 | 일반 비즈니스 로직 |
| 요구사항 확실성 | 법규나 규격으로 확정된 요구사항 | 사용자 피드백으로 변할 수 있는 요구사항 |
| 구현 복잡도 | 분산 시스템 간 합의가 필요한 경우 | 단일 서비스 내 기능 |
| 되돌리기 비용 | DB 스키마, 공개 API 등 롤백 어려움 | 코드만 변경하면 되는 경우 |
이 매트릭스에서 흥미로운 점은, 대부분의 일상적 개발 작업이 좌측(낮은 변경 비용)에 위치한다는 것이다. BDUF가 정말 필요한 우측 상단의 작업은 전체 개발 시간의 일부에 불과한 경우가 많다. 그럼에도 많은 팀에서 모든 작업에 동일한 설계 강도를 적용하는 관성이 관찰된다.
설계 문서 vs 작동하는 프로토타입
전통적으로 설계 문서가 "정확한 설계"의 기준이었다. 하지만 설계 문서에는 구조적 한계가 있다.
| 비교 항목 | 설계 문서 | 작동하는 프로토타입 |
|---|---|---|
| 모호성 | 자연어의 해석 차이 존재 | 코드는 모호하지 않음 |
| 실행 가능성 | 종이 위의 구조 | 즉시 실행하고 확인 가능 |
| 엣지 케이스 발견 | 상상에 의존 | 실행하면 드러남 |
| 팀 커뮤니케이션 | 텍스트로 설명 | 동작하는 데모로 설명 |
| 유지보수 비용 | 문서와 코드 동기화 필요 | 코드가 곧 문서 |
| 초기 투자 비용 | 작성 시간이 김 | 빠르게 생성 가능 |
이것은 "설계 문서가 필요 없다"는 주장이 아니다. **"설계 문서만으로는 정확한 설계가 불가능하다"**는 관찰이다. 설계 문서에 적힌 구조와 실제 구현 과정에서 발견되는 구조 사이에는 거의 항상 괴리가 존재한다. 구현 비용이 높던 시절에는 이 괴리를 감수할 수밖에 없었지만, 구현 비용이 낮아진 지금은 다른 전략이 가능해졌다.
반복 설계의 구조: IPFR 사이클
Intent - Prototype - Feedback - Refactor
Intent - 의도 정의
구현 세부사항이 아니라 무엇을 달성하려는지를 명확히 하는 단계다.
의도 중심의 정의:
사용자가 결제를 완료하면 이메일과 슬랙으로 알림을 보낸다.
- 전송 실패 시 3회까지 재시도
- 새 채널 추가가 쉬워야 함
- 알림 전송이 결제 프로세스를 블로킹하면 안 됨구현 방법을 미리 지정한 정의:
Observer 패턴으로 알림 시스템을 만들어.
NotificationService 클래스에 send 메서드가 있고,
EmailChannel과 SlackChannel이 NotificationChannel 인터페이스를 구현해.구현 방법 지정의 역설
두 번째 예시의 문제는 이미 구조를 결정해 버렸다는 것이다. 의도만 전달하면 AI가 상황에 맞는 구조를 제안하고, 개발자는 그 구조가 적절한지 판단하는 역할을 맡게 된다. 구조를 미리 정하면 AI의 가치가 크게 줄어든다.
Prototype과 Feedback
생성된 코드를 검토하면서 두 가지를 판단하는 단계다.
- 동작 정확성: 의도한 대로 작동하는가?
- 구조 적절성: 이 구조가 향후 변경에 유연한가?
여기서 피드백의 품질이 반복 설계의 성패를 가르는 경향이 있다.
| 모호한 피드백 | 구체적 피드백 | 차이점 |
|---|---|---|
| "더 깔끔하게 해줘" | "알림 채널 추가 시 기존 코드 수정 없이 가능하게 해줘" | 구체적 제약조건 제시 |
| "성능이 걱정돼" | "알림 전송이 결제 응답을 블로킹해. 비동기로 분리해줘" | 문제 현상 명시 |
| "뭔가 이상해" | "에러 발생 시 재시도 로직이 없어. 3회 재시도 추가해줘" | 누락 기능 특정 |
실제로 시니어 개발자가 반복 설계에서 발휘하는 가장 큰 강점이 바로 이 피드백 품질이다. 10년간의 경험이 "무엇이 문제이고, 왜 문제이며, 어떤 제약조건이 필요한지"를 정확히 표현하는 능력으로 전환되는 것이다.
Refactor - 구조 개선
2-3회 반복 후 작동하는 프로토타입이 나오면, 구조를 정리하는 단계다. 이때 비로소 패턴 이름을 붙이고, 디렉토리를 정리하고, 인터페이스를 명확히 한다.
과거에는 이 작업을 처음에 했지만, 반복 설계에서는 마지막에 한다. 이것이 의미하는 바는, 구조가 "계획"에서 나오는 것이 아니라 **"발견"**에서 나온다는 관점의 전환이다.
반복 설계가 실패하는 경우
반복 설계는 만능이 아니다. 실무에서 관찰되는 실패 패턴들이 있다.
| 실패 패턴 | 증상 | 원인 |
|---|---|---|
| 방향 없는 반복 | 5회 이상 반복해도 수렴하지 않음 | 의도 정의가 모호한 경우가 많음 |
| 프로토타입 고착 | 작동하는 코드를 그대로 프로덕션에 사용 | 리팩터 단계를 생략하는 경향 |
| 부분 최적화 함정 | 개별 기능은 잘 되지만 전체 구조가 엉망 | 시스템 레벨 설계가 부재한 경우 |
| 피드백 품질 저하 | AI가 같은 실수를 반복 | 피드백이 모호하거나 일관성이 없을 때 발생 |
| 시간 역전 | 반복 설계가 BDUF보다 오래 걸림 | 잘못된 영역에 반복 설계를 적용한 경우 |
프로토타입의 프로덕션 직행 문제
반복 설계의 가장 큰 위험은 "작동하니까 이대로 배포하자"는 유혹이다. 프로토타입은 구조를 발견하기 위한 도구이지, 프로덕션 코드가 아니다. 발견된 구조를 기반으로 프로덕션 품질의 코드를 만드는 과정이 빠지면, 기술 부채가 빠르게 누적되는 것이 관찰된다.
3회 규칙: 수렴 여부의 판단
3회 반복 후에도 구조가 수렴하지 않는 경우, 반복을 계속하는 것보다 멈추고 원인을 진단하는 것이 효과적인 경향이 있다. 수렴하지 않는 원인은 대체로 세 가지 중 하나다: 의도가 모호하거나, 피드백이 부정확하거나, 애초에 BDUF가 필요한 영역이거나.
사전 설계가 여전히 필요한 영역
| 영역 | 사전 설계 필요도 | 이유 | 반복 설계와의 결합 |
|---|---|---|---|
| 팀 간 API 계약 | 높음 | 여러 팀이 동시에 의존 | API 스펙만 BDUF, 구현은 반복 |
| 데이터 모델 핵심 구조 | 높음 | 마이그레이션 비용이 여전히 높음 | 필드 추가는 반복, 구조 변경은 BDUF |
| 보안 아키텍처 | 높음 | 실수의 비용이 극히 높음 | 위협 모델은 BDUF, 구현은 반복 |
| UI 인터랙션 | 낮음 | 빠르게 만들어보고 피드백 | 전면 반복 설계 |
| 내부 유틸리티 | 낮음 | 변경 영향 범위가 작음 | 전면 반복 설계 |
| 프로토타입 PoC | 매우 낮음 | 검증이 목적 | 전면 반복 설계 |
여기서 눈에 띄는 패턴이 있다. BDUF가 필요한 영역과 반복 설계가 적합한 영역은 배타적이지 않다. 오히려 하나의 프로젝트 안에서 두 방식이 공존하는 것이 가장 현실적인 모습이다. API 스펙은 BDUF로 합의하되, 그 스펙의 구현은 반복 설계로 빠르게 진행하는 식이다.
BDUF의 숨겨진 비용
BDUF의 직접 비용만 보면 "철저한 설계"로 보이지만, 숨겨진 비용을 포함하면 다른 그림이 나타난다.
| 비용 항목 | BDUF | 반복 설계 |
|---|---|---|
| 설계 문서 작성 시간 | 4-8시간 | 15-30분 |
| 설계 문서 유지보수 | 구현 변경 때마다 동기화 필요 | 코드가 곧 문서 |
| 설계 리뷰 미팅 비용 | 참석자 수 x 1시간 | 코드 리뷰로 대체 |
| 과잉 설계 비용 | 사용되지 않는 추상화 구현 | 필요할 때 추가 |
| 설계-구현 괴리 비용 | 구현하며 설계와 달라지는 비용 | 괴리가 발생하지 않음 |
| 잘못된 설계 방향 비용 | 설계 완료 후 방향 전환 어려움 | 언제든 방향 전환 가능 |
가장 비싼 비용은 마지막 행이다
BDUF의 가장 큰 숨겨진 비용은 매몰 비용 효과다. 6시간 들여 만든 설계 문서가 있으면, 더 나은 방향이 보여도 "이미 설계했으니까"라는 이유로 기존 방향을 고수하게 되는 경향이 있다. 반복 설계에서는 이 함정에 빠질 여지가 줄어든다.
반복 설계의 현실적 적용
반복 설계가 이론적으로는 매력적이지만, 실제 도입 과정에서 관찰되는 몇 가지 현실적 측면이 있다.
첫째, 팀 전체가 동시에 전환하기 어렵다. 한 명이 반복 설계로 일하고 나머지가 BDUF로 일하면, 설계 리뷰 과정에서 충돌이 발생하는 경우가 많다. "설계 문서는 어디 있어?"라는 질문에 "작동하는 프로토타입이 여기 있다"는 답이 조직적으로 수용되려면 시간이 필요하다.
둘째, IPFR 사이클의 품질은 의도 정의 능력에 크게 좌우된다. 시니어 개발자가 반복 설계에서 강점을 발휘하는 이유가 바로 이것이다. 10년간 쌓은 도메인 지식과 기술적 판단력이 정확한 의도 정의와 날카로운 피드백으로 전환된다.
셋째, 프로토타입에서 프로덕션으로의 전환 단계를 생략하는 유혹이 크다. "작동하는데 왜 다시 만들어?"라는 질문은 자연스럽다. 하지만 프로토타입 코드가 그대로 프로덕션에 올라가면, 6개월 뒤에 그 코드를 유지보수해야 하는 사람이 고통받게 된다. 이 점은 반복 설계를 도입하는 팀에서 가장 빈번하게 관찰되는 함정이다.
이 챕터의 핵심
기억할 한 문장
구현 비용이 극적으로 줄었다면, 최적의 설계 전략도 바뀌어야 한다. 문서에 적힌 구조가 아니라, 작동하는 코드에서 발견된 구조가 진짜 설계다.
다음 장 미리보기
다음 챕터에서는 반복 설계의 핵심 도구인 프롬프트를 설계 언어로 다루는 방법을 다룹니다.
참고 자료
참고 자료 안내
이 장의 관점과 프레임워크를 뒷받침하는 참고 자료입니다. 본문의 모든 주장이 아래 자료에서 직접 인용된 것은 아니며, 실무 경험과 커뮤니티 사례를 종합한 해석이 포함되어 있습니다.
- Beck, K. et al. (2001). Manifesto for Agile Software Development. https://agilemanifesto.org/