---
category: Architecture
tags: [auto-wikified, technical-documentation, merged, architecture]
title: Message Brokers
description: "메시지 브로커(Message Brokers)는 애플리케이션 아키텍처에서 시스템의 결과를 외부로 전달하는 보조 어댑터(Secondary Adapters) 및 출력 핸들러 역할을 수행하는 기술 요소입니다 [1]."
last_updated: 2026-05-04
---

# Message Brokers


## 📌 Brief Summary
메시지 브로커(Message Brokers)는 애플리케이션 아키텍처에서 시스템의 결과를 외부로 전달하는 보조 어댑터(Secondary Adapters) 및 출력 핸들러 역할을 수행하는 기술 요소입니다 [1]. 주로 메일, 알림, 로깅, 아카이빙 등의 기능을 처리하기 위해 비동기 메시징(async messaging)을 구현할 때 활용됩니다 [2]. 대표적인 종류로는 Redis, NATS, Kafka, RabbitMQ 등이 있으며, 동기식 프로토콜의 한계를 극복하고 비차단(non-blocking) 통신을 가능하게 합니다 [2-4]. 

## 📖 Core Content
* **아키텍처에서의 역할과 위치:** 헥사고날 아키텍처(Hexagonal Architecture) 패턴에서 메시지 브로커는 데이터베이스 리포지토리나 API 클라이언트와 함께 외부 시스템으로 데이터를 전달하는 '보조 어댑터(Secondary Adapters)'로 취급됩니다 [1]. 
* **프레임워크의 내장 지원 및 일관성:** NestJS와 같은 현대적 프레임워크는 마이크로서비스 전송 계층에 Redis, NATS, Kafka, RabbitMQ 등의 메시지 브로커를 기본적으로 내장하여 지원합니다 [3, 4]. 이러한 프레임워크는 다양한 전송 방식 간에 일관된 API를 제공하기 때문에 개발자가 메시지 브로커를 다른 종류로 전환(switching)하는 작업을 매우 직관적이고 간단하게 수행할 수 있습니다 [4]. 반면, Express와 같은 프레임워크는 내장된 마이크로서비스 지원이 없으므로 각 전송 메커니즘마다 개별 라이브러리를 별도로 구성해야 합니다 [3].
* **대규모 트래픽 분산과 비동기 처리:** HTTP는 동기식 프로토콜이므로 트래픽이 많은 시스템에서는 성능을 제약하는 병목 요소가 될 수 있습니다 [2]. 이를 해결하기 위해 메시지 브로커를 이용한 비동기 메시징 및 자동 백프레셔(back pressure)를 지원하는 비차단(non-blocking) 통신 방식이 권장됩니다 [2]. 소규모 개발 팀이 모놀리스(Monolith) 아키텍처로 프로젝트를 시작하더라도, 메일 전송이나 로깅과 같은 부가 작업에는 가능한 한 빨리 비동기 메시징을 도입하는 것이 좋습니다 [2].

## ⚖️ Trade-offs & Caveats
메시지 브로커를 도입하여 비동기 메시징 구조 및 마이크로서비스로 전환하는 것은 고트래픽 시스템에서 필수적인 최적화 방법이지만, 개발 관점에서는 시스템의 복잡성이 감소하기보다는 오히려 분산 시스템 특유의 복잡성이 증가하게 된다는 반대 급부(Trade-off)가 있습니다 [5]. 메시지 브로커 인프라를 활용하기 위해서는 자동화 및 오케스트레이션(orchestration)이 배포의 핵심 요건이 되며, 때로는 기성 솔루션 외에 자체적으로 맞춤 개발(custom build)을 진행해야 하는 제약 사항과 추가 작업이 발생할 수 있습니다 [5].

---
*Last updated: 2026-05-03*

## 📚 Legacy Insights & Additional Context
> [!NOTE]
> Below is content merged from previous versions of this documentation.

## 📌 Brief Summary
메시지 브로커(Message Brokers)는 이벤트 주도 아키텍처(Event-Driven Architecture) 및 분산 시스템에서 시스템 컴포넌트(생산자와 소비자) 간의 메시지나 이벤트를 비동기적으로 라우팅하고 전송하는 중앙 중개 요소입니다 [1-3]. 이를 통해 개별 서비스 간의 직접적인 통신 의존성을 제거하여 결합도(Coupling)를 낮추고, 시스템의 확장성과 내결함성(Fault tolerance)을 크게 향상시킵니다 [4, 5].

