Tag Archives: Architectural Patterns

아키텍쳐 패턴이란 – 소프트웨어 디자인 패턴

외국인회사에 있다 보면 개발자 채용시 아키텍쳐 설계 부분도 이야기를 하게 됩니다. 그러면 어떤 어프로치로 소프트웨어를 설계해야 하느냐에 대한 논의를 하게 됩니다.

소프트웨어 개발/설계시 아키텍쳐링을 하다 보니 반복되는 패턴이 나오기 시작했고, 사람들은 이 패턴에 이름을 붙이기 시작했습니다. 즉, 아키텍쳐 패턴(Archiectural Patterns)이라 함은 소프트웨어 디자인 패턴이라고 할 수 있습니다. 참고로 패턴(Pattern)=유형,종류 라고 간주하셔도 될 것 같습니다.

 

아키텍쳐 패턴(Architectural Patterns)은 대략 다음의 10가지 종류가 있습니다.

1. Layered pattern

2. Client-server pattern

3. Master-slave pattern

4. Pipe-filter pattern

5. Broker pattern

6. Peer-to-peer pattern

7. Event-bus pattern

8. Model-view-controller pattern

9. Blackboard pattern

10. Interpreter pattern

 

여기에 하나 빠진것이 있다면 최근 떠오르는 MSA(Micro Service Architecture)가 있을텐데요… 이정도 길이면 학생들 가르킬때 21주짜리 프로그램이 하나 나올법도 하네요.

Interpreter pattern은 SQL 또는 통신프로토콜을 기술하는 언어 구현시 주로 이용되는 아키텍쳐

인터프리터 아키텍쳐 패턴(Interpreter Architectural pattern)은 프로그래밍 언어의 특정 구문을 해석/분석하는 컴포넌트 디자인에 많이 사용됩니다.

이 아키텍쳐의 기본 아이디어는 각각의 표현마다 클래스를 가지도록 하여 이를 조합하는 구조를 만드는 것입니다.

Interpreter pattern은 SQL 또는 통신프로토콜을 기술하는 언어 구현시 주로 이용되는 아키텍쳐
인터프리터 아키텍쳐 패턴(Interpreter Architectural pattern)은 SQL과 같은 Database Query Language 또는 특정 통신 프로토콜을 기술하기 위한 언어 등에 주로 응용되고 있습니다.

인터프리터 아키텍쳐 패턴(Interpreter Architectural pattern)의 장점이라 함은 동적인 설계가 가능하며, 최종 사용자가 프로그래밍하기 좋다. 즉, 인터프리터 프로그램을 쉽게 교체할 수 있기 때문에 유연성이 향상된다고 할 수 있습니다.

반면에 인터프리터 언어는 일반적으로 컴파일 언어보다 느리기 때문에 성능 문제가 발생할 수 있다는 단점이 있습니다.

Blackboard pattern은 오늘날 NLU(Natural Language Understanding)이나 차량인식 등에 응용되는 아키텍쳐

블랙보드 아키텍쳐 패턴(Blackboard Architectural pattern)은 Non-deterministic algorithm(비결정성 알고리즘)을 구현하는데 널리 이용되고 있습니다.

Non-deterministic algorithm(비결정성 알고리즘)은 그 다음 단계의 결과가 실행할때마다 다르게 나올 수 있는 알고리즘을 의미합니다. 참고로 Deterministic algorithm(결정성 알고리즘)은 결과가 유니크(Unique)합니다. 즉, 특정 값으로 떨어집니다.

Non-deterministic algorithm(비결정성 알고리즘)의 예는 “오늘 날씨 어떻지?”라는 함수를 호출했을때, 아침에는 “맑음”이었는데, 같은 함수를 오후에 호출하면 “흐림”으로 나오는 것이 그 예라고 할 수 있습니다.

블랙보드 아키텍쳐 패턴은 크게 3개의 컴포넌트로 이루어져 있습니다.

  • 블랙보드(blackboard) – 솔루션(solution space)에서 가져온 객체(object)를 가지고 있는 구조화된 전역 메모리 (structured global memory)
  • 지식소스(knowledge source) – 각각의 표현을 기술한 모듈
  • 컨트롤 컴포넌트(control component) – 상황에 맞게 모듈을 선택/설정/실행 합니다

모든 컴포넌트는 블랙보드를 통해 제어되며, 각각의 컴포넌트들은 백보드의 데이터 객체(data object)로 생성되어, 각각의 패턴에 맞는 지식소스로부터 패턴이 일치하게 되면 정해진 프로세스를 수행하게 됩니다.

Blackboard pattern은 오늘날 NLU(Natural Language Understanding)이나 차량인식 등에 응용되는 아키텍쳐

