소프트웨어 개발 방법론
소프트웨어란?
- 컴퓨터에게 동작 방법을 지시하는 명령어 집합
- 컴퓨터에서 특정 작업을 수행하기 위해 설계된 프로그램, 데이터, 문서 등을 총칭
소프트웨어 특징
무형성 (Intangibility)
- 물리적 실체가 없는 논리적 산물. 실행 결과로만 동작 확인 가능
- 개발 진행 상황을 파악하기 어려움
비가시성 (Invisibility)
- 내부 구조를 직접 볼 수 없으므로 설계 및 명세화와 같은 문서화가 중요
잠재적 오류 가능성 (Potential Defects)
- 최종 산출물이 개발 과정에서 확인되지 않음
- 개발 과정에서 오류 발생 가능성 존재
- 테스트 및 디버깅을 통한 관리 및 유지 보수
변경 용이성 (Modifiability)
- 요구사항 변경 및 오류 해결을 위해 수정 가능
소프트웨어 위기 (Software Crisis)
- 1968년 처음으로 언급(NATO 소프트웨어 공학 컨퍼런스)
- 하드웨어의 급속한 발전 -> 소프트웨어 개발 방법론 발전이 늦음
- 소프트웨어 규모 및 복잡도 증가에 따른 개발 비용 증가
- 프로젝트 개발 기간 및 소요 예산 예측이 어려움
- 품질 저하 및 유지보수 난이도 증가
소프트웨어 공학이란?
- 소프트웨어 위기 극복을 위해 공학 기법을 도입
- 전통적인 공학 원칙들을 소프트웨어 개발에 적용
- 소프트웨어 개발에 대한 체계적이고 공학적인 접근 방식으로 전환
- 체계적인 개발 방법론 등장 (폭포수 모델 등)
- 소프트웨어 관리 기법 체계화
- 소프트웨어 개발 프로세스 표준화
소프트웨어 개발 생명주기 (Software Develepment Life Cycle-SDLC)
- 소프트웨어 생성에서 폐기까지의 과정을 단계별로 구분
- 각 단계별 주요 활동과 산출물 정의
- 명확한 프로젝트 진행 상황 파악 및 관리 용이성 제공
- 소프트웨어 개발 생명주기는 크게 정의, 개발, 유지보수 단계로 구분
폭포수 모델 (Waterfall)
- 가장 오래된 전통적인 소프트웨어 개발 방법론
- 순차적으로 소프트웨어 개발
- 이전 단계 개발 완료 및 검증 후 다음 단계 진행 가능
- 요구사항이 명확하고 변경이 적은 프로젝트에 적합
- 높은 신뢰성과 안정성이 요구되는 프로젝트에 적합
- 요구사항 분석 -> 설계 -> 구현 -> 테스트 -> 유지보수
- 단계가 명확하여 진행 상황 파악 및 관리가 용이
- 요구사항 변경에 대응이 어려움
- 고객 피드백이 늦게 반영되고 실제 동작하는 소프트웨어 형상 확인이 늦음
프로토타입 모델 (Prototype)
- 초기 요구사항을 바탕으로 프로토타입 제작
- 사용자 피드백을 통한 지속적인 개선 (폭포수 모델 단점 보완)
- 최종 요구사항 확정 후 실제 시스템 개발
- 요구사항 불명확한 경우
- 새로운 기술 검증이 필요한 경우
- 실험적 시스템 개발
사용자 요구사항 명확화
- 실제 동작하는 프로토타입을 통해 사용자의 요구사항을 구체적으로 파악
위험 감소
- 개발 초기에 오류 발견 및 수정 가능
사용자 참여 증진
- 사용자가 개발 과정에 직접 참여하여 피드백 제공 및 사용자 만족도 향상
관리의 어려움
- 반복적인 프로토타입 개발로 인한 비용 및 일정 증가 위험성
불완전한 문서화
- 문서화 부실화 및 이로 인한 유지보수 어려움 발생 가능성
높은 기대치 형성
- 프로토타입으로 인한 품질 및 일정 기대감
나선형 모델 (Sprial)
- 위험 분석 중심의 개발 모델
- 계획 및 정의 / 위험 분석 / 개발 및 검증 / 고객 평가 단계를 반복적으로 수행
- 프로토타이핑을 활용한 점진적인 개선 및 세부화 진행
- 위험도가 높은 프로젝트
- 요구사항이 불명확한 프로젝트
- 새로운 기술 적용 프로젝트
- 소규모 프로젝트에는 비효율적
체계적인 위험 관리
- 각 단계마다 위험 분석 및 문제점 조기 발견으로 프로젝트 실패 가능성 감소
요구사항 변경 수용성
- 반복적인 개발 주기를 통한 사용자 피드백 및 새로운 요구사항 반영
품질 및 완성도 향상
- 각 단계별 검증 및 평가와 프로토타입을 이용한 지속적인 검증 수행
프로젝트 관리 어려움
- 복잡한 반복 주기로 인한 관리 부담 및 종료 시점 예측이 어려움
비용과 일정 부담
- 위험 분석 및 프로토타입 제작에 많은 자원 소요
높은 전문성 요구
- 신기술 도입 경험자 및 경험 많은 프로젝트 관리자 필요
점증적 모델 (Incremental)
- 시스템을 여러 개의 증분으로 나누어 개발
- 독립적인 각 증분을 통해 점진적으로 전체 시스템을 완성해 나감
- 각 증분을 독립적인 시스템으로 각각 개발 및 배포가 가능
- 이전 증분에 새로운 기능을 추가하여 점증적 개발
- 주요 기능의 우선 순위가 명확한 프로젝트
- 점진적인 기능 추가가 가능한 시스템
- 빠른 시장 출시가 필요한 제품
빠른 초기 제품 출시
- 핵심 기능을 먼저 개발하여 빠르게 제품 출시
- 서로 다른 증분 개발을 통한 병렬 개발 가능
위험 감소
- 증분 단위로 개발하여 전체 프로젝트 위험을 분산
- 문제 발생 시 해당 증분만 수정
유연한 변경 관리
- 각 증분 단계에서 요구사항 변경 수용 가능
아키텍처 설계의 어려움
- 전체 시스템을 증분으로 구분하고 증분 간 인터페이스 설계 등이 어려움
통합 및 관리 복잡성
- 증분 간 의존성 관리 및 증분을 통합하는 과정의 어려움
추가 비용 발생
- 각 증분마다 테스트와 통합 작업이 필요하여 전체적인 개발 비용이 증가
RAD 모델 (Rapid Application Development)
빠른 어플리케이션 개발을 위한 모델, 최소한의 계획 단계를 거쳐 신속하게 프로토타입을 개발하고 이를 반전시켜 최종 시스템을 구축하는 방법
사용자와 함께 비즈니스 모델 검토 후 프로토타입 개발, 수정, 보완을 반복해서 최종적으로 시스템 구축 및 운영
- 신속한 개발 주기
- 명확한 요구사항이 있는 경우
- 기술적 위험이 낮은 경우
- 사용자가 전 과정에 참여 가능한 경우
빠른 개발과 배포
- 신속한 프로토타입 제작과 피드백으로 개발 주기 감소 및 빠른 시장 출시
높은 사용자 만족도
- 사용자 참여로 요구사항을 정확하게 반영
- 지속적인 피드백을 통한 품질 향상
적용 프로젝트 제한
- 대규모 프로젝트에는 적용이 어려움
- 복잡한 비즈니스 로직 구현에는 한계
- 높은 기술적 위험이 있는 프로젝트에는 부적합
높은 기술력 위험 및 비용 증가
- 숙련된 개발자 및 자동화 도구 사용 능력 필요
프로젝트 관리의 어려움
- 빠른 개발로 인한 문서화 부실 가능성
- 향후 유지보수의 어려움
애자일 모델 (Agile)
- 변화에 유연하게 대응하면서 반복적으로 점진적인 방식으로 소프트웨어를 개발
- 스프린트 기반 개발
- 2~4주 단위의 반복적인 개발 주기
- 각 스프린트마다 실행 가능한 소프트웨어 제공
- Daily Scrum
- 1분 정도의 짧은 팀 미팅을 이용한 진행 상황 공유
- 요구사항이 자주 변경되는 프로젝트
- 빠른 출시와 피드백이 중요한 프로젝트
- 고객과의 긴밀한 협력이 가능한 환경
유연성과 적응력
- 요구사항 변경 및 문제 발생 시 신속하게 대응 가능
- 시장 및 고객 needs 변화에 빠른 적응
고객 만족도 향상
- 정기적인 피드백, 빠른 제품 출시
품질 향상
- 반복적 테스트 및 검증으로 조기에 문제 발견
프로젝트 관리의 어려움
- 정확한 일정, 범위 및 비용 예측 어려움
조직 문화적 적응성
- 기존 조직 문화와 충돌 가능성
기술적 이슈
- 지속적인 통합 / 배포 인프라 구축
- 자동화 테스트 인프라 구축
- 기술 부채 누적 가능성
소프트웨어 개발 패러다임, 개발 방법론 변화
기법 | 설명 |
구조적 기법 | - 복잡성 극복 중점 - 소프트웨어 규모가 커지며 구조화된 접근법이 필요 - 탑다운 |
정보공학 기법 | - 자동화에 중점 - 데이터베이스 시스템 발전, CASE (Computer-Aided Software Engineering) 도구 등장 |
객체지향 기법 | - 모듈화에 중점 - 소프트웨어 재사용 및 유지보수 요구 증가 |
CBD 기법 | - 재사용 중점 - 대규모 소프트웨어 개발 효율성 요구 |
애자일 기법 | - 적시성 중점 - 빠르게 변화하는 비즈니스 환경, 고객 요구사항 변화 대응 필요 |
CI/CD (Continuous Integration Continuous Delivery / Deployment)
- 지속적 통합과 지속적 배포를 의미하는 소프트웨어 개발 실천 방법
- 전 과정을 자동화함으로써 개발 생산성 향상
CI(Continuois Integration)
- 지속적 통합
- 코드 변경사항을 주기적으로 통합
- 자동화된 빌드와 테스트 수행
- 품질 검증 및 문제 조기 발견
CD(Continuous Delivery / Deployment)
- 지속적 배포
- Delivery: 수동 승인 후 배포 진행
- Deployment: 자동화된 배포 진행
* 개발 방법론이 아니라 실천 방법(Practice)
* 개발 프로세스를 지원하는 기술적 구현 방식
실무 개발 프로세스 및 직무
기획, 개발, QA, UX, TW, 기술지원
기획
- 사용자 / 비즈니스 요구사항을 분석하여 제품 방향성을 수립하고 개발 우선순위를 결정
- 제품 비전과 전략 수립
- 요구사항 수집 및 분석 / 제품 백로그 작성 및 우선 순위 관리
개발
- 요구사항을 기반으로 소프트웨어 설계, 구현, 테스트 및 유지보수 진행
- 기술 설계 및 아키텍처 설계
- 코드 작성 및 리뷰, 단위 테스트 및 통합 테스트
QA (Quality Assurance)
- 제품 품질 보증을 위한 품질 기준 관리 및 체계적인 테스트를 계획하고 수행
- 테스트 계획 수립 및 테스트 케이스 설계 및 실행 (기능/비기능)
- 품질 기준 수립 및 모니터링
UX (User Experience)
- 사용자 리서치 바탕으로 최적의 사용자 사용성을 설계하고 구체화 수행
- 사용자 사용성 리서치 및 분석
- UI 디자인 가이드라인 수립
TW (Technical Writer) / Technical Communicator
- 제품과 관련된 용어 정의 및 기술 문서, 사용자 가이드, API 문서 등을 작성 및 관리
- 기술 용어 정의
- 기술 문서 작성 및 유지보수
기술지원
- 제품을 사용하면서 발생하는 기술적 이슈를 대응, 피드백 수집 및 관리
- 사용자 문의 및 장애 대응, 사용자 피드백 수집 및 관리
- 이슈 추적 및 분석
- 정기적인 시스템 모니터링