## 📖 Core 소스 Content
- **이벤트 채널 및 통신 중개:** 이벤트 주도 아키텍처에서 메시지 브로커는 이벤트 생산자가 생성한 이벤트를 이벤트 소비자에게 비동기적으로 전달하는 '이벤트 채널' 역할을 수행합니다 [1, 2]. 생산자와 소비자는 서로를 알 필요가 없으며, 브로커가 이를 중간에서 라우팅합니다 [2].
- **큐(Queues)와 스트림(Streams) 메커니즘:** 메시지 브로커는 주로 큐나 스트림 형태로 이벤트를 관리합니다 [6-8]. 큐는 이벤트가 처리될 때까지 대기시키는 데 유용하며 각 이벤트가 고유하게 한 번만 처리되도록 보장합니다 [6, 8]. 반면 스트림은 이벤트를 영구적으로 저장하여 여러 소비자가 각자의 속도에 맞춰 이벤트를 가져가거나 과거 이벤트를 재처리할 수 있도록 지원합니다 [7, 8].
- **브로커 아키텍처 패턴(Broker Architecture Pattern):** 분산 시스템 내에서 클라이언트의 요청이나 이벤트를 적절한 서버나 서비스로 전달하고 통신을 조정하는 중앙 컴포넌트 구조입니다 [3, 9]. 상태를 관리하거나 복잡한 워크플로우를 제어하는 메디에이터(Mediator) 토폴로지와 달리, 브로커는 주로 메시지를 시스템 전체에 브로드캐스트하거나 특정 채널로 전달하는 "단순한 파이프(dumb pipe)"의 역할을 합니다 [10, 11]. 
- **주요 활용 사례 및 도구:** 시스템의 읽기 모델과 쓰기 모델을 동기화해야 하는 CQRS 패턴 등에서 필수적으로 사용됩니다 [12]. 업계에서는 주로 Apache Kafka, RabbitMQ, ActiveMQ, JBoss Messaging과 같은 소프트웨어나 AWS SQS, AWS MQ, Google Cloud Pub/Sub과 같은 클라우드 서비스 형태로 구현됩니다 [1, 5, 13].

## ⚖️ Trade-offs & Caveats
- **아키텍처적 이점:** 서비스 간 강한 결합을 끊어내어(Decoupling) 수평적 확장이 용이해지며, 특정 서비스가 실패하더라도 이벤트가 큐에 저장되어 복구 후 처리될 수 있으므로 전체 시스템의 내결함성이 매우 높아집니다 [4, 5, 11].
- **인프라 비용 및 복잡성:** 메시지 브로커의 도입은 인프라 오버헤드와 비용 증가를 초래합니다 [14]. 또한, 적절한 페일오버(Failover) 매커니즘이나 페더레이션(Federation) 구조로 설계되지 않을 경우, 브로커 자체가 단일 장애점(Single Point of Failure)이 되어 전체 시스템을 마비시킬 위험이 있습니다 [9, 15].
- **데이터 일관성 및 지연 시간:** 직접적인 동기식 호출이 아니기 때문에 데이터가 즉시 일치하지 않는 최종 일관성(Eventual Consistency) 문제가 발생할 수 있으며 [14, 16], 브로커를 거쳐 메시지가 라우팅되는 과정에서 네트워크 대기 시간(Latency)이 발생할 수 있습니다 [5, 17].
- **디버깅 및 테스트 난이도 증가:** 수많은 서비스 간에 비동기적이고 분산된 이벤트 전달이 일어나므로, 에러 발생 시 장애를 추적하고 디버깅하는 과정이 기존 동기 시스템보다 훨씬 복잡해집니다 [14, 16, 18].

## 🔗 Knowledge Connections

### Related Concepts

#### [아키텍처 / 기반 기술]
- [[Event-Driven Architecture]]
  - 연결 이유: 메시지 브로커는 이벤트 주도 아키텍처에서 이벤트를 분배하는 핵심 인프라(이벤트 채널)로 작동하기 때문입니다 [1, 2].
  - 이 개념을 통해 더 깊게 이해할 수 있는 부분: 비동기 데이터 스트림 처리, 실시간 반응형 시스템의 동작 원리 및 브로커 토폴로지와 메디에이터 토폴로지의 차이.
- [[Microservices Architecture Pattern]]
  - 연결 이유: 독립적인 마이크로서비스 간의 느슨한 결합을 유지하고 통신하기 위해 메시지 브로커를 기반으로 한 비동기 메시징이 적극적으로 활용됩니다 [19, 20].
  - 이 개념을 통해 더 깊게 이해할 수 있는 부분: 분산 서비스 환경에서의 서비스 자율성(Autonomy) 및 통신 병목 해결 전략.

#### [구현 / 활용 도구 및 설계 기법]
- [[Apache Kafka / RabbitMQ]]
  - 연결 이유: 소스에서 명시적으로 언급된 메시지 브로커 소프트웨어의 실제 구현체입니다 [1, 5, 13].
  - 이 개념을 통해 더 깊게 이해할 수 있는 부분: 실제 큐(Queue)와 스트림(Stream) 기반 메시징이 소프트웨어 레벨에서 어떻게 구현 및 설정되는지.
