software-design

Architecture Pattern

마트에서 장을 볼 때를 떠올려봅시다. 고객은 장바구니에 물건을 담고, 계산대로 이동해 결제를 합니다. 만약 사람이 많으면 여러 계산대를 열어 대기 시간을 줄이죠. 여기서 고객은 클라이언트, 계산대는 서버, 각 계산대는 독립적으로 요청을 처리합니다. 바로 이것이 클라이언트-서버 아키텍처의 일상 속 예시입니다.

소프트웨어 아키텍처 패턴은 시스템을 구성하는 방법에 대한 반복 가능한 설계 방식으로, 시스템의 구조와 각 구성 요소 간 관계를 정의합니다. 웹 애플리케이션의 전통적인 레이어드 아키텍처는 UI, 비즈니스 로직, 데이터베이스 접근을 각각 독립된 계층으로 분리하여 유지보수성을 높입니다. 마치 건물에서 ‘입구’, ‘사무실’, ‘기계실’이 층마다 역할이 다른 것처럼요.

반면 파이프-필터 패턴은 데이터를 여러 처리 단계로 흘려보내는 구조입니다. 예를 들어 커피 머신이 원두를 갈고, 뜨거운 물을 붓고, 필터를 통해 추출해내는 과정을 생각해보세요. 각 단계는 독립적으로 작동하며 결과를 다음 단계로 넘깁니다. 이런 패턴은 스트리밍 데이터 처리나 컴파일러 설계에서 자주 사용됩니다.

적절한 아키텍처 패턴 선택은 시스템 품질에 지대한 영향을 미칩니다. 예컨대 실시간 메시징 서비스는 이벤트 기반 아키텍처, 복잡한 대규모 서비스는 마이크로서비스 아키텍처가 적합할 수 있습니다. 상황에 맞는 아키텍처를 선택하는 것은 단순한 코드 설계를 넘어서 성능, 확장성, 유지보수성까지 좌우하는 중요한 아키택처라고 할 수 있습니다.


아키텍처 / 설계 패턴 요약표

패턴명설명적용 사례
레이어 패턴시스템을 기능별 계층(프레젠테이션, 비즈니스 로직, 데이터 접근 등)으로 분리하여 구조화. 유지보수성과 모듈화에 유리.전통적인 Spring MVC 웹 애플리케이션, Django 프레임워크
클라이언트-서버 패턴클라이언트가 요청을 보내고 서버가 처리해 응답하는 구조. 네트워크 기반 애플리케이션의 기본 모델.웹 브라우저 ↔ 웹 서버, 모바일 앱 ↔ 백엔드 API 서버
파이프-필터 패턴데이터를 여러 처리 단계(필터)를 거쳐 흐르게 하는 구조. 각 단계가 독립적으로 실행됨.Apache Kafka Streams, ETL 파이프라인, 컴파일러
MVC 패턴모델(데이터), 뷰(UI), 컨트롤러(로직)를 분리해 UI 중심 애플리케이션의 유지보수성 향상.Ruby on Rails, Spring MVC, ASP.NET MVC
마스터-슬레이브 패턴마스터가 제어하고 슬레이브들이 작업을 분산 수행. 병렬 처리, 부하 분산에 유리.MySQL Replication, Hadoop MapReduce
브로커 패턴클라이언트와 서버가 직접 연결되지 않고 브로커가 중재. 분산 시스템의 유연성을 높임.CORBA, Apache ActiveMQ, gRPC 서비스 메시
피어-투-피어(P2P) 패턴모든 노드가 동등하게 요청·응답을 처리. 중앙 서버 없이 동작.BitTorrent, Blockchain, Skype(초기 버전)
이벤트-버스 패턴이벤트 생산자와 소비자가 이벤트 버스를 통해 비동기적으로 메시지 전달.Kafka, RabbitMQ, AWS SNS/SQS, Frontend EventBus(Vue/React)
블랙보드 패턴중앙 데이터 공간(블랙보드)을 여러 컴포넌트가 공유하며 협력해 문제 해결.음성 인식 시스템, AI 진단 시스템, IDE의 코드 분석기
마이크로서비스 패턴애플리케이션을 작은 독립 서비스로 분리해 각각 배포·확장 가능. 대규모 시스템에 적합.Netflix, Uber, 쿠버네티스 기반 MSA, AWS Lambda + API Gateway
  • 레이어, 클라이언트-서버, MVC → 전통적이고 구조화된 애플리케이션 설계
  • 파이프-필터, 이벤트-버스, 브로커 → 데이터 흐름·메시징·분산 시스템에 적합
  • 마스터-슬레이브, P2P, 블랙보드 → 병렬 처리·협력형 문제 해결·분산 자율 시스템에 강점
  • 마이크로서비스 → 현대 클라우드 네이티브 환경의 표준 아키텍처

정리

아키텍처 패턴은 시스템의 구조와 컴포넌트 간 관계를 정의해 확장성, 성능, 유지보수성 같은 비기능적 요구사항까지 고려하는 큰 그림의 설계 방식입니다. 이번에 정리한 레이어, 클라이언트-서버, 파이프-필터, 이벤트-버스, 마이크로서비스 등은 실제 서비스 운영에서 빈번히 등장하는 대표적인 패턴으로, 상황에 따라 적절히 선택하면 일관성과 품질을 확보할 수 있습니다.

한 가지 주의할 점은 GoF 설계 패턴과 소프트웨어 아키텍처 패턴을 구분해야 한다는 것입니다. GoF 패턴은 주로 코드 레벨에서 재사용 가능한 객체지향 설계 해법(예: 싱글톤, 인터프리터, 옵저버 등)에 초점을 두는 반면, 아키텍처 패턴은 시스템 전체의 구조와 배치, 데이터 흐름을 다룹니다. 따라서 블로그나 기술 문서에서 두 범주를 혼동하지 않고, 요구사항의 수준(코드 단위 vs. 시스템 단위)에 맞는 패턴을 적용하는 것이 중요합니다.


참고