[01] I. 소프트웨어 공학 개요
학습 목표
- 소프트웨어의 특성과 문제점을 설명할 수 있다.
- 소프트웨어공학의 배경과 목적을 설명할 수 있다.
- 소프트웨어 개발 프로세스 모델에 대해 설명할 수 있다.
핵심 키워드
- 소프트웨어의 특성
- 소프트웨어 생명주기
- 요구사항분석, 설계, 구현, 테스팅
- 소프트웨어 요구관리, 소프트웨어 유지관리, 소프트웨어 형상관리, 소프트웨어 품질관리
01 소프트웨어 공학의 배경과 목적
소프트웨어 공학이란? 요구사항 분석에서부터 유지보수에 이르기까지 전 과정에 걸쳐 예상되는 어려움을 해결하기 위한 체계적인 관리와 효율적 업무 수행을 지원해주는 기술, 기법 등을 제공함

프로세스, 인력의 구성, 기반 인프라 기술의 3가지 핵심 요소를 균형 있고, 조화롭게 갖추고, 이를 유지하기 위한 지속적인 노력이 필요함
소프트웨어 공학 배경
1950년대 : 소프트웨어 공학 개념 도입
1960년대 : 소프트웨어에 대한 수요 급증에 비해 인력들의 경험과 능력, 수적인 부족이 원인이 되어 '소프트웨어의 위기'가 발생, 본격적인소프트웨어 공학 도입
1970년대 : 인력 부족에 따른 비전공자 대거 투입 > 선코딩-후수정 접근방식 > 앞의 방식에 따른 부작용으로 구조적 또는 정형적 기법들 발생 및 폭포수 모델 개발하여 사용 시작
1980년대 : 재사용성을 높여 효율적으로 소프트웨어를 개발하기 위해 소프트웨어 개발 생산성을 높이기 위한 방법들을 연구
1990년대 : 제품의 시장출시 시간을 단축하기 위해 소프트웨어 개발 생산성에 대한 연구가 활성화, 동시공학에 집중한 모델을 활용
2000년대 : 소프트웨어를 둘러싼 시장 환경이 급속하게 변화하기 시작, 애자일 방법론 도입
소프트웨어 공학의 4가지 중요요소
- 방법 : 프로젝트 계획 수립과 추정, 시스템과 소프트웨어 분석, 자료구조, 프로그램 구조, 알고리즘, 코딩, 테스팅, 유지 관리와 같은 작업들로 구성
- 도구 : 어떤 일을 수행할 때 생산성 혹은 일관성을 목적으로 사용하는 방법들을 자동화나 반자동화시켜 놓은 것을 일컬음
- 절차 : 방법과 도구를 결합하여, 그것으로 하여금 소프트웨어를 합리적이고 적시에 개발할 수 있도록 함
- 사람 : 소프트웨어 공학에서는 많은 것들이 사람과 조직에 의해서 움직이기 때문에 사람에 대한 의존성이 상대적으로 큼
02 소프트웨어 개발 생명주기
소프트웨어 개발 생명주기란? 사용자 환경 및 문제점 이해에서 시작하여 운용/유지 보수에 이르기까지의 모든 과정
일반적인 소프트웨어 생명주기는 타당성 검토 - 개발 계획 - 요구사항 분석 - 설계 - 구현 - 테스트- 운용 - 유지보수 의 활동으로 구성됨
소프트웨어 생명주기 모델 종류
- V 모델 : 프로젝트 관리자와 개발자에게 프로젝트 수행 동안 어떤 활동이 수행되어야 하는지 명확하게 보여줌, 소프트웨어 개발에 대해 잘 알지 못하는 고객을 이해시키는 것이 용이, 시스템의 요구사항이 모두 식별되고 명확할 때 이상적인 생명주기 모델
- VP 모델(V모델 with prototyping) : V모델에 프로토타이핑 기법을 추가함으로써 프로젝트의 불확실성 요소나 리스크를 줄일 수 있음
- 점증적 모델 : 시스템 개발 시간을 줄일 필요가 있을 경우 유용한 모델, 핵심이 되는 부분을 먼저 개발하여 동작 가능하게 만든 후, 나머지 기능을 구현하는 방식
- 진화 모델 : 점증적 모델과 같이 시스템 개발 시간을 줄일 필요가 있을 경우 유용한 모델, 점증적 모델과 달리 전체 시스템에 대한 개발 단계가 여러번 반복됨
03 소프트웨어 개발 방법론
소프트웨어 개발 방법론의 필요성
- 개발 경험의 축적 및 재활용을 통한 개발 생산성을 향상
- 효과적인 프로젝트 관리
- 공식 절차와 산출물을 제시하고 표준용어를 통일하여 의사소통 수단 제공
- 각 단계별 검증과 승인된 종료를 통해 일정 수준의 품질 보증
소프트웨어 개발 방법론 비교
구분 구조적 방법론 정보공학 방법론 객체 지향 방법론 CBD 방법론
| 개요 | 업무활동 중심의 방법론 | 데이터 중심의 방법론 | 객체, 클래스 간의 관계를 식별하여 설계모델로 변환하는 방법론 | 재사용이 가능한 컴포넌트의 개발/상용 컴포넌트들을 조합하는 방법론 |
| 기본 원리 | - 추상화- 구조화- 단계적 상세화- 모듈화 | - 정보전략계획 - 업무영역분석- 업무시스템설계- 시스템구축 | - 요건정의- 객체 지향 분석- 객체 지향 설계- 테스트/배포 | - 요구분석- 분석- 설계- 개발- 구현 |
| 특징 | - 분할과 정보의 원칙- 프로그램 로직중심- 컨트롤 가능한 모듈로 구조화 | - 기업업무 지원시스템 지원방법론- 데이터모델 중시- 프로그램 로직은 데이터구조에 종속- 전사적 통합데이터 모델 | - 프로그램 단위는 객체- 데이터와 로직 통합- 고도의 모듈화- 상속에 의한 재사용 분석- 설계간 갭 없음 | - 객체방법론의 진화-인터페이스 중시-인터페이스의 구현은 컴포넌트- 블랙박스 재사용 지향 |
| 주요 산출물 | - 도메인 분석서- 데이터흐름도- 구조도- 프로그램 사양서 | - 도메인 분석서- ERD- 기능차트- 어플리케이션구조도- 프로그램사양서- 테이블정의서/목록 | - 비즈프로세스/개념도- 다이어그램 | - 비즈프로세스/개념도- 다이어그램- 재사용계획서- .NET, EJB |
| 지원 도구 | Teamwork, SA | Cool Gen, SA | Rose, SA, Palstic | Cool Joe, Together |
| 주요 지원 언어 | COBOL, C, VB, PASCAL | COBOL, C, VB, PASCAL | C++, JAVA, VB | 개발언어 무관 |
소프트웨어 개발 단계
- 요구사항 분석 : 소프트웨어 개발의 실제적인 첫 단계로 사용자의 요구에 대하여 이해하는 단계
- 설계 : 물리적 실현의 첫 단계
- 구현 : 설계 명세를 기반으로 요구사항을 만족할 수 있도록 프로그래밍 하는 것
- 테스팅 : 시스템이 정해진 요구를 만족하는지, 예상과 실제 결과가 어떤 차이를 보이는지에 대해 수동 또는 자동화된 방법을 동원하여 검사하고, 평가하는 일련의 과정
04 애자일 개발 방법론
애자일 방법론 종류
- 스크럼, 켄 슈와버/제프 서덜랜드
- 익스트림 프로그래밍, 켄트 벡/에릭 감마
- 린 소프트웨어 개발방법론, 메리 포펜딕/톰 포펜딕
- 애자일 UP, 스콧 앰블러
애자일 개발 방법론 - XP
XP(eXtreme Programming)는 1990년대 후반 켄트 백을 중심으로 여러 엔지니어들이 프로젝트를 진행하며 얻었던 교휸을 기반으로 정립된 방법론, 보통 중소규모 개발 조직에 적합한 경량화된 개발방식

