[SE] 6장 아키텍처 설계

6장 아키텍처 설계


요구 분석서는 시스템이 해결하려는 문제를 기술한 것이고,
설계는 분석서에 기술된 문제를 해결 방안으로 바꾸는 작업이다. 

 예) 요구 분석 vs. 설계 : 건축 사례 (교재 그림 6.1)

기본적으로 설계는 창의적인 작업이되, 원리적인 접근과 체계적인 개념도 필요


대규모 소프트웨어를 설계하기 위한 필수 작업

 - 소프트웨어 아키텍처 설계
 - 서브시스템 간 인터페이스 설계 
 - 자료 저장소 설계 (파일, 데이터베이스 등)
 - 모듈 설계 (시스템 컴포넌트 내부 설계. 알고리즘)
 - 사용자 인터페이스 설계 (메뉴, 입력 양식, 출력 화면, 인쇄물 등)

아키텍처 설계

 - 소프트웨어 시스템을 구성하는 컴포넌트나 모듈들을 정의하고
 그들 사이의 인터페이스를 기술하는 것

 - 시스템의 골격, 또는 조직
 : 요구사항 분석 단계외 설계 단계의 중요한 연결 역할

 - 보통 컴포넌트간 상호작용을 기술하는 다이어그램으로 아키텍처 모델을 표현


실제 아키텍처 예

 - MFC
 - Linux / Android-Linux
 - Android App
 - Android platform

아키텍처 예
 
 - 계층 구조 스타일
 - 클라이언트-서버 스타일
 - MVC 스타일
 - 리포지토리 스타일
 - 파이프와 필터 스타일
 - 등등 

두가지 레벨에서 소프트웨어 아키텍처

 - Architecture in the small

 개별 프로그램의 구조(아키텍처)

 - Architecture in the large

 복잡한 엔터프라이즈 시스템의 아키텍처
 : 다른 시스템, 프로그램, 컴포넌트를 포함하고
 여러 컴퓨터들에 분산 배치되어 있으며
 여러 회사가 소유하고 관리하는 규모의 시스템에 대한 아키텍처

cf. 용어
 - 서브 시스템, 컴포넌트, 모듈

 세가지 용어가 유사한 개념

 서브 시스템 : 내부에 여러 컴포넌트, 모듈, 또다른 서브 시스템을 포함
 컴포넌트 : 독자적으로 동작 가능
 모듈 : 프로그래밍언어의 함수, 메소드


아키텍처 설계의 중요성

 - 목적 소프트웨어 시스템의 성능, 강건성, 유지보수성 등에 중요한 영향을 끼친다.

 - 교재 P.325 사례 (유지보수성 관련)


아키텍처를 명시적으로 모델링하는 것의 장점

 - 이해관계자 간의 커뮤니케이션에 유용

 - 시스템 분석에 유용

 - 소프트웨어 재사용

 : 여러 (대규모) 시스템들은 유사한 아키텍처로 구성되어 있다.

 e.g., Software product line (SPL) : 
 동일한 아키텍처의 유사한 시스템들간의 재사용을 높이는 방법


아키텍처를 표현하는 방법

 - 가장 흔한 방법: 시스템 구성요소와 관계를 표현하는 
 간단한 블럭과 화살표나 선분으로 구성된 다이어그램

 - UML의 패키지 다이어그램

 - 퍼사드 디자인 패턴


6.2 아키텍처 디자인 원리

 - 아키텍처 설계는 단순하면서 효율적으로 표현해야 함 (단순성, 효율성)

 - 분할 정복

 e.g., N. Wirth의 Step-wise refinement 
 (모듈을 작성하는 Top-down 방법)

 - 추상화 (Abstraction)

 필요한 특징만 추출하여 표현

 e.g., 지하철 노선도

 - 모듈화

 두 가지 기준

 1) 모듈 간 결합도 (coupling)

 2) 모듈 내부 응집도 (cohesion)


 - 모듈 간 결합도 

 : 두 모듈이 서로 의존하는 정도를 판단

 
 : 분류

 자료 결합 (data coupling) : 모듈 간의 인터페이스가 매개 변수 전달 등의
 자료 요소로만 구성된 경우

 스탬프 결합 (stamp coupling) : 배열이나 레코드를 전달하되 그 중 일부만
 전달하는 경우. 전역 변수 일부만을 사용하여 전달하는 경우

 제어 결합 (control coupling) : 제어 흐름 관련 값을 전달하여 다른 모듈의
 실행 순서를 제어하는 경우

 공통 결합 (common coupling) : 여러 모듈이 공동 자료 영역을 사용하는 경우

 내용 결합 (content coupling) : 다른 모듈의 지역 변수나 명령어를 수정하는 경우


 : 결합도에 영향을 주는 요소

 [교재 표 6.2]

 e.g., 이름으로 모듈에 연결되는 형태 --> 결합도를 낮춤

 - 모듈 내 응집도

 : 하나의 모듈이 하나의 기능으로 되어 있는지를 판단

 : 분류

 기능적 응집 (functional cohesion)

 순차적 응집 (sequential cohesion) : 모듈 안에서 하나의 소작업 결과가
 다음 소작업의 입력으로 전달되는 형태

 커뮤니케이션 응집 (communication cohesion) : 동일한 입출력 데이터에
 대한 오퍼레이션을 모아놓은 형태 (수행 순서와는 무관)

 시간적 응집 (temporal cohesion) : 동일한 시점에 수행되는 오퍼레이션을
 모아놓은 형태 (예: 초기화 코드를 모두 모아놓은 모듈)

 논리적 응집 (logical cohesion) : 모듈의 요소들이 논리적으로 관련있어서
 모아놓은 형태 (예: 수학함수 라이브러리)

 이유없는 응집 (coincidental cohesion) 


6.3 아키텍처 설계 과정

 - 주요 과정

 1) 아키텍처 설계 목표 설정

 : 유지보수, 성능, 보안, 강건성 ...

 2) 시스템 타입 결정

 : 상호작용 시스템, 이벤트 기반 시스템, 
 변환형 시스템, 자료 위주의 데이터베이스 시스템

 3) 여러 아키텍처 관점에 따라 설계된 내용을 표현

 : 모듈 관점

 : 컴포넌트와 커넥터 관점

 : 시스템과 주변 환경의 배치 관점


6.4 아키텍처 스타일

 - 계층 구조 아키텍처 (Layered architecture)

 - 클라이언트 서버 아키텍처 (client-server architecture)

 - MVC 아키텍처 (model-view-controller)

 - 저장소 아키텍처 (repository architecture)

 - 파이프와 필터 아키텍처 (pipe and filter architecture)


6.5절과 6.6절은 SKIP