SDD(명세 기반 개발)란 무엇인가?
SDD(Specification-Driven Development)는 시스템이 무엇을 해야 하는지 먼저 명확하게 정의하고, 그 명세를 기준으로 설계·구현·테스트를 진행하는 개발 방식입니다.
쉽게 말하면 코드를 먼저 작성한 다음 문서를 맞추는 것이 아니라, 다음과 같은 순서로 개발하는 방식입니다.
요구사항 → 명세 작성 → 설계 및 작업 계획 → 구현 → 명세 기반 검증
SDD에서 명세는 단순한 참고 문서가 아닙니다. 개발자, 기획자, 테스트 담당자, 이해관계자가 함께 사용하는 개발의 단일 기준점(Source of Truth) 역할을 합니다.
1. SDD의 핵심 개념
SDD의 핵심은 구현을 시작하기 전에 성공 조건을 명확하게 정의하는 것입니다.
개발자는 개인적인 해석이나 추측이 아니라 합의된 명세를 기준으로 기능을 구현합니다. 테스트와 코드 리뷰 역시 동일한 명세를 기준으로 진행합니다.
따라서 SDD에서는 다음 질문에 명확하게 답할 수 있어야 합니다.
● 이 기능은 어떤 문제를 해결하는가?
● 누가 이 기능을 사용하는가?
● 어떤 조건에서 어떻게 동작해야 하는가?
● 오류나 예외가 발생하면 어떻게 처리해야 하는가?
● 기능이 완성되었다고 판단할 기준은 무엇인가?
● 이번 개발에서 제외되는 범위는 무엇인가?
2. SDD의 일반적인 진행 과정
① 요구사항 정의
먼저 해결하려는 문제와 대상 사용자를 명확하게 정의합니다.
기능의 목표뿐만 아니라 개발 범위에 포함되지 않는 항목도 함께 기록하는 것이 중요합니다.
② 명세 작성
기능의 동작 방식, 입력값과 출력값, 오류 처리, 예외 상황, 제약 조건 등을 구체적으로 정의합니다.
이때 명세는 누구나 같은 의미로 이해할 수 있도록 작성해야 하며, 가능하면 측정하고 테스트할 수 있는 형태로 표현해야 합니다.
③ 설계 및 작업 분해
작성된 명세를 바탕으로 데이터 구조, API, 화면 흐름, 권한, 모듈 구성 등을 설계합니다.
이후 명세의 각 항목을 실제로 구현할 수 있는 작은 작업 단위로 나눕니다.
④ 구현
개발자는 승인된 명세를 기준으로 코드를 작성합니다.
구현 과정에서 요구사항 변경이 발생하면 코드만 수정하는 것이 아니라 명세도 함께 변경하고 다시 합의해야 합니다.
⑤ 검증
테스트와 리뷰를 통해 구현 결과가 명세를 충족하는지 확인합니다.
단순히 코드가 정상적으로 실행되는지만 보는 것이 아니라, 정의된 요구사항과 인수 조건을 모두 만족하는지 검증합니다.
3. 좋은 명세에 포함되어야 할 내용
좋은 명세에는 일반적으로 다음 내용이 포함됩니다.
● 기능의 목적
● 대상 사용자
● 사용자 시나리오
● 기능 실행 전 필요한 조건
● 정상적인 동작 과정
● 입력값과 출력값
● 유효성 검사 규칙
● 오류 및 예외 처리 방식
● 권한과 보안 조건
● 성능과 호환성 등의 비기능 요구사항
● 기능 완료 여부를 판단하는 인수 조건
● 명시적으로 지원하지 않는 범위
4. 좋은 명세와 모호한 명세의 차이
다음과 같은 요구사항은 다소 모호합니다.
“비밀번호를 여러 번 틀리면 계정을 잠근다.”
이 문장만으로는 몇 번 실패했을 때 계정을 잠글지, 잠금 시간이 얼마나 되는지, 잠금 상태에서 어떤 메시지를 보여줄지 알기 어렵습니다.
이를 SDD 방식으로 구체화하면 다음과 같습니다.
“동일 계정에서 10분 이내에 로그인 인증이 5회 실패하면 계정을 30분 동안 잠근다. 잠금 상태에서는 올바른 비밀번호를 입력해도 로그인을 거부하며, 사용자에게 남은 잠금 시간을 표시한다. 관리자는 계정 잠금을 즉시 해제할 수 있다.”
이처럼 명세를 작성하면 개발자는 구현 조건을 정확히 알 수 있고, 테스트 담당자는 명세를 바탕으로 테스트 항목을 만들 수 있습니다.
5. 좋은 명세의 조건
좋은 명세는 명확하고, 구체적이며, 검증 가능해야 합니다.
예를 들어 다음과 같은 표현은 기준이 모호합니다.
“서비스가 빠르게 동작해야 한다.”
이를 다음과 같이 변경하면 측정과 검증이 가능해집니다.
“로그인 요청의 95%는 500밀리초 이내에 처리되어야 한다.”
즉, 좋은 명세는 사람마다 다르게 해석할 수 있는 표현을 줄이고, 테스트를 통해 충족 여부를 확인할 수 있어야 합니다.
6. SDD와 TDD·BDD의 차이
SDD
시스템이 무엇을 만족해야 하는가?를 중심으로 개발합니다.
주요 결과물은 요구사항 문서, 기능 명세서, API 명세, 데이터 규칙 등입니다.
TDD
작성한 코드가 올바르게 동작하는가?를 중심으로 개발합니다.
테스트를 먼저 작성한 뒤 해당 테스트를 통과하도록 코드를 구현합니다.
BDD
사용자의 관점에서 시스템이 어떤 행동을 보여야 하는가?를 중심으로 개발합니다.
사용자 행동과 기대 결과를 시나리오 형태로 표현합니다.
SDD, TDD, BDD는 서로 완전히 대체하는 방식이 아닙니다.
예를 들어 SDD로 기능과 요구사항을 정의하고, BDD로 사용자 시나리오를 작성한 뒤, TDD로 세부 기능을 구현할 수 있습니다.
7. SDD의 장점
● 요구사항에 대한 해석 차이를 줄일 수 있습니다.
● 필수 기능의 구현 누락을 예방할 수 있습니다.
● 불필요한 기능이 추가되는 것을 줄일 수 있습니다.
● 테스트와 코드 리뷰의 기준이 명확해집니다.
● 요구사항 변경 시 영향을 받는 범위를 파악하기 쉬워집니다.
● 신규 구성원이 프로젝트를 이해하기 쉬워집니다.
● AI 코딩 도구에 더 정확한 개발 지시를 제공할 수 있습니다.
● API 명세를 활용하면 코드, 문서, 데이터 검증 로직의 일부를 자동으로 생성할 수 있습니다.
8. SDD의 한계와 주의점
SDD가 항상 장점만 있는 것은 아닙니다.
● 명세를 작성하고 검토하는 데 초기 비용이 필요합니다.
● 요구사항이 자주 변경되면 명세 관리 비용이 커질 수 있습니다.
● 지나치게 상세한 명세는 오히려 개발 속도를 늦출 수 있습니다.
● 명세와 코드가 따로 관리되면 서로 다른 상태가 될 수 있습니다.
● 잘못된 명세를 기준으로 개발하면 구현도 정확하게 잘못될 수 있습니다.
따라서 모든 내용을 처음부터 완벽하게 고정하려 하기보다, 현재 의사결정과 구현에 필요한 수준까지 명세한 뒤 개발 과정에서 지속적으로 갱신하는 방식이 현실적입니다.
명세는 한 번 작성하고 끝나는 문서가 아니라 코드와 함께 발전하는 살아 있는 문서로 관리해야 합니다.
9. AI 개발에서 SDD가 중요한 이유
AI 코딩 환경에서 명세는 AI에게 제공되는 고품질 개발 컨텍스트 역할을 합니다.
명세가 구체적일수록 AI가 요구사항을 임의로 추측하거나 필요하지 않은 기능을 추가할 가능성이 줄어듭니다.
AI를 활용한 SDD 과정은 다음과 같이 구성할 수 있습니다.
아이디어 → 요구사항과 제외 범위 정의 → 검증 가능한 기능 명세 작성 → 구현 계획 수립 → AI 또는 개발자의 구현 → 명세 기반 테스트와 리뷰
다만 AI가 명세와 코드를 모두 작성하고, 동일한 AI가 다시 검증하면 처음의 오류가 반복될 수 있습니다.
따라서 보안, 결제, 개인정보 처리 등 중요한 기능에는 사람의 검토나 별도의 테스트·리뷰 단계를 두는 것이 좋습니다.
10. 실무에서 사용할 수 있는 간단한 명세 양식
처음부터 복잡한 명세 관리 체계를 만들 필요는 없습니다.
기능 하나를 개발할 때 다음 항목부터 작성해도 충분합니다.
기능명 : 구현할 기능의 이름을 작성합니다.
목적 : 이 기능이 해결하려는 문제와 필요한 이유를 작성합니다.
대상 사용자 : 이 기능을 사용하는 사람이나 시스템을 작성합니다.
사전 조건 : 기능을 실행하기 전에 충족되어야 하는 조건을 작성합니다.
정상 동작 과정 : 사용자가 기능을 실행했을 때의 기본 흐름을 작성합니다.
예외 및 경계 조건 : 오류 상황, 입력값 한계, 권한 부족 등의 상황을 작성합니다.
입력값과 출력값 : 기능에 전달되는 값과 처리 결과를 작성합니다.
인수 조건 : 어떤 상태가 되었을 때 기능이 완성되었다고 판단할지 작성합니다.
제외 범위 : 이번 개발에서 구현하지 않는 내용을 작성합니다.
관련 테스트 : 명세를 검증할 테스트 항목을 작성합니다.
SDD를 한 문장으로 정리하면 다음과 같습니다.
“구현을 시작하기 전에 성공 조건을 명확하게 정의하고, 코드·테스트·리뷰가 동일한 명세를 기준으로 움직이도록 하는 개발 방식”입니다.
SDD의 목적은 문서를 많이 만드는 것이 아닙니다.
가장 중요한 목적은 사람과 개발 도구가 같은 목표를 이해하고, 구현 결과가 처음에 합의한 요구사항을 정확하게 충족하도록 만드는 것입니다.