반복적 (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)마다 분석, 설계, 구현, 테스트 단계를 거친다.
- 피드백 중심: 각 반복 후 사용자 피드백을 받아 다음 반복에 반영.
- 유연성: 요구사항 변경에 유연하게 대응할 수 있다.
- 위험 감소: 초기 반복에서 주요 위험을 식별하고 해결할 수 있다.
장점
- 조기 결과 확인: 초기 반복에서부터 작동하는 소프트웨어를 볼 수 있다.
- 유연한 변경 관리: 요구사항 변경을 다음 반복에 쉽게 반영할 수 있다.
- 위험 감소: 주요 위험을 초기에 식별하고 해결할 수 있다.
- 사용자 참여 증가: 지속적인 피드백으로 사용자 참여도가 높아진다.
- 품질 향상: 반복적인 테스트와 개선으로 전반적인 품질이 향상된다.
단점
- 관리 복잡성: 여러 반복을 관리하는 것이 복잡할 수 있다.
- 시간 소요: 여러 번의 반복으로 인해 전체 개발 기간이 길어질 수 있다.
- 문서화 부족: 빈번한 변경으로 인해 문서화가 충분히 이루어지지 않을 수 있다.
- 초기 계획의 어려움: 전체 프로젝트의 정확한 범위와 일정을 초기에 예측하기 어려울 수 있다.
적합한 프로젝트 유형
- 요구사항이 명확하지 않거나 자주 변경될 수 있는 프로젝트
- 새로운 기술이나 도메인을 다루는 프로젝트
- 사용자 피드백이 중요한 프로젝트
- 대규모 프로젝트를 관리 가능한 단위로 나누어 진행하고자 할 때