[Software Engineering] Software Architecture
Software Architecture
소프트웨어의 골격이 되는 기본 구조이자, 소프트웨어를 구성하는 요소들 간의 관계를 표현하는 시스템의 구조 또는 구조체이다. 아키텍처 설계는 그러한 서브 시스템을 식별하고 서브 시스템 제어 및 통신을 위한 구조적 프레임워크를 확립하는 초기 설계 프로세스이다.
- 소프트웨어 아키텍쳐가 중요한 이유
1. 초기 디자인 결정: 소프트웨어 아키텍처는 시스템의 남은 개발, 배포 및 유지보수와 관련하여 시스템을 지배하는 가장 초기의 설계 과정을 나타낸다.
2. 이해관계자와의 소통: 소프트웨어 아키텍처는 시스템 이해관계자가 상호 이해, 협상, 합의 및 소통의 기초로 사용할 수 있는 시스템의 공통된 추상화를 나타낸다.
3. 시스템의 이전 가능한 추상화: 유사한 품질 속성 및 functional requirement를 나타내는 다른 시스템에 적용할 수 있으며 대규모 재사용을 촉진할 수 있다.
- Architecture design
Non-functional requirement(Quality Attributes)를 충족시키는 것. <-> Software Design은 Functional requirement를 충족시키는 것
ISO/IEC 9126-2001 Information Technology에 따르면 소프트웨어의 품질은 다음과 같다.
View Model
View: 관련된 관심사 집합의 관점에서 전체 시스템을 표현한 것
- Philippe Kruchtem의 4+1 View Model
이 View model에서는 공통적인 Use Case View를 통해 연결될 수 있는 네 가지 기본적인 아키텍처 뷰가 있다.
1. Logical View: 객체 또는 객체 클래스로 시스템의 핵심 추상화를 보여주며 시스템 요구사항을 Logical View의 개체들에 연관 짓는 것이 가능하여야 한다.
2. Process View: 런타임에 시스템이 어떻게 상호 작용 하는 프로세스들로 구성되는지 보여주며 이 View는 성능이나 가용성과 같은 비기증적 시스템 특성들을 판단하는 데 유용하다.
3. Component View: 소프트웨어가 개발을 위해 어떻게 분해되는지를 보여준다. 소프트웨어를 단일 개발자나 개발 팀에서 구현할 컴포넌트들로 나눈 것을 보여준다. 이 View는 소프트웨어 관리자나 프로그래머를 위해 유용하다.
4. Deployment View: 시스템 하드웨어와 소프트웨어 컴포넌트들이 시스템의 프로세서에 어떻게 분산되는지를 보여주는 이 View는 시스템 배치를 계획하는 시스템 엔지니어에게 유용하다.
Architectural Patterns
아키텍처 패턴은 아키텍처를 설계할 때 참조할 수 있는 전형적인 해결 방식 또는 예제를 의미한다. 이는 소프트웨어 시스템의 구조를 구성하기 위한 기본적인 윤곽을 제시하고, 서브시스템들과 그 역할이 정의되어 있으며, 서브시스템 사이의 관계와 여러 규칙/지침 등이 포함되어 있다. 아키텍처 패턴을 아키텍처 스타일 또는 표준 아키텍처라고도 한다.
아키텍처 패턴의 장점
1. 시행착오를 줄여 개발 시간을 단축시키고, 고품질의 소프트웨어를 생산할 수 있다.
2. 검증된 구조로 개발하기 때문에 안정적인 개발이 가능하다.
3. 이해관계자들이 공통된 아키텍처를 공유할 수 있어 의사소통이 간편해진다.
4. 시스템의 구조를 이해하는 것이 쉬워 개발에 참여하지 않은 사람도 손쉽게 유지보수를 수행할 수 있다.
5. 시스템의 특성을 개발 전에 예측하는 것이 가능해진다.
- Blackboard Pattern (Data-Centered)
모든 컴포넌트들이 공유 데이터 저장소와 블랙보드 컴포넌트에 접근이 가능한 형태로, 컴포넌트들은 검색을 통해 블랙보드에서 원하는 데이터를 찾을 수 있다.
- Pipe-Filter Pattern
데이터 스트림 절차의 각 단계를 Filter 컴포넌트로 캡슐화 하여 Pipe를 통해 데이터를 전송하는 패턴이다. 필터 컴포넌트는 재사용성이 좋고, 추가가 쉬워 확장이 용이하며, 재배치하여 다양한 파이프라인을 구축하는 것이 가능하다.
- Layers Pattern
시스템을 계층으로 구분하여 구성하는 고전적인 방법 중의 하나이다.
각각의 서브시스템들이 계층 구조를 이루며, 하위 계층은 상위 계층에 대한 서비스 제공자가 되고, 상위 계층은 하위 계층의 클라이언트가 된다.
서로 마주보는 두 개의 계층 사이에서만 상호작용이 이루어지며, 변경 사항을 적용할 때도 서로 마주보는 두 개의 계층에만 영향을 미치므로 변경 작업이 용이하다.
특정 계층만을 교체해 시스템을 개선하는 것이 가능하다.
- MVC(Model-View-Controller) Pattern
서브시스템을 3개의 부분으로 구조화하는 패턴이며, 각 부분의 역할은 다음과 같다.
Model: 서브시스템의 핵심 기능과 데이터를 보관한다.
View: 사용자(클라이언트)에게 정보를 표시한다.
Controller: 사용자(클라이언트)로부터 입력된 변경 요청을 처리하기 위해 모델에게 명령을 보낸다.
MVC패턴의 각 부분은 별도의 컴포넌트로 분리되어 있으므로 서로 영향을 받지 않고 개발 작업을 수행할 수 있다.
- Call and Return Pattern
Main 프로그램이 여러 프로그램 컴포넌트를 호출하고, 이 컴포넌트가 다시 다른 컴포넌트를 호출할 수 있는 제어 계층으로 기능을 분해하는 패턴이다.
Depth가 작고 Width가 크다. -> 추상화가 구체적이지 못하다.
Depth가 크고 Width가 작다. -> 추상화가 과하다.
Fan-out: Subprogram의 수
Fan-in: 현재 Program을 subprogram으로 갖는 program의 수