[소프트웨어분석및설계🛠️] 1장 SW 개발 프로세스
출처 : 강의 교안, 시스템분석설계 with 애자일 (생능출판사, 최은만)
1. 소프트웨어 개발 개요
1.1 소프트웨어 개발 개요
1) 소프트웨어 개발 과정
1️⃣ 실현 가능성 분석
2️⃣ 요구사항 도출 및 분석
3️⃣ 설계
4️⃣ 코딩 및 단위 시험
5️⃣ 통합 및 시스템 시험
6️⃣ 배포, 설치 및 운영
2) 소프트웨어
- 프로그램 자체 + 프로그램의 개발, 운용, 보수에 필요한 정보 일체
- 개념적, 무형적
- 소프트웨어의 특징
- 복잡성 (complexity)
- 순응성 (conformity)
- 변경성 (changeabilty)
- 비가시성 (invisibility)
- 소프트웨어는 사람의 지적 활동에 의해 구축된다.
- 소프트웨어 개발작업의 특징
- 명세화의 어려움
- 재사용의 어려움
- 예측의 어려움
- 유지보수의 어려움
- 고품질의 어려움
2. 분석과 설계
2.1 분석과 설계
1) 분석
- 소프트웨어가 해결해야 할 문제들을 이해하기 위한 적업
- 요구분석 : 소프트웨어 개발을 의뢰한 고객이 개발될 소프트웨어에 대해 요구하는 기능과 성능을 요구사항으로 일관성 있게 정리하는 것
2) 설계
- 분석 작업을 통해 밝혀진 SW의 요구사항을 어떤 형태로 프로그램에 반영할 것인지를 결정하는 작업
- 요구사항에 기술된 문제의 솔루션을 계획
- 아키텍쳐 설계, 인터페이스 설계, 모듈 알고리즘 설계, 데이터베이스 설계
3) 분석과 설계의 방향
- 단계적 분할 (구조적 분석 설계) : 결정된 단위로 조금씩 분할
- 객체지향 분석 설계
3. SW개발 프로세스
3.1 SW개발 프로세스
1) 소프트웨어 개발의 어려움
- 소프트웨어의 특성적 어려움
- 무형성
- 진화성
- 기타 어려움
- 요구사항이 수시로 변경
- 사람에 의존하여 개발됨 ; 개인의 특성
- 의사소통의 어려움
- 프로젝트 규모에 따른 인력, 비용, 의사소통, 복잡도 등이 증가함.
- 소프트웨어 개발에 공학적 접근 방법을 적용 ; 방법론, 프로세스, 도구 사용
- 프로세스 - 방법, 절차, 공정
- 단계적 SW 개발 프로세스
- 소프트웨어에 대한 비전과 개념을 먼저 파악하고, 구현할 때까지 정해진 순서의 작업 수행
- 분석 ➡️ 설계 ➡️ 구현 ➡️ 테스트
- 각 단계별 결과물은 요구분석 명세서, 설계서, 프로그램, 매뉴얼 등으로 다양함.
4. 프로세스 모델
4.1 프로세스 모델
1) 프로세스의 정의
- 어떤 일을 하기 위한 특별한 방법으로 일반적으로 단계나 작업
2) 소프트웨어 개발 프로세스
- 소프트웨어 개발 과정 (작업 순서)
- 높은 품질과 생산성이 목표
- 프로세스가 없는 개발 = Code-and-Fix (즉흥적 개발)의 문제
- 즉흥적인 방법으로는 사용자의 높은 요구 수준에 도달하기 어려움
- 신중하게 설계하지 않으면 소프트웨어 구조가 나빠짐
- 일이 잘 되었는지 판단하기 어려움
- 비용과 일정의 조절이 어려움
- 발견되지 않은 결함을 계속 고치게 되며 시스템 악화
3) 소프트웨어 개발 프로세스 모델
- 일반적인 프로세스를 기술한 것
- 작업의 단계와 순서, 작업의 제약사항이나 조건 등을 모아 놓은 것
💙 SDLC (SW Development Life Cycle)
: 소프트웨어를 개발하는 절차, 혹은 개발단계를 반복하는 과정
💙 SW 개발은 단순 코딩이 아닌 문제 해결 과정이 되어야 한다.
4.2 전통적인 프로세스 모델
1) 폭포수 모델 (Wateffall Model)
- 각 단계가 완료된 후, 다음 단계로 진행한다.
- 이전 단계로 돌아갈 수 없다.
- 순차적 : 각 단계 사이에 중복이나 상호작용이 없다.
- 각 단계의 결과는 다음 단계가 시작되기 전에 점검한다.
- 결과물 정의가 중요하다.
- 장점
- 가장 오래되고 폭넓게 사용되어 사례가 풍부하다
- 진행과정이 세분화되고 순차적이므로 관리가 용이하다.
- 단점
- 후반부에 개발이 구체화되기 때문에 초기 중요한 문제를 발견하기 어렵다
- 한 공정이 늦어지면, 이후 전체 공정 진행에 영향을 준다.
- 적용 시 고려사항
- 관리가 상대적으로 쉬우나 요구 사항의 변경에 대한 대응력이 떨어진다.
- 요구사항이 비교젹 명확히 정의되어 있는 경우 적용한다.
2) 프로토타이핑 모델 (Prototyping Model)
- 사용자의 요구사항을 충분히 분석할 목적으로 시스템의 일부분을 일시적으로 간략히 구현
- 이후 다시 요구사항을 반영하는 과정을 반복하는 개발 모델
- 프로토타입의 역할
- 요구 분석의 어려움 해결 ; 사용자의 참여 유도
- 요구 사항 도출과 이해에 있어 사용자와의 커뮤니케이션 수단으로 활용 가능 (의사소통 도구)
- 사용자 자신이 원하는 것이 무엇인지 구체적으로 잘 모르는 경우, 간단한 시제품으로 개발
- 개발 타당성으로 검토
- 실험적(Experimental) 프로토타입 : 기존의 프로토타입을 사용하지 않고 새로 구현
- 진화적(Evolutionary) 프로토타입 : 프로토타입을 계속 확장해나가며 구현
- 장점
- 프로토타입을 통해 요구사항 도출이 용이하다
- 실제 모습을 확인할 수 있기 때문에 시스템의 이해와 품질이 향상된다
- 개발자와 사용자 간 소통이 용이하다
- 단점
- 프로토타입으로 사용자 기대수준이 올라갈 수 있다.
- 개발단계 반복으로 투입 인력 및 비용 산정이 어렵다.
- 중간 이정표나 산출물이 없어서 과정을 통제하기 어렵다.
3) 진화적(evolutionary) 모델
- 빠른 시간 안에 출시해야 할 경우에는 시스템을 나눠 릴리즈한다.
- 릴리즈할 때마다 기능의 완성도를 높인다.
- 개발된 모듈을 업그레이드하는 방식으로 SW가 진화해나가는 개념
- 장점
- 몇 가지 기능이 부족하더라도 초기에 사용이 가능하다.
- 새로운 기능을 가진 SW에 대한 시장을 빠르게 형성할 수 있다.
- 가동 중인 시스템에서 일어나는 예상치 못한 문제를 신속하고 꾸준하게 고쳐나갈 수 있다.
- 단점
- 프로젝트 관리가 복잡하다.
- 반복적인 프로세스로 실패의 위험이 크다.
4) 나선형(Spiral) 모델
- 폭포수 모델과 프로토타입 모델의 장점을 활용한다.
- 복잡해지고 있는 소프트웨어 개발 환경에 위험 요소를 분석하고 해결할 수 있도록 지원하는 모델
- 여러 번의 점증적인 릴리즈
- 장점
- 반복적인 개발 및 테스트로 강인성을 향상
- 한 사이클에 추가하지 못한 기능을 다음 단계에 추가
- 단점
- 관리 및 위험 분석이 중요하므로 매우 어렵고 개발 기간이 장기화될 수 있다.
- 적용
- 재정적 또는 기술적으로 위험 부담이 큰 경우
- 요구사항이나 아키텍쳐 이해에 어려운 경우
5) 점증적(Incremental) 모델
- 사용자 요구사항의 일부분, 제품의 일부분을 반복적으로 개발하면서 대상 범위를 확대해 나아가서 최종제품을 완성한다.
- 증분을 따로 개발한 후 통합 : 프로토타이핑과 같이 반복적이나, 각 증분마다 실행이 가능한 완성 모듈을 인도
- 규모가 큰 개발 조직일 경우 자원을 증분 개발에 충분히 할당할 수 있어 병행 개발 가능
6) V 모델
- 폭포수 모델을 확장한 Verification & Validation 모델
- 폭포수 모델이 산출물 중심이라면, V모델은 각 갭라단계를 검증하는 데 초점을 둔다.
- 장점
- 소프트웨어 개발 결과물에 대한 단계적인 검증과 확인 과정을 거친다.
- 오류를 줄일 수 있다.
- 단점
- 개발 활도에 반복이 없어 변경을 다루기 쉽지 않다.
- 적용
- 요구사항이 정확히 이해되는 작은 시스템 개발 시 유용
- 신뢰성이 높이 요구되는 분야
4.3 에자일 프로세스
1) 에자일의 기본 가치
- 프로세스와 도구 중심이 아닌 개개인의 상호소통을 중시
- 문서 중심이 아닌 실제 고객이 실행 가능한 SW 중시
- 계약과 협상 중심이 아닌 고객과의 협력 중시
- 계획 중심이 아닌 변화에 민첩한 대응을 중시
2) 에자일 12가지 원칙
- Customer satisfaction : 최우선 목표는 고객을 만족시키는 SW를 빨리 지속적으로 제공하는 것
- Welcome change : 고객의 경쟁력을 위해 요구사항의 변경을 수용
- Deliver frequently : 동작 가능한 SW를 고객에게 전달
- Working together : 업무 담당자와 개발자는 매일 의견을 주고 받으며 함꼐 참여
- Motivated team : 동기가 부여된 개인을 중심으로 프로젝트 구축
- Face to face : 개발팀에 정보를 전달하는 가장 효율적인 방법은 대면 대화
- Working SW : 진척사항을 보여주는 가장 좋은 방법은 실행 가능한 SW를 보여주는 것
- Constant pace : 지속가능한 개발을 위해서 일정한 개발 속도 유지
- Good design : 좋은 설계와 기술에 관심 가지기 ; 우수한 기술과 디자인에 대한 관심으로 민첩성 향상
- Simplicity : 단순성(수행되지 않은 작업량을 최대화하는 기술)은 필수적
- Self organization : 최고의 아키텍쳐 요구사항 및 설계는 자기조직화 팀에서 나온다.
- Reflect and adjust : 정기적으로 보다 효과적인 방법을 적용해보고 그에 따라 행동을 조율하고 조정
3) XP (eXtreme Programming)
- 모호하고 빠르게 변하는 요구사항이 발생하는 환경의 프로젝트를 수행하는 중소규모 팀을 위한 경량화된 방법론
- 실행되는 소프트웨어 기능을 고객에게 가치가 높은 것부터 순서대로 구현해서 단기간에 릴리즈하는 과정을 반복
- 특징
- 5 ~ 10명 정도로 구성된 개발자가 고객과 함께 한 장소에서 작업
- 개발은 점진적으로 이루어지고 각 단계마다 기능을 덧붙여 나감
- 요구사항 정의는 스토리 형태로 구체적으로 작성
- 프로그래머는 엄격한 코딩 규칙을 준수
- XP의 핵심 가치
- 소통 (Communication)
- 단순성 (Simplicity)
- 피드백 (Feedback)
- 용기 (Courage)
- 존경 (Respect)
- XP의 실천사항 (Practices)
- 증분계획
- 단순 설계
- 재구조화 (refactoring)
- 공동소유권
- 하나의 팀 (whole team)
- 시스템 메타포어 (system metaphor)
- 주 40시간 작업
- 작은 배포
- 테스트 주도 개발
- 페어프로그래밍
- 지속적 통합
- 코딩 표준
- XP 프로세스 흐름
- 유저스토리 (User Story) : 요구사항 정의서
- 구조적 스파이크 : 전체 시스템을 한눈에 보기 위한 모델
- 스파이크 : 일의 규모나 시간 요구량을 가늠하기 위한 솔루션 (일종의 프로토타입)
4) 스크럼
- 반복적 개발의 관리 관점을 강조
- 용어
- 스트린트 (sprint) : 반복적인 개발 주기
- 제품 백로그 (backlog) : 개발 제품에 대한 요구사항 목록
- 스프린트 백로그 : 스프린트 목표에 도달하기 위해 필요한 작업 목록
- 번다운 차트 : 작업 현황을 추적하기 위해서 사용하는 차트. 스프린트 백로그에 남아 있는 작업 목록을 보여주는 차트
- 번업 차트 : 배포에 필요한 진행 사항을 보여주는 차트
- 스크럼은 특정 언어나 방법론에 의존적이지 않은, 넓은 응용 범위의 개발 기법
- 특징
- 기능 및 개선점에 대한 우선순위를 부여
- 개발 주기는 30일 (1~4주) 정도로 하며, 개발 주기마다 실제 동작 가능한 결과를 제공
- 개발 주기마다 적용할 기능이나 개선에 대한 목록을 제공
- 항상 팀 단위로 생각하고, 날마다 15분 정도 스크럼 미팅
5) TDD (Test-Driven Development)
- 요구사항 검증 및 설계의 고도화
- 짧은 주기에 라이프 사이클을 반복하는 테스트-설계-피드백 중심의 개발 방법론
- 작은 단위의 테스트 케이스를 작성하고 이를 통과하는 코드를 추가하는 단계를 반복하여 구현
- 프로세스
- Red phase : 실패하는 작은 테스트케이스를 작성
- Green phase : 테스트를 통과하는 코드를 작성
- Refactor phase : 테스트를 통과하기 위해 만든 코드의 모든 중복을 제거하고 불명확한 것을 명확하게 한다.
6) Kanban
- 도요타의 kanban 작업 방식을 소프트웨어 개발에 도입
- 작업 흐름(workflow)를 표현하는 kanban 보드를 통해 개발공정을 가시화하고 작업 제한, 소요시간 최적화 기법을 통해 적시 개발(just in time)을 지원하는 에자일 방법론
- 3가지 규칙
- workflow 가시화
- Work in progress(WIP) 제한
- 리드타임 측정
- 칸반 보드
- 진행 중인 작업을 제한하며 효율성을 최대화하는 애자일 프로젝트 관리 도구
- 에자일 팀과 DevOps 팀이 일상 업무에서 체계를 확립하는데 주로 사용
7) Chaos와 DevOps
(1) Chaos Engineering
- 시스템이 격동의 예측치 못한 상황을 견딜 수 있도록 신뢰성을 쌓기 위해 운영 중인 소프트웨어 시스템에 실험을 하는 규율
- 다양한 서비스 운영 환경에 대응하고 새로운 기능을 중단 없이 제공하기 위해서, 기존의 서비스에 임의의 결함을 주입하고 이들이 어떠한 행동을 보이는지 동적으로 검사하면서 시스템 운영에 대응하는 방법을 찾는 것
- 원칙
- 계획
- 테스트할 항목과 이를 수행할 방법을 결정
- 목표는 가설을 세우는 것 : 시스템에서 무엇이 잘못될 수 있을까? 악용될 수 있는 잠재적 취약점은 무엇인가?
- 실험
- 결함을 주입하고 시스템이 어떻게 반응하는지 확인
- 결함 주입은 단순히 취약점을 노출시키기 위해 기존 시스템에 문제를 도입하는 프로세스 (어떤 일이 일어나는지 확인하기 위해 시스템에 의도적으로 가하는 행위)
- 분석
- 실험 데이터를 사용하여 잠재적인 실패 지점을 식별
- 완화
- 문제가 발견되면 실험을 종료하고 문제 완화에 집중
- 그렇지 않으면 문제의 핵심에 도달할 때까지 실험을 확장
❓ 기존의 사일로 기반 개발 방식의 문제점
: 소프트웨어 개발의 각 단계가 종료된 후 다음 단계로 진행 ➡️ 각 단계간 상호작용 부재
(2) DevOps = Development + Operations
- 애플리케이션과 서비스를 빠른 속도로 제공할 수 있도록 조직의 역량을 향상시키는 문화 철학, 방식 및 도구의 조합
- 정의
- IEEE 정의 : 소프트웨어 개발과 관련된 스테이크홀더(stakeholder)들이 SW 시스템 또는 서비스를 명세, 개발, 운영하고 시스템 전체 수명주기에 걸쳐 지속적인 개선을 도모하기 위해 의사소통과 협업을 증진하기 위한 원리와 실천 사항들의 모임
- 기존의 SW 개발 및 인프라 관리 프로세스를 사용하는 조직보다 제품을 더 빠르게 혁신하고 개선
- 빠른 속도를 통해 고객을 더 잘 지원하고 시장에서 좀 더 효과적으로 경쟁
- 고객 서비스를 365일 24시간 내내 제공해야 하는 IT 조직에서 도입하고 있는 소프트웨어 시스템의 개발 및 운영 전략 (아마존, 구글, 넷플릭스 등)
- 개발팀과 운영팀이 병합 : 엔지니어가 개발에서 테스트, 배포, 운영에 이르기까지 전체 애플리케이션 수명 주기에 걸쳐 작업하고 단일 기능에 한정되지 않은 광범위한 기술을 개발
- DevOps의 핵심 : 애자일 개발과 지속적인 통합
- 하나의 새로운 소프트웨어 기능, 개선 요청 또는 버그 수정 등이 사용자에게 가치를 제공할 수 있도록 운영 환경에서 개발, 배포로 진행되는 프로세스의 속도를 높이는 접근 방식을 의미
- 장점 : 속도, 신속한 제공, 안정성, 확장, 협업 강화, 보안
- DevOps 방식
- 지속적 통합, 지속적 배포
- 마이크로 서비스
- 코드형 인프라 : 인프라를 프로비저닝하고 관리하는 방식
- 모니터링 및 로깅
- 커뮤니케이션 및 협업
- DevOps 프로세스 실현을 위해 자동화는 필수 ➡️ DevOps Toolchain