7장. 설계와 구현
설계와 구현
소프트웨어 설계와 구현
실행 가능한 소프트웨어 시스템이 개발되는 소프트웨어 공학 프로세스 단계
설계와 구현
1. 설계
요구사항을 실현할 소프트웨어 컴포넌트들과 그들 관계를 식별하는 활동
2. 구현
설계를 프로그램으로 실체화 시키는 활동
설계와 구현은 필연적으로 중첩된다.
설계와 구현은 밀접하게 연결되어 있으며 설계 시 구현 이슈를 고려해야 한다.
개발 프로세스에 따른 차이
1. 계획 기반
설계 단계가 있으며 설계가 모델링되고 문서화된다.
2. 애자일
설계는 대략적인 스케치만 하고 설계 결정은 프로그래머가 한다.
객체 지향 설계
객체 지향 시스템
•
객체 지향 시스템은 상호작용하는 객체로 구성된다.
•
객체들은 자신의 내부 상태를 유지하고 그 상태에 대한 오퍼레이션을 제공한다.
객체 지향 설계 프로세스
•
객체 클래스들과 이 클래스들간의 관계를 설계하는 것과 관련
•
객체 클래스들을 찾고 클래스 간의 관계를 식별
객체 지향 설계 프로세스의 일반적인 절차
1. 시스템 컨텍스트와 시스템과 외부의 상호작용을 이해하고 정의
2. 시스템 아키텍처 설계
3. 시스템 주요 객체 식별
4. 설계 모델 개발
5. 객체 인터페이스를 명시
시스템 컨텍스트 모델
•
개발하는 시스템의 환경에 있는 다른 시스템들을 보여주는 구조 모델
•
개발되는 시스템의 환경에 있는 다른 시스템들과의 관계를 보여준다.
•
클래스 다이어그램과 연관을 이용하여 표현 가능
상호 작용 모델
•
시스템이 사용될 때 어떻게 그 환경과 상호작용하는지 보여주는 동적 모델
•
시스템이 사용될 때 다른 시스템들과의 상호작용을 보여준다.
•
각 유스케이스의 내용을 기술해야 한다.
Tip) 연관
단순히 개체들간에 어떤 관계가 있다는 것을 보여준다.
아키텍처 설계
•
소프트웨어 시스템과 시스템의 환경 간 상호 작용이 정의되면 이 정보를 시스템 아키텍처 설게를 위한 기반으로 사용한다.
•
시스템을 구성하는 주요 컴포넌트(서브시스템)들과 그들 간의 상호작용을 식별
•
아키텍처 설계의 일반 지식과 도메인 지식을 활용
객체 클래스 식별 지침
•
관련 문서에서 객체와 속성은 명사이고 오퍼레이션이나 서비스는 동사
•
응용 도메인의 실제 개체를 나타내는 클래스를 만든다.
•
시나리오 기반 분석을 사용한다.
객체 클래스 식별은 반복적인 과정
1. 대략적인 시스템 설명으로부터 클래스, 속성, 오퍼레이션을 식별
2. 응용 도메인 지식과 시나리오 분석을 이용하여 초기 객체들을 정련
3. 요구사항 문서, 사용자 인터뷰, 기존 시스템 분석 등으로부터 정보 수집
설계 모델
설계 모델에서 필요한 상세함의 수준은 사용되는 설계 프로세스에 달려있다.
설계 프로세스에 따른 상세 수준
1.
계획 기반 프로세스
2.
애자일 프로세스
설계 모델의 종류
1. 구조 모델
•
시스템의 정적구조를 객체 클래스와 클래스들 간의 관계로 표현
•
문서화 가능 중요 관계: 일반화(상속) 관계, 사용/사용됨의 관계, 복합 관계
2. 동적 모델
•
실행 중에 일어나는 객체 간의 상호작용을 표현
•
문서화 관계 상호작용: 객체에 의한 서비스 요청 순서, 객체 상호 작용에 의해 유발되는 상태 변화
유스케이스 모델과 아키텍처 모델에 세부 사항을 추가하기 위한 UML 모델 유형 3가지
1. 서브시스템 모델 (구조 모델)
•
객체들의 논리적인 그룹들을 일관된 서브시스템으로 보여준다.
•
객체들을 둘러싸는 패키지로 각 서브시스템을 나타내는 클래스 다이어그램 형태로 표현
2. 시퀀스 모델 (동적 모델)
•
객체 상호작용의 순서를 보여준다
•
시퀀스 다이어그램 혹은 협력 다이어그램으로 표현
3. 상태 기계 모델 (동적 모델)
•
객체들이 이벤트에 반응하여 어떻게 그들의 상태를 변경하는지 보여준다.
•
상태 다이어그램으로 표현
인터페이스
•
객체 또는 객체 그룹에 제공되는 서비스
•
인터페이스 클래스를 이용해 서비스의 시그니처(Signature)를 정의
•
<<interface>> 스테레오 타입 이용
•
오퍼레이션을 가지며 데이터는 가지지 않는다.
인터페이스 설계
•
객체의 인터페이스 또는 객체 그룹의 인터페이스의 상세 내역을 명시하는 것과 관련
•
객체 또는 객체 그룹에 제공되는 서비스들의 시그니처와 의미를 정의하는 것을 의미한다.
오픈 소스 개발
오픈 소스 개발
소프트웨어 시스템의 소스 코드가 공개되고, 개발 프로세스에 지원자들이 참여하도록 초대되는 소프트웨어 개발 접근법
오픈 소스 개발 특징
1.
자유 소프트웨어 재단으로부터 유래되어 누구든지 참여 가능하나, 실제론 핵심 개발 그룹이 주도한다.
2.
널리 사용되는 오픈 소스 시스템은 안정적이고 버그 수정도 신속하게 해결된다.
대표적인 오픈 소스 시스템
1.
Linux
2.
Apache
3.
Eclipse
오픈 소스 라이선스
1. GPL (GNU 일반 공중 라이선스)
•
프로그램 GPL 소스를 (일부라도) 사용/변경한다면 프로그램의 소스를 공개해야 하고 프로그램도 GPL 라이선스를 따른다.
2. LGPL (GNU 레서 일반 공중 라이선스)
•
완화된 GPL로서 LGPL 라이브러리를 사용한다면 프로그램의 소스를 공개할 필요는 없다.
•
LGPL 라이브러리를 수정한 경우 소스를 공개해야 한다.
3. BSD (버클리 표준 배포)
•
BSD 소스를 (변경하여) 사용할 수 있으며 변경 내역과 프로그램 소스 공개 의무 없다.
•
저작권자의 이름과 라이선스 내용을 같이 배포해야 한다.