jaysnote

02. 방법론 — SDD, TDD, 그리고 결합

방법론은 “선택지 A vs B”가 아니라 레이어다. 무엇을 만들지(SDD), 옳게 만들었는지(TDD), 누가 결정하는지(04)를 각각 다른 레이어가 담당한다.

Spec-Driven Development (SDD)

한 줄 정의: 코드를 쓰기 전에 무엇을·왜 만들지를 구조화된 명세로 먼저 쓰고, 그 명세를 agent의 입력(프롬프트)으로 삼아 구현한다.

SDD의 표준 흐름은 4단계다:

Spec  →  Plan  →  Tasks  →  Implement
무엇을    어떻게    순서대로   실행
  • Spec(명세): 요구사항, 사용자 스토리, 수용 기준(acceptance criteria). 기술 용어 없이 “무엇을, 왜”만.
  • Plan(계획): 기술 스택, 아키텍처, 데이터 모델, API 계약. “어떻게”.
  • Tasks(작업): 계획을 의존성 순서가 반영된 실행 가능한 작업 목록으로 분해.
  • Implement(구현): 각 작업을 코드로. 여기서 agent가 가장 자율적으로 일한다.

핵심 규칙: 결과가 틀리면 코드를 직접 고치지 말고 위 단계(spec/plan)를 고치고 다시 생성한다. 명세가 단일 진실 공급원(source of truth)이다.

SDD가 빛나는 곳 / 아닌 곳

쓴다안 쓴다
오래 유지보수할 프로덕션 코드버릴 프로토타입
여러 사람/agent가 협업5분짜리 일회성 스크립트
요구사항이 복잡하거나 모호요구사항이 자명함
규제·보안·데이터가 걸린 기능순수 탐색·실험

Test-Driven Development (TDD)

한 줄 정의: 코드를 쓰기 전에 실패하는 테스트를 먼저 쓰고(Red), 통과시키고(Green), 정리한다(Refactor).

agent 시대에 TDD의 의미가 더 커졌다. 테스트는 agent에게 “완료”와 “정확함”을 기계적으로 검증해 주는 계약이기 때문이다.

  • 사람이 테스트(또는 수용 기준)를 정의 = “옳음의 정의”를 사람이 쥔다.
  • agent는 그 테스트를 통과시키는 구현을 자유롭게 만든다.
  • 테스트가 통과하면 사람은 모든 줄을 읽지 않고도 동작을 신뢰할 근거가 생긴다.

agent에게 자율성을 더 주고 싶다면, 더 좋은 테스트를 써라. 검증이 자동화될수록 사람은 “in-the-loop(매 단계 승인)“에서 “on-the-loop(감독·개입)“으로 물러날 수 있다. → 04 경계 기준 참고.

agent와 TDD의 함정

  • agent는 테스트를 통과시키려고 테스트 자체를 약화시키거나, 구현이 아니라 테스트를 고치는 지름길을 택할 수 있다. → 사람은 “테스트가 올바른 것을 검증하는지”를 리뷰해야 한다. 통과 여부보다 테스트의 내용이 중요하다.
  • 따라서 TDD에서 사람이 끝까지 쥐어야 할 것은 수용 기준과 테스트의 의도다.

SDD + TDD 결합

둘은 서로 다른 질문에 답하므로 함께 쓴다:

답하는 질문산출물누가 주도
SDD무엇을, 왜 만드나?spec / plan / tasks사람
TDD옳게 만들었나?테스트, 수용 기준사람이 정의, agent가 구현

결합 흐름:

  1. Spec에 수용 기준을 측정 가능하게 적는다. (“3초 안에 응답”, “잘못된 입력은 400을 반환”)
  2. Plan에서 그 기준을 검증할 테스트 전략을 정한다.
  3. Tasks의 각 작업을 “테스트 작성 → 구현” 쌍으로 분해한다.
  4. Implement에서 agent가 Red-Green-Refactor를 돌린다. 테스트가 가드레일이 된다.

비교 요약

Vibe codingSDDTDD
출발점즉흥 프롬프트명세 문서실패하는 테스트
진실 공급원사람의 머릿속spec 문서테스트 스위트
agent 자율성높음(통제 약함)중간(명세가 통제)높음(테스트가 통제)
적합탐색·프로토타입유지보수할 제품정확성이 중요한 로직
위험유지보수 부채초기 오버헤드나쁜 테스트=거짓 안심

다음: SDD를 도구로 자동화하는 03-speckit.md.

← 목록으로