블랙보드 아키텍쳐 패턴(Blackboard Architectural pattern)은 구문인식(Speech recognition), 차량인식 및 추적(Vehicle identification and tracking), 시그널프로세싱, 단백질 구조 분석(Protein structure identification) 등에 응용되고 있습니다.

마지막으로 블랙보드 아키텍쳐 패턴(Blackboard Architectural pattern)의 장단점을 언급하면, 새로운 애플리케이션을 쉽게 추가할 수 있다는 장점이 있습니다만, 데이터 공간의 구조를 변경은 모든 애플리케이션이 영향을 받기 때문에 하기가 어렵다는 단점이 있어 동기화 및 접근 제어가 필요할 수 있습니다.

MVC(Model-view-controller) pattern은 Django, Rails와 같은 웹 어플리케이션 개발에 주로 응용되는 아키텍쳐

MVC(Model-view-controller) 아키텍쳐 패턴(Architectural pattern)은 웹 어플리케이션 개발에 주로 이용되는 아키텍쳐 패턴입니다.

MVC는 다음의  3개 파트로 구성되어져 있습니다.

  • 모델(model) – 기본 함수와 데이터를 포함합니다
  • 뷰(view) – 정보를 사용자에게 보여줍니다. 웹페이지 그 자체를 생각하시면 될 것 같습니다
  • 컨트롤러(controller) – 사용자로부터의 입력을 처리합니다

이 패턴의 기본 아이디어는 UI/연산(모델)/제어를 각각 분리하여 효율화를 하겠다는 것입니다. 실제 서비스 구축시에는 각각의 파트가 서버 인스턴스로 구성되어 퍼포먼스에 따른 서버 리소스 할당을 하여 효율화를 하기도 합니다.

MVC(Model-view-controller) pattern은 Django, Rails와 같은 웹 어플리케이션 개발에 주로 응용되는 아키텍쳐

MVC 아키텍쳐 패턴은 Java, Python, PHP와 같은 주요 프로그래밍 언어로 웹 어플리케이션 아키텍쳐 디자인시 주로 사용되고 있으며, Django나 Rails와 같은 웹 프레임웍(Web frameworks)에서도 사용되고 있습니다.

MVC 아키텍쳐 패턴은 동일한 모델에 대해 여러개의 뷰를 만들 수 있으며, 런타임에 동적으로 연결 및 해제를 할 수 있다는 장점이 있습니다. 그러나 이것이 오히려 복잡성을 증가시키며, 사용자의 행동에 대한 불필요한 업데이트가 많이 발생할 수 있다는 단점 또한 가지고 있습니다.

최근에는 RESTful API (Open API) 기반의 서비스/소프트웨어 개발이  널리 이용되면서 점차 MSA(마이크로 서비스 아키텍쳐; Micro Service Architecture)로 이동하는 추세를 보이고 있습니다.

Event-bus pattern은 Push Notification Service, 안드로이드 앱 개발에 주로 응용되는 아키텍쳐

이벤트-버스 아키텍쳐 패턴(Event-bus Architectural pattern)은 4개의 주요 컴포넌트로 구성되어져 있는데, 이들 컴포넌트는 이름에서 예상되듯 이벤트를 다루는 컴포넌트 입니다.

  • 이벤트 소스(event source)
  • 이벤트 리스너(event listener)
  • 채널(channel)
  • 이벤트 버스(event bus)

아래의 그림에서 특정 채널을 통해 메시지가 메시지 버스를 통해 전달 되면, 리스너(listener)는 등록(subscribe)한 특정 채널에 해당하는 메시지를 이벤트로 받는 구조입니다. 이 이벤트를 받는 것을 영어로 Event Notification이라고도 합니다.

Event-bus pattern은 Push Notification Service, 안드로이드 앱 개발에 주로 응용되는 아키텍쳐

안드로이드(Android)/아이폰 앱 개발이 이 아키텍쳐 패턴(Architectural pattern)에 해당하며, Push Notification Service도 이벤트-버스(Event-bus) 아키텍쳐 패턴(Architectural pattern)에 해당된다고 할 수 있습니다.

이벤트-버스 아키텍쳐 패턴(Event-bus Architectural pattern)은 고도로 분산화된 애플리케이션에 효과적이라고 할 수 있습니다. 반면, 모든 메시지가 동일한 이벤트 버스를 통해 전달되기 때문에 확장성 문제가 발생할 수 있다는 단점이 있습니다.

Peer-to-peer pattern은 BitTorrent와 같이 파일공유 솔루션이나 P2PTV, PDTP와 같은 멀티미디어 프로토콜에 주로 이용

P2P는 Peer-to-Peer의 줄임말입니다.

