포트폴리오 인사이트 구축: 이벤트 기반 .NET 마이크로서비스 대시보드에서 얻은 교훈

발행: (2025년 12월 17일 오전 12:59 GMT+9)
10 min read
원문: Dev.to

I’m happy to help translate the article, but I don’t see the text you’d like translated—only the source line is provided. Could you please paste the content you want translated (excluding any code blocks or URLs you’d like to keep unchanged)? Once I have the text, I’ll translate it into Korean while preserving the original formatting.

포트폴리오 인사이트 – 개인 재무 대시보드

  • .NET 8, RabbitMQ, gRPC, Docker (마이크로서비스 아키텍처) 로 구축*

개요

Portfolio Insights는 데모용 .NET 8 마이크로서비스 기반 개인 재무 및 분석 플랫폼입니다. 이전 E‑Commerce Microservices 프로젝트에서 탐색한 아키텍처 패턴을 기반으로 하며, 숫자 중심의 분석 도메인에 적용했습니다.

이 애플리케이션을 통해 사용자는:

  • 포트폴리오 관리 (자산 및 수량)
  • 시뮬레이션된 시장 가격 조회
  • 포트폴리오 분석을 비동기적으로 계산
  • 분석이 새로 고쳐질 때 알림 수신

모든 서비스는 컨테이너화되어 Docker Compose를 통해 오케스트레이션되며, 현실적인 엔드‑투‑엔드 분산 시스템을 보여줍니다.

배운 점

  • 이벤트‑드리븐 마이크로서비스
  • gRPC 및 HTTP 통신
  • CQRS 및 레이어드 아키텍처
  • 메시지‑기반 분석 파이프라인
  • Vertical Slice & Clean Architecture
  • Docker를 활용한 컨테이너 오케스트레이션
  • 교차 절단 관심사 (검증, 로깅, 헬스 체크, 커스텀 예외 처리)

솔루션 아키텍처

솔루션은 여덟 개의 프로젝트로 구성되며, 모두 동일한 디렉터리 레벨에 위치합니다:

ServiceResponsibilityData Store
Market Data Service시장 가격을 시뮬레이션하고 게시함SQLite / Redis / In‑memory
Portfolio Service사용자 포트폴리오 및 자산을 소유함PostgreSQL (Marten)
Analytics Service포트폴리오와 시장 이벤트로부터 메트릭을 계산함SQL Server (layered architecture)
Notification Service분석 결과에 반응하고 알림을 저장함SQLite
YARP API Gateway모든 클라이언트 트래픽에 대한 단일 진입점 제공
Razor Pages Web Client게이트웨이를 통해 시스템을 사용하는 UI
(Other supporting projects)인프라, 계약 등

고수준 흐름

  1. User 가 포트폴리오에 자산을 추가/수정합니다.
  2. Portfolio ServicePortfolioUpdatedEvent 를 게시합니다.
  3. Analytics Service 가 이벤트를 소비하고 최신 시장 가격과 결합하여 메트릭을 계산합니다.
  4. Analytics ServiceAnalyticsComputedEvent 를 게시합니다.
  5. Notification Service 가 반응하여 사용자 알림을 저장합니다.
  6. 클라이언트 가 데이터가 준비되면 Analytics 또는 Notification 엔드포인트에 조회합니다.

통신 방식

  • gRPC – 낮은 지연시간의 요청/응답 상호작용 (예: Portfolio Service → Market Data Service 로 현재 가격 요청).
  • RabbitMQ + MassTransit – 이벤트 기반 워크플로우 (포트폴리오 업데이트, 시장 가격 변동, 분석 계산).

Source:

디자인 인사이트

다이어그램 먼저

코드를 작성하기 전에 다음을 설계했습니다:

  • Data ownership per service
  • Synchronous vs. asynchronous interactions
  • State‑change propagation across the system

이 사전 작업을 통해 비용이 많이 드는 재설계를 방지하고 엔드포인트 계약을 명확히 할 수 있었습니다.

비동기 UI 고려 사항

분석이 백그라운드에서 계산되기 때문에 Razor Pages 클라이언트는 다음을 수행해야 합니다:

  • 백그라운드 워크플로를 시작하는 명령을 트리거
  • 대기 중에는 이전에 계산된 데이터를 표시
  • 하위 서비스가 이벤트를 처리하면 뷰를 새로 고침

