소프트웨어 아키텍처 패턴
▼소프트웨어 아키텍처 패턴
소프트웨어 아키텍처를 설계하는데 발생하는 문제점을 해결하기 위한 재사용 가능한 솔루션으로 디자인 패턴과 유사하나 더 큰 범위에 속한다. 아키텍처 패턴을 사용하는 이유는 다음과 같다. 개발시간 단축, 고품질 소프트웨어의 안정적 개발 가능. 개발 단계에서 관계자간의 의사소통이 간단해지며, 시스템 구조의 이해도가 높아 유지보수에 유리하다는 점이다.
▼계층 패턴
이 패턴은 소프트웨어를 계층 단위로 분할하여 n-티어 아키텍쳐 패턴이라고도 불린다. 이는 하위 모듈들의 그룹으로 나눌 수 있는 구조화된 프로그램, 계층적으로 조직화된 서비스로 구성된 애플리캐이션에 적합하다. 각 하위 모듈들은 특정한 수준의 추상화를 제공한다. 각 계층은 다음 상위 계층에 서비스를 제공한다.
일반적인 정보 시스템에서 공통적으로 볼 수 있는 계층 4가지는 다음과 같다.
프레젠테이션 계층 (Presentation layer) - UI 계층 (UI layer)
애플리케이션 계층 (Application layer) - 서비스 계층 (Service layer)
비즈니스 논리 계층 (Business logic layer) - 도메인 계층 (Domain layer)
데이터 접근 계층 (Data access layer) - 영속 계층 (Persistence layer)
★장점
정보은닉의 원칙이 적용되며, 하위 레이어는 다른 상위 레이어에 의해 사용된다. 레이어 표준화가 쉬우며 레이어 수준을 정의하기가 수월하다. 레이어를 변경해도 다른 레이어에는 영향을 끼치지 않아 높은 이식성을 가진다.
★단점
추가적인 실팽시 오버헤드가 발생한다.
※오버헤드(Overhead) : 너무 많은 계층으로 성능감소 발생
★활용
일반적인 데스크톱 애플리케이션
E-commerce 웹 애플리케이션
▼클라이언트 - 서버패턴
이 패턴은 하나의 서버와 다수의 클라이언트, 두 부분으로 구성된다. 서버 컴포넌트는 다수의 클라이언트 컴포넌트로 서비스를 제공한다. 클라이언트가 서버에 서비스를 요청하면 서버는 클라이언트에게 적절한 서비스를 제공한다. 또한 서버는 계속 클라이언트로부터의 요청을 대기한다.
★장점
클라이언트가 요청할 수 있는 일련의 서비스를 모델링 할 수 있다
★단점
요청은 일반적으로 서버에서 별도의 스레드로 처리된다. 프로세스간 통신은 서로 다른 클라이언트가 서로 다르게 표현되므로 오버헤드가 발생한다.
★활용
이메일, 문서 공유, 은행 등 온라인 애플리케이션
▼마스터 - 슬레이브 패턴
이 패턴은 마스터와 슬레이브, 두 부분으로 구성된다. 마스터 컴포넌트는 동등한 구조를 지닌 슬레이브 컴포넌트들로 작업을 분산하고, 슬레이브가 반환한 결과값으로부터 최종 결과값을 계산한다.
★장점
정확성 - 서비스의 실행은 각기 다른 구현체를 가진 슬레이브들에게 전파된다.
★단점
슬레이브가 독립적이므로 공유되는 상태가 없다. 실시간 시스템에서는 마스터-슬레이브간 레이턴시 문제가 발생할 수 있다. 이 패턴은 분리 가능한 문제에만 적용할 수 있다.
★활용
데이터베이스 복제에서, 마스터 데이터베이스는 신뢰할 수 있는 데이터 소스로 간주되며 슬레이브 데이터베이스는 마스터 데이터베이스와 동기화된다. 컴퓨터 시스템에서 버스와 연결된 주변장치 (마스터 드라이버와 슬레이브 드라이버)
▼파이프 - 필터 패턴
이 패턴은 데이터 스트림을 생성하고 처리하는 시스템에서 사용할 수 있다. 각 처리 과정은 필터 (filter) 컴포넌트에서 이루어지며, 처리되는 데이터는 **파이프 (pipes)**를 통해 흐른다. 이 파이프는 버퍼링 또는 동기화 목적으로 사용될 수 있다.
★장점
동시성 처리를 나타낸다. 입출력이 스트림으로 구성되고 필터가 데이터를 수신하면 연산을 수행하기 시작한다. 필터 추가가 쉽다. 시스템 확장성이 좋다. 필터는 재사용 가능하다. 주어진 필터들을 재구성하여 또 다른 파이프라인을 구축할 수 있다.
★단점
가장 느린 필터 연산에 의해 효율성이 제한될 수 있다. 필터간 데이터 이동에서 데이터 변환 오버헤드가 발생한다.
★활용
생물정보학에서의 워크플로우나 컴파일러. 연속한 필터들은 어휘 분석, 파싱, 의미 분석 그리고 코드 생성을 수행한다.
▼ 브로커 패턴
이 패턴은 분리된 컴포넌트들로 이루어진 분산 시스템에서 사용된다. 이 컴포넌트들은 원격 서비스 실행을 통해 서로 상호 작용을 할 수 있다. 브로커 (broker) 컴포넌트는 컴포넌트 (components) 간의 통신을 조정하는 역할을 한다.
★장점
객체의 동적인 변경, 추가, 삭제 및 재할당이 가능하며 개발자에게 배포를 투명하게 만든다.
★단점
서비스 표현에 대한 표준화가 필요하다
★활용
Apache ActiveMQ, Apache Kafka, RabbitMQ 및 JBoss Messaging와 같은 메시지 브로커 소프트웨어
▼ 피어 투 피어 패턴
이 패턴에서는, 각 컴포넌트를 **피어 (peers)**라고 부른다. 피어는 클라이언트로서 피어에게 서비스를 요청할 수도 있고, 서버로서 각 피어에게 서비스를 제공할 수도 있다. 피어는 클라이언트 또는 서버 혹은 둘 모두로서 동작할 수 있으며, 시간이 지남에 따라 역할이 유동적으로 바뀔 수 있다.
★장점
탈중앙화된 컴퓨팅을 지원한다. 특정 노드 장애에 매우 강하다. 리소스 및 컴퓨팅 성능면에서 확장성이 뛰어나다.
★단점
노드들이 자발적으로 참여하기 때문에 서비스 품질에 대한 보장이 어렵다. 보안에 대한 보장이 어렵다. 노드의 갯수에 따라 성능이 좌우된다.
★활용
Gnutella나 G2와 같은 파일 공유 네트워크
P2PTV나 PDTP와 같은 멀티미디어 프로토콜
Spotify와 같은 독점적 멀티미디어 애플리케이션
▼ 이벤트 - 버스 패턴
이 패턴은 주로 이벤트를 처리하며 이벤트 소스 (event source), 이벤트 리스너 (event listener), 채널 (channel) 그리고 **이벤트 버스 (event bus)**의 4가지 주요 컴포넌트들을 갖는다. 소스는 이벤트 버스를 통해 특정 채널로 메시지를 발행하며 (publish), 리스너는 특정 채널에서 메시지를 구독한다 (subscribe). 리스너는 이전에 구독한 채널에 발행된 메시지에 대해 알림을 받는다.
★장점
새로운 발행자 (publishers)와 구독자 (subscribers) 및 연결의 추가가 수월하다. 고도로 분산화된 애플리케이션에 효과적이다.
★단점
모든 메시지가 동일한 이벤트 버스를 통해 전달되기 때문에 확장성 문제가 발생할 수 있다.
★활용
알림 서비스
안드로이드 개발
▼ MCV(Model View Controller)패턴
MVC 패턴이라고도 하는 이 패턴은 대화형 애플리케이션 (interactive application)을 다음의 3 부분으로 나눈다.
모델 (model) — 핵심 기능과 데이터를 포함한다
뷰 (view) — 사용자에게 정보를 표시한다 (하나 이상의 뷰가 정의될 수 있음)
컨트롤러 (controller) — 사용자로부터의 입력을 처리한다
이는 정보가 사용자에게 제공되는 방식과 사용자로부터 받아 들여지는 방식에서 정보의 내부적인 표현을 분리하기 위해 나뉘어진다. 이는 컴포넌트를 분리하며 코드의 효율적인 재사용을 가능케한다.
★장점
동일한 모델에 대해 여러개의 뷰를 만들 수 있으며, 런타임에 동적으로 연결 및 해제를 할 수 있다.
★단점
복잡성을 증가시키며, 사용자의 행동에 대한 불필요한 업데이트가 많이 발생할 수 있다.
★활용
일반적인 웹 애플리케이션 설계 아키텍쳐
Django나 Rails와 같은 웹 프레임워크
▼블랙보트 패턴
이 패턴은 결정 가능한 해결 전략이 알려지지 않은 문제에 유용하다. 이 패턴은 3가지 주요 컴포넌트로 구성된다.
- 블랙보드 (blackboard) — 솔루션의 객체를 포함하는 구조화된 전역 메모리
- 지식 소스 (knowledge source) — 자체 표현을 가진 특수 모듈
- 제어 컴포넌트 (control component) — 모듈 선택, 설정 및 실행을 담당한다
모든 컴포넌트는 블랙보드에 접근한다. 컴포넌트는 블랙보드에 추가되는 새로운 데이터 객체를 생성할 수 있다. 컴포넌트는 블랙보드에서 특정 종류의 데이터를 찾으며, 기존의 지식 소스와의 패턴 매칭으로 데이터를 찾는다.
★장점
새로운 애플리케이션을 쉽게 추가할 수 있다. 데이터 공간의 구조를 쉽게 확장할 수 있다.
★단점
모든 애플리케이션이 영향을 받기 때문에 데이터 공간의 구조를 변경하기가 어렵다. 동기화 및 접근 제어가 필요할 수 있다.
★활용
음성 인식, 차량 식별 및 추적, 단백질 구조 식별, 수중 음파 탐지기 신호 해석
▼인터프리터 패턴
이 패턴은 특정 언어로 작성된 프로그램을 해석하는 컴포넌트를 설계할 때 사용된다. 이는 주로 특정 언어로 작성된 문장 혹은 표현식이라고 하는 프로그램의 각 라인을 수행하는 방법을 지정한다. 기본 아이디어는 언어의 각 기호에 대해 클래스를 만드는 것이다.
★장점
매우 동적인 설계가 가능하다. 최종 사용자가 프로그래밍하기 좋다. 인터프리터 프로그램을 쉽게 교체할 수 있기 때문에 유연성이 향상된다.
★단점
인터프리터 언어는 일반적으로 컴파일 언어보다 느리기 때문에 성능 문제가 발생할 수 있다.
★활용
SQL과 같은 데이터베이스 쿼리 언어
통신 프로토콜을 정의하기 위한 언어