소프트웨어의 구성을 큰 그림으로 표현한 것이 소프트웨어 아키텍처이다. 대표적인 예로 Java 플랫폼 아키텍처가 있다.
N-티어 아키텍처라고도 불린다. 소프트웨어 개발에서 가장 일반적으로 널리 사용되는 아키텍쳐이다. 각 계층은 애플리케이션 내에서 특정 역할과 책임이 있다.
Layered Pattern의 강력한 기능 중 하나는 구성 요소 간의 관심 분리이다. 특정 계층 내의 구성 요소는 해당 계층과 관련된 논리만 처리한다.
Presentation Layer
사용자 인터페이스를 구현 및 표시하고 사용자 상호 작용을 관리하는 구성 요소가 포함된다.
Business Layer
비즈니스 로직을 수행하는 것을 주 관심사로 둔다. 예를 들면 회원가입, 비밀번호 수정 등이 있다.
Persistence Layer
애플리케이션의 영속성을 구현하기 위해, 데이터의 출처와 그 데이터를 가져오고 다루는 것을 주 관심사로 둔다.
Database Layer
데이터 베이스가 위치한 계층을 의미한다.
하나의 서버와 다수의 클라이언트 두 부분으로 구성된다. 사용자가 클라이언트를 통해 서버에 요청하고 클라이언트가 응답을 받아서 사용자에게 제공하는 방식으로 서비스를 제공한다. 이때 서버는 클라이언트의 요청에 대비해 항상 대기상태를 유지해야한다.
활용 : 이메일, 문서 공유 및 은행 등의 온라인 애플리케이션
마스터와 슬레이브 두 부분으로 구성되며 마스터 컴포넌트는 동등한 구조를 지닌 슬레이브 컴포넌트들로 작업을 분산하고 슬레이브가 반환한 결과값으로 부터 최종 결과값을 계산한다. 도중에 몇개의 슬레이브가 고장나도 업무 처리에는 문제가 없다.
활용 : 다중 스레드 응용프로그램
데이터 스트림 절차의 각 단계를 필터 컴포넌트로 캡슐화하여 파이프를 통해 데이터를 전송하는 패턴, 이 파이프는 버퍼링 또는 동기화 목적으로 사용될 수 있다. 필터 컴포넌트는 재사용이 좋으며 추가가 쉬워 확장에 용이하다. 또한 필터 컴포넌트들을 재배치하여 다양한 파이프라인을 구축할 수 있다.
활용 : 컴파일러, UNIX 쉘
분리된 컴포넌트들로 이루어진 분산 시스템에서 사용되며 원격 서비스 실행을 통해 각 컴포넌트들끼리 상호작용이 가능하다. 브로커 컴포넌트는 컴포넌트들 간의 통신을 조정하는 역할을 수행한다.
활용 : Apache Kafka, RabbitMQ
피어를 하나의 컴포넌트로 간주하며 각 피어는 서비스를 호출하는 클라이언트가 될수도, 서버가 될수도 있다. 즉, 피어는 클라이언트로서 각 피어에게 서비스를 요청할 수도 있고 서버로서 각 피어에게 서비스를 제공할 수도 있다.
활용 : 파일 공유 네트워크
이벤트 소스, 이벤트 리스너, 채널, 이벤트 버스로 4가지의 주요 컴포넌트로 구성된다. 소스가 메시지를 발행하면 해당 채널을 구독한 리스너들이 메시지를 받아 이벤트를 처리한다. 버스는 채널들을 관리한다.
활용 : 알림 서비스
소위 MVC 패턴이라고도 말한다. 여러 개의 뷰를 만들 수 있어 한 개의 모델에 대해 여러 개의 뷰를 필요로 하는 대화영 애플리케이션에 적합하다.
활용 : Django, Spring MVC
해결이 명확하지 않은 문제를 처리하는데 유용한 패턴으로 블랙 보드, 지식 소스, 제어 컴포넌트로 구성된다. 모든 컴포넌트는 블랙보드에 접근이 가능하며 컴포넌트는 블랙보드에 추가되는 새로운 데이터 객체를 생성할 수 있다.컴포넌트들은 검색을 통해 블랙보드에서 원하는 데이터를 찾아 지식 소스와의 패턴 매칭으로 데이터를 찾는다.
- 블랙보드(blackboard) – 솔루션(solution space)에서 가져온 객체(object)를 가지고 있는 구조화된 전역 메모리 (structured global memory)
- 지식 소스(knowledge source) – 각각의 표현을 기술한 모듈
- 제어 컴포넌트(control component) – 상황에 맞게 모듈을 선택/설정/실행
활용 : 음성 인식, 차량 식별
프로그램 코드의 각 라인을 수행하는 방법을 지정하고 기호마다 클래스를 갖도록 구성된다. 특정 언어로 작성된 프로그램을 해석하는 컴포넌트를 설계할 때 사용된다.
활용 : SQL, 통신 프로토콜을 정의하기 위한 언어
아키텍쳐 | 장점 | 단점 | |
---|---|---|---|
1 | 계층화 (Layered) | 하위 레이어는 다른 상위 레이어에 의해 사용된다. 레이어 표준화가 쉬우며 레이어 수준을 정의하기가 수월하다. 레이어를 변경해도 다른 레이어에는 영향을 끼치지 않는다. | 광범위한 적용이 어렵다. 특정 상황에서는 특정 레이어가 불필요할 수도 있다. |
2 | 클라이언트-서버 (Client-server) | 클라이언트가 요청할 수 있는 일련의 서비스를 모델링 할 수 있다 요청은 일반적으로 서버에서 별도의 스레드로 처리된다. | 프로세스간 통신은 서로 다른 클라이언트가 서로 다르게 표현되므로 오버헤드가 발생한다. |
3 | 마스터-슬레이브 (Master-slave) | 정확성 - 서비스의 실행은 각기 다른 구현체를 가진 슬레이브들에게 전파된다. | 슬레이브가 독립적이므로 공유되는 상태가 없다. 실시간 시스템에서는 마스터-슬레이브간 레이턴시 문제가 발생할 수 있다. 이 패턴은 분리 가능한 문제에만 적용할 수 있다. |
4 | 파이프-필터 (Pipe-filter) | 동시성 처리를 나타낸다. 입출력이 스트림으로 구성되고 필터가 데이터를 수신하면 연산을 수행하기 시작한다. 필터 추가가 쉽다. 시스템 확장성이 좋다. 필터는 재사용 가능하다. 주어진 필터들을 재구성하여 또 다른 파이프라인을 구축할 수 있다. | 가장 느린 필터 연산에 의해 효율성이 제한될 수 있다. 필터간 데이터 이동에서 데이터 변환 오버헤드가 발생한다. |
5 | 브로커 (Broker) | 객체의 동적인 변경, 추가, 삭제 및 재할당이 가능하며 개발자에게 배포를 투명하게 만든다. | 서비스 표현에 대한 표준화가 필요하다 |
6 | 피어 투 피어 (Peer to peer) | 탈중앙화된 컴퓨팅을 지원한다. 특정 노드 장애에 매우 강하다. 리소스 및 컴퓨팅 성능면에서 확장성이 뛰어나다. | 노드들이 자발적으로 참여하기 때문에 서비스 품질에 대한 보장이 어렵다. 보안에 대한 보장이 어렵다. 노드의 갯수에 따라 성능이 좌우된다. |
7 | 이벤트-버스 (Event-bus) | 새로운 발행자 (publishers)와 구독자 (subscribers) 및 연결의 추가가 수월하다. 고도로 분산화된 애플리케이션에 효과적이다. | 모든 메시지가 동일한 이벤트 버스를 통해 전달되기 때문에 확장성 문제가 발생할 수 있다. |
8 | 모델-뷰-컨트롤러 (MVC) | 동일한 모델에 대해 여러개의 뷰를 만들 수 있으며, 런타임에 동적으로 연결 및 해제를 할 수 있다. | 복잡성을 증가시키며, 사용자의 행동에 대한 불필요한 업데이트가 많이 발생할 수 있다. |
9 | 블랙보드 (Blackboard) | 새로운 애플리케이션을 쉽게 추가할 수 있다. 데이터 공간의 구조를 쉽게 확장할 수 있다. | 모든 애플리케이션이 영향을 받기 때문에 데이터 공간의 구조를 변경하기가 어렵다. 동기화 및 접근 제어가 필요할 수 있다. |
10 | 인터프리터 (Interpreter) | 매우 동적인 설계가 가능하다. 최종 사용자가 프로그래밍하기 좋다. 인터프리터 프로그램을 쉽게 교체할 수 있기 때문에 유연성이 향상된다. | 인터프리터 언어는 일반적으로 컴파일 언어보다 느리기 때문에 성능 문제가 발생할 수 있다. |
참고한 사이트