XP 개발절차
스크럼(SCRUM)
- 스크럼은 프로젝트 관리를 위한 애자일 방법론으로서 추정 및 조정 기반의 경험적 관리기법의 대표적인 형태
- 3가지 역할자가 있음(제품 책임자, 스크럼 마스터, 스크럼 팀)
- 스크럼 프로세스의 3가지 구성 요소(스프린트, 3가지 미팅, 3가지 산출물)
- 스크럼 특징 (투명성, 타임박싱, 커뮤니케이션, 경험주의 모델)
[01] II. 소프트웨어 재사용
학습 목표
- 소프트웨어 재사용의 개념, 목적, 대상, 현실 적용방안, 효과, 고려사항 등을 이해한다.
- 역공학의 개념, 필요한 이유, 장점, 고려사항에 대해 이해한다.
핵심 키워드
- 재사용, 역공학
- 코드 재사용, 소프트웨어 표준화
- 소프트웨어 유지보수
01 소프트웨어 재사용
소프트웨어 재사용(Reuse) 개요
소프트웨어 재사용은 기존의 소프트웨어 또는 소프트웨어 지식을 활용해, 새로운 소프트웨어를 구축하는 일임.
소프트웨어 재사용 배경
- 소프트웨어 위기로 인한 품질 및 생산성 저하
- 소프트웨어 개발의 자동화 기술 발달로 CASE 도구 사용 확대
- 소프트웨어 개발 표준화 준수 및 품질확보 노력
소프트웨어 재사용 정의
- 소프트웨어 재사용이란 사용 소프트웨어 개발관련 지식(기능, 모듈, 구성 등)을 표준화하여 개발 생산성을 높이기 위하여 반복적으로 사용하기에 적합하도록 구성하는 방법
- 기존 개발 기능, 성능 및 품질을 인정받았던 소프트웨어의 전체 또는 일부분을 다시 사용하여 신규 개발되는 소프트웨어의 품질과 생산성 및 신뢰성을 높이고 개발 일정 및 비용을 감소시켜 주는 대응방안
- 기존 개발 모듈이나 프로그램, 산출물 등을 동일한 응용 분야, 서로 다른 응용업무, 혹은 서로 다른 기업 간에 다시 사용하거나 일부 수정 후 재사용할 수 있는 개념
소프트웨어 재사용의 목적
- 신뢰성 : 기능, 안정, 속도 등의 사전 성능 검증됨
- 확장성 : 검증된 기능 기반으로 upgrade 용이
- 생산성 : 비용, 시간 위험 등 전체적 개발 프로세스 향상
소프트웨어 재사용의 대상
일반적인 지식, 설계 정보, 데이터 정보, 프로그램 코드, 기타 등등
소프트웨어 재사용의 원칙
- 범용성 : 특정 응용분야만이 아닌 일반적으로 활용될 수 있는 정도여야 함
- 모듈성 : 정보은닉과 추상화의 원칙으로 최소한의 결합도 및 최대한의 응집력을 갖도록 하는 특성이 있어야 함
- 하드웨어 독립성 : 가능한 실행 하드웨어 기종과 무관해야 함
- 소프트웨어 독립성 : OS 또는 DBMS와는 무관하게 운영해야 함
- 자기문서화 : 모듈의 정확한 기능, 용법, 인터페이스를 기술함
- 일반성 : 많은 개발자들에게 공통적으로 필요하고 사용 가능해야 함
- 신뢰성: 품질을 믿고 사용할 수 있어야 함
실무에서 재사용 구현의 문제점
- 공통으로 사용할 수 있는 소프트웨어 모듈 발견 어려움
- 소프트웨어의 표준화 부족
- 소프트웨어 모듈의 내부 인터페이스 요구사항의 이해 곤란
- 변경으로 인한 부차적 영향으로 이해 곤란
- 재사용을 위한 소프트웨어 부품은 개발비가 더 들 수 있음
- 재사용의 효익은 오랜 시간이 경과 후 나타남
- 현존하는 소프트웨어 부품에서 재사용 부품의 추출이 비현실적임
소프트웨어 재사용의 장애요인
- 관리자와 개발 담당자들의 거부 반응
- 재사용 기술적용의 동기 결여
- 소프트웨어 표준화의 부재
- 사회적 또는 법적 장애
소프트웨어 재사용의 장애요인 제거 대책
- 새로운 설계 및 개발 방법론의 활용
- 재사용 소프트웨어 라이브러리의 구축
- 자동화 도구(CASE)의 활용
- 보상제도의 확립 등
소프트웨어 재사용의 효과
- 소프트웨어 생산의 TCO 절감
- 높은 품질의 소프트웨어 생산을 위한 공유 및 활용효과
- 시스템 개발에 대한 정보공유 및 타 프로젝트의 산출물 공유
- 시스템 구조와 좋은 시스템 구축방법에 대한 교육적 효과
02 역공학
역공학의 정의
역공학이란 소프트웨어 공학의 한 분야로 이미 만들어진 시스템을 역으로 추적하여 처음의 문서나 설계기법 등의 자료를 얻어 내는 일. 시스템을 이해하여 수정하는 소프트웨어 유지보수 단계에 수행하는 일련의 활동
역공학의 Input과 Output
Input : 원시코드, 목적콛, 작업철차, 라이브러리 등 입출력 형태의 자료, 문서
Output : 구조도, 자료 흐름도, 제어 흐름 그래프, 개체 관계도
역공학이 필요한 경우
- 기 가동중인 시스템의 유지보수가 어려운 경우
- 변경이 빈번하여 시스템 효율이 저하된 경우
- 파일 시스템으로 개발된 업무를 관계형 데이터베이스로 재구축하려는 경우
- 기본 메인 프레임을 다운사이징 하는 경우
역공학의 장점
- 상용화되거나 기 개발된 소프트웨어의 분석을 도와줌
- 기존 시스템의 자료와 정보를 설계 수준에서 분석할 수 있어 유지 보수성을 향상
- 기존 시스템 정보를 Repository에 보관하여 CASE의 사용을 용이하게 함
역공학의 종류
논리역공학 : 원시코드로부터 정보를 추출하여 물리적 설계 정보저장소에 저장, 물리적 설계정보를 얻어내는 역할 수행
자료역공학 : 기존 데이터베이스를 수정하거나 새로운 데이터베이스 관리시스템으로 전이하는 역할 수행