반복적 (Iterative) 모델
전체 시스템을 여러 개의 작은 부분으로 나누어 반복적으로 개발하고 개선하는 방법
복잡한 프로젝트를 관리하기 쉬운 작은 단위로 나누어 진행하며, 각 반복마다 시스템의 일부를 개발하고 테스트한다.
graph TD
%% 초기 계획 단계
Start([프로젝트 시작]) --> IP[초기 계획]
subgraph InitialPhase [초기 계획 단계]
IP --> IP1[프로젝트 범위 정의]
IP --> IP2[주요 요구사항 식별]
IP --> IP3[아키텍처 초안 수립]
IP --> IP4[반복 주기 계획 수립]
end
%% 반복 개발 단계
IP4 --> IterationStart{반복 시작}
subgraph IterationPhase [반복 단계]
%% 요구사항 분석
RA[요구사항 분석] --> RA1[요구사항 상세화]
RA1 --> RA2[우선순위 결정]
RA2 --> RA3[범위 확정]
%% 설계
RA3 --> DE[설계]
DE --> DE1[아키텍처 상세화]
DE1 --> DE2[컴포넌트 설계]
DE2 --> DE3[인터페이스 정의]
%% 구현
DE3 --> IM[구현]
IM --> IM1[코드 작성]
IM1 --> IM2[단위 테스트]
IM2 --> IM3[통합 작업]
%% 테스트
IM3 --> TE[테스트]
TE --> TE1[통합 테스트]
TE1 --> TE2[시스템 테스트]
TE2 --> TE3[사용자 피드백]
%% 평가
TE3 --> EV[평가]
EV --> EV1[목표 달성도 검토]
EV1 --> EV2[리스크 평가]
EV2 --> EV3[다음 반복 계획]
end
%% 반복 종료 결정
EV3 --> Decision{목표 달성?}
Decision -->|No| IterationStart
Decision -->|Yes| FP[최종 단계]
%% 최종 단계
subgraph FinalPhase [최종 단계]
FP --> FP1[전체 시스템 통합]
FP1 --> FP2[최종 테스트]
FP2 --> FP3[배포 준비]
FP3 --> FP4[사용자 교육]
end
FP4 --> End([프로젝트 종료])
%% 스타일링
classDef default fill:#f9f9f9,stroke:#333,stroke-width:2px
classDef phase fill:#e1f5fe,stroke:#01579b,stroke-width:2px
classDef iteration fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px
classDef decision fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef milestone fill:#e3f2fd,stroke:#1565c0,stroke-width:2px
class Start,End milestone
class IP,IP1,IP2,IP3,IP4 phase
class RA,DE,IM,TE,EV iteration
class Decision decision
class FP,FP1,FP2,FP3,FP4 phase
style InitialPhase fill:#f8f9fa,stroke:#666,stroke-width:2px
style IterationPhase fill:#f5f5f5,stroke:#666,stroke-width:2px
style FinalPhase fill:#f8f9fa,stroke:#666,stroke-width:2px
주요 단계
초기 계획 단계
- 프로젝트의 전체적인 범위 정의
- 주요 요구사항 식별
- 전체 아키텍처 초안 수립
- 반복 주기 계획 수립
반복 단계 (각 반복마다 수행)
- 요구사항 분석
- 현 반복에서 구현할 요구사항 상세화
- 우선순위 결정
- 범위 확정 - 설계
- 아키텍처 상세화
- 컴포넌트 설계
- 인터페이스 정의 - 구현
- 코드 작성
- 단위 테스트 수행
- 통합 작업 - 테스트
- 통합 테스트
- 시스템 테스트
- 사용자 피드백 수집 - 평가
- 목표 달성도 검토
- 리스크 평가
- 다음 반복 계획 수립
- 요구사항 분석
최종 단계
- 전체 시스템 통합
- 최종 테스트
- 배포 준비
- 사용자 교육
특징
- 점진적 개발: 시스템을 여러 개의 작은 부분으로 나누어 개발.
- 반복적 프로세스: 각 반복(iteration)마다 분석, 설계, 구현, 테스트 단계를 거친다.
- 피드백 중심: 각 반복 후 사용자 피드백을 받아 다음 반복에 반영.
- 유연성: 요구사항 변경에 유연하게 대응할 수 있다.
- 위험 감소: 초기 반복에서 주요 위험을 식별하고 해결할 수 있다.
장점
- 조기 결과 확인: 초기 반복에서부터 작동하는 소프트웨어를 볼 수 있다.
- 유연한 변경 관리: 요구사항 변경을 다음 반복에 쉽게 반영할 수 있다.
- 위험 감소: 주요 위험을 초기에 식별하고 해결할 수 있다.
- 사용자 참여 증가: 지속적인 피드백으로 사용자 참여도가 높아진다.
- 품질 향상: 반복적인 테스트와 개선으로 전반적인 품질이 향상된다.
단점
- 관리 복잡성: 여러 반복을 관리하는 것이 복잡할 수 있다.
- 시간 소요: 여러 번의 반복으로 인해 전체 개발 기간이 길어질 수 있다.
- 문서화 부족: 빈번한 변경으로 인해 문서화가 충분히 이루어지지 않을 수 있다.
- 초기 계획의 어려움: 전체 프로젝트의 정확한 범위와 일정을 초기에 예측하기 어려울 수 있다.
적합한 프로젝트 유형
- 요구사항이 명확하지 않거나 자주 변경될 수 있는 프로젝트
- 새로운 기술이나 도메인을 다루는 프로젝트
- 사용자 피드백이 중요한 프로젝트
- 대규모 프로젝트를 관리 가능한 단위로 나누어 진행하고자 할 때