P2P 아키텍쳐 패턴(Architectural pattern)에서 개개의 각각의 독립적인 컴포넌트를 피어(peer)라고 부릅니다. 각각의 피어는 클라이언트로서 다른 피어에게 서비스를 요청하면서 한편으로는 서버로서 요청받은 서비스를 동적으로 처리해주는 기능을 가집니다.

Peer-to-peer pattern은 BitTorrent와 같이 파일공유 솔루션이나 P2PTV, PDTP와 같은 멀티미디어 프로토콜에 주로 이용

2000년대 초반에 많이 쓰이던 당나귀(eDonkey), 냅스터(Napster), 소리바다와 같은 소프트웨어가 P2P 아키텍쳐 패턴에 해당하며, P2PTV나 PDTP같은 멀티미디어 프로토콜이 및 비트코인이나 이더리움 등의 최근 크립토 커런시(Crypto Currency) 등이 아키텍쳐 패턴에 해당합니다.

P2P 아키텍쳐 패턴(Architectural pattern)은 탈중앙화된 컴퓨팅을 지원하며, 특정 노드 장애에 매우 강하고, 리소스 및 컴퓨팅 성능면에서 확장성이 뛰어나다는 장점이 있습니다. 
반면에 노드들이 자발적으로 참여하기 때문에 서비스 품질에 대한 보장이 어려우며 보안에 대한 보장이 어렵고, 노드의 갯수에 따라 성능이 좌우된다는 것은 단점이라고 할 수 있습니다.

Broker pattern은 Apache ActiveMQ, Apache Kafka, RabbitMQ 등 메시지 미들웨어 같은 아키텍쳐에 주로 이용

브로커아키텍쳐 패턴(Broker Architectural pattern)은 클라이언트-서버(Client-Server) / 마스터-슬레이브(Master-Slave) 처럼 역할이 분리된 컴포넌트(decoupled components)를 구조화하는데 주로 응용되는 패턴입니다.

여기서 브로커 컴포넌트는 컴포넌트간 통신(communication)을 조율(coordination) 하는 역할을 담당합니다.

클라이언트가 어떤 요청사항을 전달하면, 브로커가 중간에 받아서 이를 처리할 기능이 있는 서버로 명령을 요청하게 되고, 서버가 이에 따른 결과를 처리하는 방식입니다.

Broker pattern은 Apache ActiveMQ, Apache Kafka, RabbitMQ 등 메시지 미들웨어 같은 아키텍쳐에 주로 이용

Apache ActiveMQ, Apache Kafka, RabbitMQ and JBoss Messaging과 같은 소프트웨어가 브로커(Broker) 아키텍쳐 패턴(Architectural pattern)에 해당합니다.

브로커아키텍쳐 패턴(Broker Architectural pattern)은 객체의 동적인 변경, 추가, 삭제 및 재할당이 가능하며 개발자에게 배포를 투명하게 할 수 있다는 장점이 있습니다.

또한 배포를 투명하게 하려면 서비스 표현에 대한 문서화 등의 표준화가 필요합니다.

Pipe-filter pattern은 컴파일러와 같이 통해 연속되는 필터링 기법을 통한 분석을 하는 아키텍쳐에 주로 이용

파이프-필터 아키텍쳐 패턴(Architectural pattern)은 웹로그와 같은 텍스트 기반의 데이터 또는 프로그램 소스 코드 등과 같은 데이터 스트림을 처리하는데 적합합니다.

각각의 프로세스는 필터 컴포넌트 내에서 처리되며, 데이터는 파이프를 통해 전달되어 처리되어집니다. 이러한 파이프는 버퍼링을 하거나 동기화 하는 목적으로 사용됩니다.

Pipe-filter pattern은 컴파일러와 같이 통해 연속되는 필터링 기법을 통한 분석을 하는 아키텍쳐에 주로 이용

컴파일러, DNA정보 분석 소프트웨어가 파이프-필터 아키텍쳐 패턴(Architectural pattern)기반이라고 할 수 있습니다.

파이프-필터 아키텍쳐 패턴(Architectural pattern)은 다음과 같은 장점이 있습니다.

  • 필터 추가가 쉬움
  • 시스템 확장성이 좋음
  • 필터 재사용 가능
  • 주어진 필터들을 재구성하여 또 다른 파이프라인을 구축할 수 있음

반면에 단점이라 하면, 특정 필터 연산의 성능이 전체 효율에 영향을 미칠 수 있다는 것입니다.

Master-slave pattern은 장애 대응을 위한 Database 복제 등 병렬처리 및 Disaster Recovery 대응 로직에 주로 이용