- [[CQRS]]
  - 연결 이유: 데이터를 읽는 모델과 쓰는 모델을 분리하는 CQRS에서 두 모델 간의 동기화 오버헤드를 줄이기 위해 메시지 브로커가 필수적으로 요구됩니다 [12].
  - 이 개념을 통해 더 깊게 이해할 수 있는 부분: 데이터 집약적 애플리케이션에서 읽기와 쓰기 성능을 최적화하기 위한 브로커의 실무 적용 방법.

### Deeper Research Questions
- 이벤트 채널을 큐(Queue)로 구현할 때와 스트림(Stream)으로 구현할 때의 구조적 차이점은 무엇이며, 각각 어떤 비즈니스 프로세스(예: 이커머스 vs 실시간 로그 분석)에 적합한가?
- 중앙 집중형 메디에이터(Mediator)와 달리 브로커(Broker) 토폴로지만을 사용할 경우, 복잡한 비즈니스 트랜잭션 도중 발생하는 에러(Error)의 롤백 및 보상 트랜잭션 처리는 어떻게 구현해야 하는가?
- 메시지 브로커가 분산 시스템의 단일 장애점(Single Point of Failure)이 되는 것을 방지하기 위해 클라우드 네이티브 환경에서 적용할 수 있는 페더레이션(Federation) 및 확장 전략은 무엇인가?
- 동기적 HTTP REST 통신과 비교하여, 메시지 브로커를 활용한 비동기 통신이 마이크로서비스 간 통신 지연(Latency)과 시스템 전체 처리량(Throughput)에 미치는 영향은 어떻게 측정되고 최적화되는가?
- 이벤트 구조 변경이나 버전 관리가 필요할 때, 수많은 소비자가 연결된 메시지 브로커 환경에서 하위 호환성(Backward compatibility)을 유지하는 전략은 무엇인가?

### Practical Application Contexts
- **Implementation:** 애플리케이션 간 통신을 위해 Apache Kafka나 RabbitMQ를 설정하여 발행/구독(Publish/Subscribe) 채널을 만들고 서비스 로직에서 직접적 API 호출을 대체하여 코드를 작성합니다 [1, 2, 5].
- **System Design:** 트래픽 급증(Spike)이 예상되는 아키텍처를 설계할 때, 요청을 받아내는 웹 서버와 요청을 실제로 처리하는 워커(Worker) 서버 사이에 메시지 브로커를 배치하여 시스템 부하를 버퍼링하도록 설계합니다 [4, 21, 22].
- **Operation / Maintenance:** 메시지가 처리되지 못하고 쌓이는 병목 현상을 파악하기 위해 분산 추적(Distributed tracing) 도구를 도입하고, 문제 발생 이벤트를 처리하는 격리된 데드 레터 큐(Dead Letter Queue) 또는 에러 핸들러 프로세서를 모니터링해야 합니다 [14, 16].
- **Learning Path:** 클라이언트-서버 패턴에서의 동기 통신 한계점 학습 -> 마이크로서비스 도입에 따른 결합도 문제 파악 -> 이를 해결하기 위한 비동기식 이벤트 주도 아키텍처 학습 -> 실제 메시지 브로커 기술과 분산 데이터 일관성 최적화 기법 순으로 학습을 진행합니다 [2, 20, 23].
- **My Project Relevance:** 다수의 모듈이 서로 영향을 주지 않고 고유의 속도에 맞춰 대용량의 이벤트를 처리해야 하는 실시간 데이터 분석, 알림 전송 시스템, 이커머스 트랜잭션 등의 프로젝트 기획 및 개발 시 시스템 아키텍처의 중심 컴포넌트로 활용할 수 있습니다 [21, 24, 25].

### Adjacent Topics
- [[Event Sourcing]]
  - 확장 방향: 모든 데이터 변경 사항을 상태가 아닌 이벤트 로그의 스트림으로 저장하여 과거의 특정 시점으로 상태를 복원하거나 감사(Audit) 트레일을 구현하는 설계 기법으로 확장하여 연구할 수 있습니다 [26].
- [[Saga Pattern]]
  - 확장 방향: 각자 독립된 데이터베이스를 가지는 마이크로서비스 환경에서 메시지 브로커의 이벤트를 활용하여 일련의 분산 트랜잭션과 에러 보상(Compensating transaction)을 관리하는 구체적인 구현 패턴으로 지식을 확장할 수 있습니다 [16, 23].

---
*Last updated: 2026-05-02*