UI를 설계하면서 언제 데이터를 요청하고 어느 서비스가 데이터를 제공해야 하는지 신중히 고민하게 되었습니다.

서비스별 스토리지

ServiceStorage ChoiceRationale
PortfolioPostgreSQL (Marten)유연한 포트폴리오 형태를 위한 문서‑스토어 의미론
AnalyticsSQL Server복잡한 메트릭 계산을 위한 관계형 쿼리
Market DataSQLite / Redis / In‑memory시뮬레이션된 가격 피드를 위한 경량 영속성
NotificationSQLite사용자 알림을 위한 간단하고 내구성 있는 스토리지

핵심 원칙: 소유권의 명확성이 서비스 간 엄격한 일관성보다 중요합니다.

프로젝트 실행

# Clone the repository
git clone https://github.com/yourusername/Portfolio-Insights.git
cd Portfolio-Insights

# Start all services with Docker Compose
docker compose up --build

게이트웨이는 http://localhost:5000에서 접근할 수 있으며, Razor Pages UI는 http://localhost:5000/ui에서 확인할 수 있습니다.

최종 생각

Portfolio Insights는 학습 및 포트폴리오 프로젝트이지만, 현대 .NET 마이크로서비스에 대한 이해를 한 단계 끌어올리는 의미 있는 단계입니다:

  • 이벤트‑드리븐 시스템에서는 명확한 경계와 명시적인 계약이 필수적입니다.
  • 초기 워크플로우 다이어그램 작성은 시간을 절약하고 결합도를 낮춥니다.
  • 프런트‑엔드 설계는 비동기 처리의 현실을 반영해야 합니다.
  • Docker Compose는 전체 분산 시스템을 사고하는 데 탁월한 샌드박스를 제공합니다.

코드를 탐색하고, 컨테이너를 실행하며, 아키텍처를 실험해 보세요!

마이크로서비스, 비동기 통신 및 시스템‑레벨 설계

유사한 아키텍처를 탐구하고 있다면 가장 큰 조언은 간단합니다: 코드보다 흐름을 먼저 설계하세요. 이벤트‑드리븐 시스템에서는 그 명확성이 모든 차이를 만듭니다.

Source:

다음은?

이 글을 통해 실제 .NET 애플리케이션에서 이벤트‑드리븐 마이크로서비스 아키텍처가 어떻게 구성되는지 더 명확히 이해하셨다면, 다음과 같은 방법으로 탐구를 이어갈 수 있습니다:

  • 📁 GitHub 저장소 살펴보기 – 전체 소스 코드를 검토하여 서비스, 메시지 흐름, API 게이트웨이, Razor Pages 클라이언트가 어떻게 결합되는지 확인하세요. 아키텍처 다이어그램과 코드를 동시에 보면 동기식 및 비동기식 통신이 실제로 어떻게 동작하는지 체득할 수 있습니다.
  • 💡 아키텍처 공유하기 – 마이크로서비스, 메시징, 혹은 .NET 분산 시스템을 배우는 사람에게 이 프로젝트를 알려 주세요. 구체적인 엔드‑투‑엔드 예제를 통해 개념을 이해하기가 훨씬 쉽습니다.
  • 🖥 실험하고 확장하기 – 프로젝트를 클론하고 직접 확장해 보세요. 새로운 이벤트를 추가하거나, 추가 분석 기능을 도입하거나, 클라이언트가 비동기 워크플로에 반응하는 방식을 조정해 볼 수 있습니다. 작은 변화를 시도하는 것이 이벤트‑드리븐 설계에 대한 이해를 깊게 하는 좋은 방법입니다.
  • 👍 저장소에 스타 달기 – 프로젝트가 유용했다면 저장소에 ⭐️를 눌러 주세요. 다른 사람도 프로젝트를 발견하기 쉬워지고, 실용적인 아키텍처 예제를 지속적으로 공유하는 데 도움이 됩니다.

이와 같은 프로젝트를 직접 다루면서 프레임워크를 넘어선 직관을 키우게 됩니다. 이는 복잡도가 증가해도 이해하기 쉬운 시스템을 설계하는 데 큰 도움이 됩니다.

Back to Blog

관련 글

더 보기 »

gRPC - Mock Server를 사용하는 이유

왜 Mock Server가 gRPC에 필요한가? gRPC는 컴팩트한 메시지, HTTP/2를 통한 효율적인 바이너리 전송, 그리고 다중 통신에 대한 일류 지원을 제공합니다.