반복적 (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

주요 단계

  1. 초기 계획 단계

    • 프로젝트의 전체적인 범위 정의
    • 주요 요구사항 식별
    • 전체 아키텍처 초안 수립
    • 반복 주기 계획 수립
  2. 반복 단계 (각 반복마다 수행)

    1. 요구사항 분석
      - 현 반복에서 구현할 요구사항 상세화
      - 우선순위 결정
      - 범위 확정
    2. 설계
      - 아키텍처 상세화
      - 컴포넌트 설계
      - 인터페이스 정의
    3. 구현
      - 코드 작성
      - 단위 테스트 수행
      - 통합 작업
    4. 테스트
      - 통합 테스트
      - 시스템 테스트
      - 사용자 피드백 수집
    5. 평가
      - 목표 달성도 검토
      - 리스크 평가
      - 다음 반복 계획 수립
  3. 최종 단계

    • 전체 시스템 통합
    • 최종 테스트
    • 배포 준비
    • 사용자 교육

특징

  1. 점진적 개발: 시스템을 여러 개의 작은 부분으로 나누어 개발.
  2. 반복적 프로세스: 각 반복(iteration)마다 분석, 설계, 구현, 테스트 단계를 거친다.
  3. 피드백 중심: 각 반복 후 사용자 피드백을 받아 다음 반복에 반영.
  4. 유연성: 요구사항 변경에 유연하게 대응할 수 있다.
  5. 위험 감소: 초기 반복에서 주요 위험을 식별하고 해결할 수 있다.

장점

  1. 조기 결과 확인: 초기 반복에서부터 작동하는 소프트웨어를 볼 수 있다.
  2. 유연한 변경 관리: 요구사항 변경을 다음 반복에 쉽게 반영할 수 있다.
  3. 위험 감소: 주요 위험을 초기에 식별하고 해결할 수 있다.
  4. 사용자 참여 증가: 지속적인 피드백으로 사용자 참여도가 높아진다.
  5. 품질 향상: 반복적인 테스트와 개선으로 전반적인 품질이 향상된다.

단점

  1. 관리 복잡성: 여러 반복을 관리하는 것이 복잡할 수 있다.
  2. 시간 소요: 여러 번의 반복으로 인해 전체 개발 기간이 길어질 수 있다.
  3. 문서화 부족: 빈번한 변경으로 인해 문서화가 충분히 이루어지지 않을 수 있다.
  4. 초기 계획의 어려움: 전체 프로젝트의 정확한 범위와 일정을 초기에 예측하기 어려울 수 있다.

적합한 프로젝트 유형

  • 요구사항이 명확하지 않거나 자주 변경될 수 있는 프로젝트
  • 새로운 기술이나 도메인을 다루는 프로젝트
  • 사용자 피드백이 중요한 프로젝트
  • 대규모 프로젝트를 관리 가능한 단위로 나누어 진행하고자 할 때

참고 및 출처