소프트웨어 공학
소프트웨어 제작 과정 전체에서 '프로그램 코딩(coding)' 단계는 10~20% 정도만을 차지하는 단계이다. 즉, 소프트웨어 작성을 위해서는 프로그램 코딩(프로그램 구현) 작업 이외에도 더 많은 다른 작업이 필요하다는 의미다. 지금부터는 소프트웨어 제작의 모든 단계를 고민하는 소프트웨어 공학에 대해서 알아봅시다.
소프트웨어는 점차 복잡해지는 반면, 그것에 대처할 수 있는 소프트웨어 개발 및 관리 기술이 뒤따르지 못하기 때문에 '소프트웨어의 위기' 라는 말이 생기게 되었는데, 그 원인으로는 전통적인 공학 분야에서 사용되는 기본적인 설계 절차를 밞지 않고 주먹 구구 방식으로 소프트웨어를 제작하고 있었다는 의견이 제시되고, 소프트웨어의 개발에 구조적 프로그래밍 (Sturctured programming) 과 같은 공학적 접근 방법이 도입되기에 이르렀다.
이러한 과정을 거쳐서 '소프트웨어 공학' 이라는 분야가 생기기 사작하였습니다. 이러한 흐름에 따라서, 소프트웨어 공학은 점점 고객의 요구 분석과 설계에 더 많은 시간과 인력을 투자하게 되고, 프로그램을 잘 만든다는 것은 고객의 요구를 잘 파악하고 유지 보수 단계까지 신경을 써서 설계한 것이라고 말할 수 있기 때문이다. 또한 프로그램은 특성상 자주 수정해야 할 일이 생기는데, 설계 단계에서 이를 신경 쓰지 않았더라면 당시에는 좋은 프로그램이 될 수 있을지라도 후에 문제가 생길 우려가 많다.
소프트웨어 공학의 기본 원칙
- 현대적인 프로그래밍 기술을 계속적으로 적용해야 합니다.
- 개발된 소프트웨어의 품질이 유지되도록 지속적으로 검증해야 합니다.
- 소프트웨어 개발 관련 사항 및 결과에 대한 명확한 기록을 유지해야 합니다.
소프트웨어 생명 주기
요구 사항 분석
- 개발할 소프트웨어의 기능, 목표, 조건, 등을 소프트웨어 사용자와 함계 정의한다.
- 소프트웨어의 성격과 목적을 정확히 이해하고 필요한 자원과 예산을 예상한다.
기능 요구사항
개념: 시스템이 요구하는 기능, 서비스에 대한 요구사항
특징: 기능성, 완전성, 일관성
예) 사용자는 회원가입을 통해 계정을 생성할 수 있어야한다. 시스템은 24시간 내내 실시간 채팅을 지원해야한다.
비기능 요구사항
개념: 시스템이 수행하는 기능 이외의 사항
특징: 신뢰성, 사용성, 효율성, 유지보수성, 보안성
예) 시스템은 1초 이내에 응답해야 한다. 데이터는 하루에 1회 자동으로 백업되어야 한다.
시스템 명세
- 소프트웨어의 입력, 처리과정, 출력 결과를 정의한다. 이를 시스템 명세라고 한다.
- 이를 바탕으로 기능 명세서를 작성하고, 시스템이 어떤 동작을 수행해야 하는지 정리한다.
설계
- 소프트웨어가 정의된 기능을 잘 수행할 수 있도록 소프트웨어의 수행 과정을 논리적, 체계적으로 결정한다.
- 이 단계는 다음과 같이 나눌 수 있다.
- 아키텍처 설계 : 소프트웨어의 구조와 모듈 간 관계를 정의한다.
- 상세 설계 : 각 기능을 수행하기 위한 세부 알고리즘과 데이터 흐름을 설계한다.
- UI/UX 설계: 사용자 경험을 고려하여 화면 및 인터페이스 구조를 설계한다.
구현
- 실제의 프로그래밍 언어로 프로그램을 작성하는 단계이다
- 프로그래밍 언어 선정, 프로그래밍 기법 및 순서 등을 결정하고 구현한다.
테스트
- 구현된 소프트웨어의 기능을 테스트하는 단계이다.
- 시스템의 요구 사항을 만족하는지 실행 결과가 정확한지 등을 검사하여 시스템의 완성도를 높이는 단계이다.
유지보수
- 시스템이 설치된 후 일어나는 모든 활동을 의미한다.
- 일반적으로 소프트웨어 생명 주기 중에서 가장 긴 기간이 소요되는 단계이다.
- 시스템 개발 초기에 유지 보수에 대한 면밀한 계획을 세우지 않았더라면 유지 보수 비용이개발 비용보다 더 소요될 수도 있다.
소프트웨어 생명 주기 모델
일반적으로 사용되는 소프트웨어 생명 주기 모형에는 폭포수 모형, 프로토타입 모형, 나선형 모형, 애자일 모형 등이 있다.
폭포수 모형
소프트웨어 개발도 이전 단계롤 돌아갈 수 없다는 전제하에 각 단계를 확실히 매듭 짓고 그 결과를 철저하게 검토하여 승인 과정을 거친 후 다음 단계를 진행하는 개발 방법론이다.
- 소프트웨어 공학에서 가장 오래되고 가장 폭넒게 사용된 전통적인 소프트웨어 생명 주기 모형으로 고전적 생명 주기 모형이라고도 한다.
- 소프트웨어 개발 과정의 한 단계가 끝나야만 다음 단계로 넘어갈 수 있는 선행 순차적 모형이다.
- 두 개 이상의 과정이 병행하여 수행되지 않는다.
타당성 검토 -> 계획 -> 요구 분석 -> 설계 -> 구현 -> 시험 -> 유지보수
프로토타입 모형
소프트웨어에 대한 견본(시제)품(Prototype)을 만들어 최종 결과물을 예측하는 모형이다.
- 시스템의 일부 혹은 시스템의 모형을 만드는 과정으로서 요구된 소프트웨어를 구현하는데, 이는 추후 구현 단계에서 사용될 골격 코드가 된다.
- 새로운 요구사항이 도출될 때마다 이를 반영한 프로토타입을 새롭게 만들면서 소프트웨어를 구현한다.
- 단기
나선형 모형
나선형 모형은 보햄(Boehm)이 제안한 것으로, 폭포수 모형과 프로토타입 모형의 장점에 위험 분석 기능을 추가한 모형이다.
- 나선을 따라 돌듯이 여러 번의 소프트웨어 개발 과정을 거쳐 점진적으로 완벽한 최종 소프트웨어를 개발하는 것으로, 점진적 모형이라고도 한다.
- 소프트웨어를 개발하면서 발생할 수 있는 위험을 관리하고 최소화하는 것을 목적으로 한다.
- 핵심 기술에 문제가 있거나 사용자의 요구사항이 이해하기 어려운 경우에 적합한 모형이다.
애자일 모형(Agile Model)
애자일(Agile)은 '민첩한, '기민한' 이라는 의미로, 고객의 요구사항 변화에 유연하게 대응할 수 있도록 일정한 주기를 반복하면서 개발과정을 진행한다.
- 애자일 모형은 어느 특정 개발 방법론이 아니라 좋은 것을 빠르고 낭비 없게 만들기 위해 고객과의 소통에 초점을 맞춘 방법론을 통칭한다.
- 애자일 모형은 스프린트(Sprint) 또는 이터레이션(Iteration)이라고 불리는 짦은 개발 주기를 반복하여, 반복되는 주기마다 만들어지는 결과물에 대한 고객의 평가와 요구를 적극 수용한다.
- 애자일 모형을 기반으로 하는 소프트웨어 개발 모형에는 스크럼(Scrum) XP(eXtream Programming) 등이 있다.