728x90
반응형
시스템을 어떤 구조로 설계할 것인가?
"Software Architecture Styles" 은 시스템을 구조적으로 설계할 때 반복적으로 사용되는 설계 패턴을 말한다.
이 "Software Architecture Styles" 은 시스템 설계의 '지도'라고 할 수 있다. 이 지도를 잘 아는 사람은 시스템이 사용되는 규모와 목적에 따라 올바른 길을 선택하고, 유지보수성과 확장성을 높이는데 큰 도움을 줄 수 있다.
Software Architecture Styles 의 목적별 활용 사례
| 최적의 설계 패턴 선택 | 시스템 규모, 팀 상황, 트래픽 특성에 맞는 아키텍처 선택 가능 | 스타트업 MVP → Layered, 글로벌 서비스 → Microservices |
| 개발 생산성과 유지보수성 향상 | 코드 구조 명확, 책임 분리, 유지보수 쉬움 | Layered: UI/비즈니스 로직 분리, Event-Driven: 새로운 기능 추가 시 기존 코드 영향 최소화 |
| 성능·확장성·보안 설계 | 아키텍처 스타일별로 성능과 보안 최적화 전략 적용 가능 | Microservices: 서비스별 독립 확장, Client-Server: 인증·보안 로직 집중 관리 |
| 의사소통 효율성 증가 | 팀 내 전문 용어로 빠르고 명확한 설계 논의 가능 | “이 서비스는 Event-driven 구조로 구현합니다” |
| 레거시 시스템 개선 | 기존 모놀리식 시스템을 효율적으로 분리·개선 가능 | Monolithic → Microservices, Event-driven로 리팩토링 |
| 기술 선택 가이드라인 제공 | 프레임워크·라이브러리·인프라 선택 시 방향성 제공 | REST API → Layered, 실시간 데이터 스트리밍 → Event-driven, 클라우드 네이티브 → Microservices + Serverless |
Software Architecture Styles
| Layered (계층형) | 시스템을 Presentation, Business, Data 등 계층으로 나눔. 유지보수 용이, 전통적인 엔터프라이즈 앱에 많이 사용. |
| Client-Server | 클라이언트(사용자 인터페이스)와 서버(데이터·로직 처리)를 분리. 웹 서비스, 모바일 앱의 기본 구조. |
| Microservices | 애플리케이션을 작고 독립적인 서비스 단위로 나눠 배포. 확장성과 유연성이 뛰어남. |
| Event-Driven | 이벤트(메시지)에 반응하는 비동기 시스템. IoT, 실시간 데이터 처리에서 자주 사용. |
| Pipe-and-Filter | 데이터를 처리하는 파이프라인 구조. 빅데이터 처리, 미디어 스트리밍 등에서 사용. |
| Service-Oriented (SOA) | 재사용 가능한 서비스 단위로 구성. 마이크로서비스 이전 세대의 서비스 아키텍처. |
| Peer-to-Peer (P2P) | 클라이언트-서버 구분 없이 모든 노드가 동등. 블록체인, 토렌트 등에 활용. |
| Message-Bus | 메시지 브로커를 통한 컴포넌트 간 통신 구조. 이벤트 드리븐 아키텍처와 연계. |
| MVC (Model-View-Controller) | UI 중심의 아키텍처. 웹 앱, 데스크탑 앱 설계 표준. |
| Serverless | 서버 관리 없이 이벤트 기반으로 클라우드 함수 실행. 비용 효율적이고 확장성 높음. |
Event-Driven Architecture
| 정의 | 이벤트(Event)를 중심으로 컴포넌트가 비동기적으로 통신하는 아키텍처 스타일 | 이벤트 발생 → Event Bus → 여러 Subscriber 처리 |
| 핵심 특징 | 1. 비동기 처리2. 느슨한 결합3. 확장성 높음4. 유연성 | 주문 완료 이벤트 → 재고, 결제, 알림 시스템 각각 독립 처리 |
| 필요성 / 원인 | - 실시간 데이터 처리 필요- 시스템 결합도가 높음 - 여러 서비스가 동시에 반응해야 함 - 비동기 처리로 시스템 부하 완화 |
IoT 센서 데이터, 전자상거래 주문, 주식 거래 시스템 등 |
| 구성 요소 | - Event (상태 변화) - Event Producer / Publisher - Event Consumer / Subscriber - Event Channel / Event Bus / Message Broker |
Kafka, RabbitMQ, AWS SNS/SQS, NATS |
| 적합한 시스템 | - 실시간 처리 시스템 - 확장성이 중요한 시스템 - 여러 서비스가 동시에 반응해야 하는 시스템 - 비동기 처리로 시스템 부하 완화 |
IoT, 마이크로서비스, 클라우드 네이티브, 전자상거래, 알림/통계 시스템 |
| 핵심 기술 | 1. 이벤트 생성(Publisher) → 코드, 라이브러리, 웹훅 2. 이벤트 전송(Message Broker / Pub-Sub) → Kafka, RabbitMQ, SNS/SQS 3. 이벤트 처리(Subscriber) → Worker, Serverless, 비동기 프레임워크 4. 이벤트 기록/관리 → Event Store, 모니터링, 재처리 |
Python Celery, FastAPI Background Tasks, Spring Events, Event Sourcing, Kafka Topics, ELK Stack, OpenTelemetry |
| 주요 고려 사항 | - Idempotency(중복 처리 방지) - Retry / Dead Letter Queue - Event Schema 정의 - Loose Coupling 유지 |
JSON/Avro/Protobuf로 이벤트 스키마 정의, 실패 이벤트 재처리 전략 |
Event-Driven Architecture 의 구성요소 상세
| 구성요소 | 역할 | 구현 기능 | 대표 기술 |
| Event (이벤트) | 시스템에서 발생한 상태 변화 | - 모델 저장, 사용자 액션 등 상태 변경 발생 - 이벤트 이름과 관련 데이터 포함 |
Python dict/JSON, Pydantic 모델, Django Signals payload |
| Event Producer / Publisher | 이벤트를 생성하고 발행 | - Django 모델의 post_save/post_delete signal 사용 - 특정 작업 완료 시 이벤트 발행 - Celery task로 브로커에 이벤트 전송 |
Django Signals, Celery send_task, Webhook, REST API |
| Event Consumer / Subscriber | 이벤트를 받아 실제 작업 수행 | - Celery worker에서 이벤트 수신 후 처리 - 비동기 task로 이메일 발송, 알림, DB 업데이트 수행 - 여러 subscriber 독립 실행 |
Celery tasks, Django Channels Consumers, Django Background Tasks, Asyncio + Django |
| Event Channel / Event Bus / Message Broker | 이벤트를 전달하고 구독자에게 배포 | - 이벤트 큐/브로커를 통해 Publisher와 Subscriber 연결 - 순서 보장, 재시도 가능 |
RabbitMQ, Redis Queue (RQ), Celery Broker, Kafka, AWS SQS |
| Event Store / 로그 | 이벤트 기록 및 재처리 | - 이벤트 데이터를 DB에 저장하여 재처리 가능 - 모델 이벤트 기록/audit trail 활용 |
Django models(예: EventLog), PostgreSQL/Redis, Kafka Topics |
| Monitoring / 관리 도구 | 이벤트 흐름 및 상태 추적 | - Celery task 모니터링, 실패 task 재시도 - 이벤트 처리 상태 및 시스템 성능 확인 |
Flower(Celery 모니터링), Sentry, Prometheus/Grafana, Django admin 로그 |
Event-Driven Architecture 구현을 위한 활용 기술
| 역할 | 목적 | 기능 | 활용 기술 |
| 이벤트 생성 (Event Producer / Publisher) | 이벤트 발생, 시스템 상태 변화를 브로커로 전달 | - 특정 상태 변화 시 이벤트 발행 - 코드 내에서 이벤트 구조 정의- 다른 시스템과 직접 연결 없이 이벤트 발행 |
Python: Django Signals, FastAPI Event, Celery send_taskWebhook, REST API |
| 이벤트 전송 / 브로커 (Event Channel / Message Broker) | 이벤트를 안전하게 전달하고 구독자에게 배포 | - 이벤트 전달 보장, 큐잉, 브로드캐스트 - Pub/Sub 패턴 지원 - 순서 보장/재시도 기능 |
RabbitMQ, Apache Kafka, AWS SNS/SQS, Google Pub/Sub, Redis Streams |
| 이벤트 처리 (Event Consumer / Subscriber) | 이벤트 수신 후 실제 작업 수행 | - 이벤트를 받아 비즈니스 로직 수행 - Worker나 서버리스 함수 등 독립적 실행 - 여러 subscriber가 독립적으로 처리 가능 |
Celery Worker, Django Channels Consumers, Asyncio, Serverless (AWS Lambda) |
| 이벤트 기록 / 스토리지 (Event Store / Logging) | 이벤트 기록, 재처리, 상태 복원 | - 이벤트 영구 저장 - 실패 이벤트 재처리, 시스템 감사(audit trail) 활용 - Event Sourcing 적용 가능 |
Kafka Topics, Event Sourcing, Django models (EventLog), PostgreSQL/Redis |
| 모니터링 / 관리 (Monitoring / Management) | 이벤트 흐름 및 처리 상태 추적 | - 이벤트 처리 상태 확인, 실패 이벤트 재처리 알림 - 성능 모니터링, 장애 분석 |
ELK Stack, OpenTelemetry, Jaeger, Zipkin, Flower(Celery), Sentry |
| 추가 고려 사항 | 안정성과 신뢰성 보장 | - Idempotency: 중복 처리 방지 - Retry / Dead Letter Queue: 실패 이벤트 처리 - Event Schema 정의: JSON, Avro, Protobuf - Loose Coupling: 서비스 간 직접 호출 최소화 |
Event schema 관리 툴, Celery Retry, Dead Letter Queue, Kafka Schema Registry |
Architectural Styles in History

728x90
반응형
'코딩' 카테고리의 다른 글
| Architectural Thinking (0) | 2025.09.05 |
|---|---|
| RAG System Architecture (0) | 2025.09.05 |
| SOA and Micro Service (0) | 2025.09.04 |
| SSO; Single Sign On (0) | 2025.09.04 |
| OAuth 2.0 (0) | 2025.09.03 |