요구사항 명세서 작성 가이드
Template
ID 체계
- 코드
{도메인}-{요구사항 타입}-{번호} - 도메인 코드 및 요구사항 타입코드 참고
요구사항 설명 작성 수준
적절한 수준 (권장):
- 누가(액터) + 무엇을(행위) + 핵심 비즈니스 로직
- 중요한 비즈니스 정보 포함
- UI/구현 상세는 제외
좋은 예:
- ✅ "운영자가 아웃바운드 콜을 완료 상태로 변경할 수 있다. 완료 시 완료 사유와 메모를 기록한다."
- ✅ "시스템은 매일 자정에 미완료 콜 목록을 조회하여 알림을 발송한다."
- ✅ "사용자가 콜 메모를 작성할 수 있다. 메모는 최대 500자까지 입력 가능하다."
나쁜 예:
- ❌ "사용자가 콜을 완료할 수 있다" (너무 간단, 비즈니스 로직 없음)
- ❌ "사용자가 콜 상세 화면(/calls/:id)에서 '완료' 버튼을 클릭하면 CompleteCallModal이 나타나고..." (너무 상세, 구현 포함)
- ❌ "PUT /api/calls/:id/complete를 호출하여 call.status를 'COMPLETED'로..." (구현 수준)
기능 그룹 분류 방법
업무 흐름 중심으로 분류:
기능을 사용자의 업무 프로세스 순서대로 그룹화
예시 - 아웃바운드 콜 관리:
- 1.1 콜 생성 및 스케줄링
- 1.2 콜 실행 및 처리
- 1.3 콜 결과 관리 및 분석
분류 시 고려사항:
- Aggregate 경계가 아닌 업무 흐름 기준
- 사용자가 이해하기 쉬운 순서
비기능 요구사항 작성 시점
비기능 요구사항 섹션은 Optional
작성이 필요한 경우:
- 명시적인 성능 기준이 있을 때 (예: 응답시간 1초 이내)
- 특정 보안 요구사항이 있을 때 (예: 데이터 암호화, 접근 로그)
- 가용성, 확장성 등 명확한 기준이 있을 때
작성하지 않아도 되는 경우:
- 일반적인 웹 애플리케이션 수준의 성능이면 충분한 경우
- 제약사항으로 표현 가능한 경우
제약사항 카테고리 구분
제약사항은 3가지 카테고리로 분류:
1. 권한 제약 (CR-001~099)
- 누가 무엇을 할 수 있는지에 대한 제약
- 예: "운영자만 콜을 완료 처리할 수 있다"
- 예: "본인이 작성한 메모만 수정할 수 있다"
2. 데이터 제약 (CR-101~199)
- 데이터 처리 방식에 대한 제약
- 예: "소프트 삭제만 허용한다"
- 예: "개인정보는 암호화하여 저장한다"
- 예: "데이터는 최대 3년간 보관한다"
3. 시스템 제약 (CR-201~299)
- 시스템 동작 방식에 대한 제약
- 예: "배치 처리는 매일 자정에 실행된다"
- 예: "동시 접속자는 최대 100명으로 제한한다"
가정사항 vs 제약사항 구분
제약사항 (Constraint):
- 확정된 규칙이나 제한
- "~해야 한다", "~만 가능하다"
- 예: "사용자는 한 번에 하나의 콜만 처리한다"
- 예: "데이터는 최대 3년간 보관한다"
가정사항 (Assumption):
- 불확실하지만 설계의 전제로 두는 사항
- "~일 것이다", "~가 필요할 수 있다"
- 향후 실제 요구사항으로 전환될 가능성
- 예: "사용자는 국제화/지역화가 필요할 것이다"
- 예: "향후 모바일 앱 지원이 필요할 수 있다"
판단 기준:
- 지금 당장 구현해야 하는가? → 제약사항
- 미래에 필요할 수도 있는가? → 가정사항
- 확정된 정책/규칙인가? → 제약사항
- 예상/추정/가능성인가? → 가정사항