마스터-슬레이브 아키텍쳐 패턴(Master-Slave Architectural pattern)은 마스터(master)와 슬레이브(slave)로 구성되어져 있는데, 마스터는 일을 분배하는 역할을 가지고 있으며, 슬레이브는 전달된 기능을 수행합니다.

즉, 마스터(주인)이 업무를 지시하면, 슬레이브(하녀)는 그 일을 완료하여 결과물을 전달 하는 것입니다.

Master-slave pattern은 장애 대응을 위한 Database 복제 등 병렬처리 및 Disaster Recovery 대응 로직에 주로 이용

마스터-슬레이브 아키텍쳐 패턴(Master-Slave Architectural pattern)의 예로는 데이터베이스 복제(replication)를 들 수 있습니다. 즉, 마스터 DB는 원본데이터를 가지고 있고, 슬레이브는 그 복제본을 동기화하여 가지고 있습니다.

참고로 replication이라 함은 사전적으로 “복제”라는 의미를 가지고 있습니다.

다른 예로는 USB 허브를 예로 들수 있는데, USB 허브를 통해 마스터 포트에서 사용하던 기능을 그대로 사용할 수 있습니다.

마스터-슬레이브 아키텍쳐 패턴(Master-Slave Architectural pattern)의 장점은 정확성에 있습니다. 즉, 서비스의 실행은 각기 다른 구현체를 가진 슬레이브들에게 전파되어 설계된 로직대로 동작합니다.

반면에, 슬레이브가 독립적이므로 공유되는 상태가 없으므로 실시간 시스템에서는 마스터-슬레이브간 레이턴시 문제가 발생할 수 있습니다. 이 패턴은 분리 가능한 문제에만 적용할 수 있다.

Client-server pattern은 TCP/IP를 통해 데이터를 주고 받는 이메일, 웹하드 등이 주로 이용하는 아키텍쳐

클라이언트-서브 아키텍쳐 패턴(Client-Server Architectural pattern)은 서버와 다수의 클라이언트로 구성된 2-Tier Architecture입니다.

서버는 다수의 클라이언트 컴포넌트에게 서비스를 제공하고, 클라이언트는 서버로부터 서로 약속한 서비스를 받는 구조입니다. 따라서, 이 구조에서는 서버가 클라이언트로부터 지속적으로 요청을 받아 처리하도록 설계되어져 있습니다.

 

Client-server pattern은 TCP/IP를 통해 데이터를 주고 받는 이메일, 웹하드 등이 주로 이용하는 아키텍쳐

응용분야로는 TCP/IP를 기반으로하는 Client-Server 소프트웨어로 이메일, 문서 공유 웹하드, 홈뱅킹 등이 있습니다.

클라이언트-서브 아키텍쳐 패턴(Client-Server Architectural pattern)은 클라이언트가 요청할 수 있는 일련의 서비스를 모델링 할 수 있다는 장점이 있습니다. 또한 이 아키텍쳐는 일반적으로 서버에서 별도의 스레드로 구현되며, 프로세스간 통신의 프로토콜이 달라 오버헤드가 발생할 수 있다는 단점이 있습니다.

Layered pattern은 PC App, 쇼핑몰(이커머스) 웹사이트 등이 주로 쓰는 아키텍쳐 패턴

레이어드 아키텍쳐 패턴(Layered architectural pattern)은 특정 수준의 추상화 된 레벨의 서브 펑션으로 구성된 스트럭쳐드 프로그램(Structure programs)에 널리 이용되고 있습니다.

각각의 레이어는 차상위 레벨의 레이어에게 서비스를 구성하도록 설계되어져 있는데, 통상 다음과 같이 4단계의 레이어를 이용하여 일반적인 정보 시스템을 구성하고는 합니다.

  • Presentation layer (UI layer라고도 부름)
  • Application layer (service layer라고도 부름)
  • Business logic layer (domain layer라고도 부름)
  • Data access layer (persistence layer라고도 부름)

 

Layered pattern은 PC App, 쇼핑몰(이커머스) 웹사이트 등이 주로 쓰는 아키텍쳐 패턴

 

레이어드 아키텍쳐 패턴의 사례로는 일반적인 데스크톱 어플리케이션 (General desktop applications)이나 아마존닷컴이나 알리익스프레스 같은 이커머스 웹 어플리케이션 (E commerce web applications)을 들 수 있습니다.

이 아키텍쳐의 장점이라 하면 하위 레이어는 다른 상위 레이어에 의해 사용이 되며, 레이어 표준화가 쉬우며 레이어 수준을 정의하기가 수월하다는 것입니다. 또한 레이어를 변경해도 다른 레이어에는 영향을 끼치지 않습니다.

반면에 단점이라 하면 광범위한 적용이 어렵다는 것인데, 특정 상황에서는 특정 레이어가 불필요할 수도 있습니다.