소프트웨어 개발 생명 주기

폭포수 모형

  • 이 글은 이렇게 하면 나도 프로그램을 잘 만들 수 있다 [C and JAVA 프로그래밍 입문] - 1 을 보고 학습하여 스스로 정리한 내용입니다

여러 가지 개발 모형들이 있으나 일반적으로 소규모 소프트웨어 개발에서 적용하는 개발 모형은 폭포수 모형(Waterfall Model)이다

  • 폭포수 모형은 소프트웨어 개발 모형의 하나
    • 개발 공정을 요구 사항 분석, 기본 설계, 상세 설계, 구현, 시험 및 유지 보수의 몇 단계로 구분
      • 단계별로 구분하여 각 단계의 성과를 문서로 명확하게 확정한 다음에 다음 단계로 넘어가는 체계적이며 순차적인 접근 방법을 사용하는 개발 모형

소프트웨어 개발 각 단계를 조금 더 상세히 설명해 보면 다음과 같다

  • 타당성 조사(Feasibility)

    • 소프트웨어 개발 및 전산 시스템을 도입하려고 할 때 기술, 경제, 운영, 일정 및 동기적 타당성 조사를 통하여 이익을 얻을 수 있고, 위험을 감소시키고 수익을 증대시킬 수 있는가 여부를 조사하는 단계
  • 예측(Estimation)

    • 소프트웨어를 개발하는데 필요한 시간과 자원(인력, 예산, 하드웨어, 소프트웨어)의 소요량을 추정하는 단계
  • 계획(Planning)

    • 소프트웨어 개발 프로젝트의 전 과정에 걸쳐 일정과 예산에 대한 계획안을 수립하는 단계
      • 계획 내용으로 프로젝트의 목적과 범위, 기대 효과와 관리상의 목표, 통제과정과 처리절차 및 자금, 인력, 장비, 시간의 소요량, 투입기간 등
  • 요구사항 분석(Requirements Analysis)

    • 개발하고자 하는 업무를 면밀히 조사, 이해하여 사용자의 요구사항을 정의해 소프트웨어 요구사항 명세서를 만든다
    • 분석단계에서는 개발된 소프트웨어가 무엇(What)을 할 것인가만 나타내야지 어떻게(How) 할 것인가의 구체적 방법론은 다음 설계단계로 미루어야 한다
    • 대표적인 요구사항 분석 기법으로 객체 지향 분석(Object Oriented Analysis, OOA), 구조적 분석(Structured Analysis)이 있다
  • 설계(Design)

    • 시스템의 개념적 측면(What)을 구체적(How)으로 명세화하는 단계
      • 외부적인 특성(화면설계, 출력물설계, 파일 또는 데이터베이스 설계 등)을 설계하는 외부설계(External Design)
      • 포괄적인 기능을 세부기능으로 분할해서 내부처리 기능을 나타내고, 자료를 정의하는 내부설계(Internal Design)
        • 이 두 가지가 있다
  • 내부설계 (Internal Design)

    • 내부설계는 다시 일반 설계과 상세 설계로 나누어 진다
    • 일반 설계(General Design)
      • 내부설계는 전체 소프트웨어의 구조를 기능별로 분해해 계층적으로 나타내는 일반설계(General Design)
    • 상세 설계(Detail Design)
      • 각 기능별 모듈(Module)의 내부처리 기능을 순서도(Flow chart)
      • 나씨-슈나이더만 차트(Nassi-Schneiderman Chart, NS-Chart)
      • 의사코드(Peseudo code)
모듈(Module)
- 잘 정의된 한 가지 일을 수행하는 프로그램의 논리적인 일부분

설계단계는 코딩(구현)의 준비단계일 뿐만 아니라 테스트 계획과 유지보수에 대한 청사진까지도 나타내야 한다

  • 대표적인 설계기법으로 객체 지향 설계(Object Oriented Design, OOD)와 구조적 설계(Structured Design)가 있다

  • 구현(Implementation)

    • 설계 내용을 토대로 적합한 프로그래밍 언어로 각 모듈을 코딩(coding)하고 단위 모듈 테스트(Unit Test)한 후 모듈들을 결합해서 총체적인 시스템으로 만드는 단계
    • 유지보수하기 좋은 소프트웨어를 구현하기 위해서 절차적(혹은 구조화) 프로그래밍 기법을 사용 추천
    • 모듈의 재사용성(Re-usability)을 고려한다면 객체 지향 프로그래밍(Object Oriented Programming, OOP) 기법을 사용 추천
  • 시스템 테스트(Testing)

    • 구현된 전체 시스템이 설계 내용과 같은 기능을 수행하는지 기능의 정확성, 신뢰성 및 효율성 등에 대해 여러 가능한 경우를 가정해 실행해 보고 결과를 평가하는 단계
  • 평가

    • 프로젝트가 예상대로 진행되었는가, 개발된 시스템이 사용자의 필요를 만족시킬 수 있도록 개발되었는가를 검토
    • 프로젝트의 경험을 축적하여 다음 프로젝트의 예측 및 계획의 자료로 활용
    • 발생 가능한 유지보수 사항의 예측 및 준비를 위해 꼭 필요한 단계
  • 유지보수(Maintenance)

    • 개발이 완료되어 사용자가 운영하고 있는 시스템에 대해 일어나는 모든 변화에 대처해서 수정하는 것을 말한다
    • 소프트웨어 비용 중 67%를 차지, 다른 어떤 단계보다도 가장 중요한 단계
    • 오늘날 소프트웨어 개발 개념은 유지보수하기 좋은 소프트웨어를 개발하는데 최우선 목표를 두고 있다
  • 유지보수 취지

  • 소프트웨어는 컴퓨터가 아니라 사람이 만든다
  • 어떤 사람이라도 간단한 문제를 단 한 번의 생각으로 완벽한 해답을 구한다는 것은 불가능하다
  • 그렇지만 문제를 해결하는데 있어서 단계들을 나누고, 단계마다 문제 해결에 집중할 내용을 정하고, 하나 하나씩 해결해 간다면 주어진 문제들을 다 해결할 수 있다
  • 이러한 점을 반영하여 소프트웨어를 만들 때도 하나씩 나누어서 생각하도록 단계들을 개략적으로 나누고, 단계마다 집중할 내용을 정리해 놓음으로 해서 품질이 좋은 소프트웨어를 만들자는 취지이다

학습 후 나의 생각

소프트웨어의 개발 생명 주기에 대한 생각을 깊이 해보지도 않았고 이러한게 있는 줄도 몰랐다
소프트웨어를 개발한다고 하면 그냥 프로그래밍 언어를 배우고 그 언어로 프로그램을 짜서 배포한다 라는 것만 알지
처음 개발 공부를 시작하는 사람인 나는 이러한 중요 개념이 있다는 것을 몰랐다
어떠한 것이든 기초와 기반이 다져지지 않는다면 쉽게 무너지고 쉽게 없어진다고 알고있다
소프트웨어의 개발 생명 주기에 대한 개념을 조금 더 상세히 공부할 필요가 있다고 느꼈다