Files
2nd/10_Wiki/Topics/Microservices Architecture.md
T

11 KiB

id, category, confidence_score, tags, last_reinforced
id category confidence_score tags last_reinforced
P-REINFORCE-WIKI-6D27573E Dev 0.95
microservices-architecture
monolithic-architecture
service-oriented-architecture-(soa)
domain-driven-design-(ddd)
saga-pattern
architecture-principles
2026-05-02

Microservices Architecture

📌 Brief Summary

마이크로서비스 아키텍처(MSA)는 크고 복잡한 애플리케이션을 독립적으로 배포 가능한 여러 개의 작은 서비스들의 집합으로 구축하는 소프트웨어 설계 접근 방식이다 [1-3]. 각 서비스는 자율적인 프로세스로 실행되며 가벼운 통신 메커니즘(주로 HTTP API, 이벤트 스트리밍 등)을 통해 상호작용한다 [1, 4, 5]. 이를 통해 조직은 특정 기능만 유연하게 확장하고, 비즈니스 요구에 맞춰 빠르고 빈번하게 소프트웨어를 배포할 수 있는 탄력적인 시스템을 구성할 수 있다 [6, 7].

📖 Core Content

  • 독립성과 자율성: 마이크로서비스는 특정 비즈니스 기능(도메인)을 중심으로 구성되며, 각 서비스는 다른 서비스에 의존하지 않고 독자적으로 개발, 테스트, 배포 및 확장될 수 있다 [3, 8-10]. 이러한 자율성 덕분에 팀별로 해당 서비스 특성에 가장 적합한 기술 스택과 프로그래밍 언어를 자유롭게 선택할 수 있다 [10-12].
  • 데이터 격리 (Exclusive State): 마이크로서비스 아키텍처의 핵심은 각 서비스가 자신만의 데이터베이스와 데이터 모델을 배타적으로 소유하는 '서비스당 데이터베이스(Database per Service)' 원칙을 따른다는 점이다 [13-16]. 다른 서비스는 이 데이터에 직접 접근할 수 없으며, 데이터 공유나 동기화가 필요한 경우 반드시 잘 정의된 API나 메시지 브로커를 통해서만 상호작용해야 한다 [14, 15].
  • 단일 책임 원칙 (Single Responsibility)과 도메인 분리: 각 서비스는 단일 비즈니스 책임에만 집중해야 하며, 시스템이 변경되어야 하는 이유가 오직 하나로 제한되어야 한다 [17]. 이를 구현하기 위해 도메인 주도 설계(DDD) 원칙을 활용하여 서비스의 도메인 경계를 명확히 식별하고 분리하는 작업이 수반된다 [16, 17].
  • 비동기 통신 및 위치 투명성: 분산된 서비스 간의 결합도를 낮추기 위해 즉각적인 응답을 기다리지 않는 비동기 메시지 전달 방식(예: RabbitMQ, Kafka 활용)이 권장된다 [18]. 또한, 서비스들은 특정 물리적 IP 주소가 아닌 논리적 식별자를 기반으로 통신하는 위치 투명성(Location Transparency)을 가져야 하며, 이를 위해 쿠버네티스나 서비스 메시(Service Mesh)와 같은 동적 서비스 디스커버리 기술이 활용된다 [19].

⚖️ Trade-offs & Caveats

  • 장점 (Pros): 트래픽이 몰리는 특정 서비스만 독립적으로 확장할 수 있어 자원 효율성과 확장성이 압도적으로 뛰어나다 [11, 20, 21]. 또한 한 서비스에서 메모리 누수나 장애가 발생하더라도 시스템 전체가 중단되지 않는 결함 격리(Fault Isolation)가 가능하며, CI/CD 자동화를 통해 기능 배포 속도를 크게 향상시킬 수 있다 [11, 14, 21].
  • 복잡성 증가 및 성능 오버헤드 (Cons): 분산 시스템 고유의 네트워크 지연(Latency)과 서비스 간 통신 오버헤드가 발생하며, 수십~수백 개의 서비스가 얽혀 있을 경우 분산 추적(Distributed Tracing) 도구 없이는 에러의 근본 원인을 파악하고 디버깅하기가 매우 어렵다 [22-25].
  • 데이터 일관성 유지의 어려움: 각 서비스가 독립된 데이터베이스를 가지기 때문에 시스템 전반에 걸친 강력한 ACID 트랜잭션 처리가 불가능해진다 [22, 26, 27]. 그 대신 Saga 패턴 등을 활용해 여러 서비스에 걸친 '최종 일관성(Eventual Consistency)'을 보장해야 하는데, 이는 개발과 테스트의 난이도를 급격히 높인다 [26-28].
  • 막대한 운영 오버헤드: 인프라 관리가 까다로워 쿠버네티스(Kubernetes), 도커(Docker), API 게이트웨이 등 복잡한 클라우드 네이티브 기술 스택과 고도화된 DevOps 전문 지식이 필수적으로 요구된다 [11, 16, 24, 29]. 서비스가 불필요하게 너무 작게 쪼개질 경우(Over-granularity), 인프라 중복과 통신 복잡성만 가중시킬 위험이 있다 [17, 30, 31].

🔗 Knowledge Connections

[비교 패러다임 / 아키텍처 설계]

  • Monolithic Architecture

    • 연결 이유: 마이크로서비스가 해결하려는 확장성과 배포 속도의 한계를 명확히 대조해서 보여주는 전통적인 아키텍처이다.
    • 이 개념을 통해 더 깊게 이해할 수 있는 부분: 모든 기능이 하나의 코드베이스로 묶여 있을 때 발생하는 강한 결합도와 확장성 문제, 그리고 마이크로서비스로 분리해야 하는 기술적 임계점과 그로 인한 마이그레이션 전략을 이해할 수 있다.
  • Service-Oriented Architecture (SOA)

    • 연결 이유: 마이크로서비스 이전 세대의 분산 설계 방식으로, 마이크로서비스의 진화 과정을 설명하는 개념이다.
    • 이 개념을 통해 더 깊게 이해할 수 있는 부분: 기존 SOA가 엔터프라이즈 서비스 버스(ESB)에 지나치게 의존하여 병목을 일으킨 반면, MSA가 '스마트 엔드포인트와 덤 파이프(Smart Endpoints and Dumb Pipes)' 원칙을 통해 어떻게 진정한 서비스 독립성을 확보했는지 파악할 수 있다.

[구현 원리 / 활용 도구]

  • Domain-Driven Design (DDD)

    • 연결 이유: 거대한 모놀리식 애플리케이션을 여러 개의 마이크로서비스로 나눌 때 기준이 되는 비즈니스 역량 모델링 방법론이다.
    • 이 개념을 통해 더 깊게 이해할 수 있는 부분: 마이크로서비스의 크기(Granularity)를 어떻게 결정할 것인가에 대한 기준과 단일 책임 원칙이 적용되는 구체적인 바운더리(Bounded Context) 설정 방법을 배울 수 있다.
  • Saga Pattern

    • 연결 이유: 각 서비스가 개별 데이터베이스를 가지는 구조에서 분산 트랜잭션을 처리하고 데이터의 '최종 일관성'을 보장하는 필수 구현 패턴이다.
    • 이 개념을 통해 더 깊게 이해할 수 있는 부분: 단일 ACID 트랜잭션이 불가능한 환경에서 이벤트 기반 메시징과 보상 트랜잭션(Compensating Transaction)을 통해 무결성을 유지하는 메커니즘을 이해할 수 있다.
  • API Gateway

    • 연결 이유: 클라이언트와 수많은 마이크로서비스 사이에서 단일 진입점 역할을 수행하며 라우팅과 보안을 담당하는 인프라 컴포넌트이다.
    • 이 개념을 통해 더 깊게 이해할 수 있는 부분: 분산된 수많은 서비스의 엔드포인트를 숨기고 복잡성을 클라이언트로부터 격리하여 시스템의 통신 흐름을 통제하는 방식을 학습할 수 있다.

Deeper Research Questions

  • 단일 모놀리식 애플리케이션을 마이크로서비스로 점진적으로 전환할 때, 위험을 최소화할 수 있는 마이그레이션 패턴(예: Strangler Fig Pattern)은 어떻게 적용되는가?
  • '서비스당 데이터베이스(Database per Service)' 구조에서 Saga 패턴 외에 분산 트랜잭션과 데이터의 최종 일관성(Eventual Consistency)을 효과적으로 관리할 수 있는 아키텍처적 대안은 무엇인가?
  • 마이크로서비스를 분할할 때 서비스의 적정 크기(Granularity)를 결정하는 객관적인 기준은 무엇이며, 너무 잘게 쪼개어 생기는 운영 복잡성(Over-engineering)을 피하는 방법은 무엇인가?
  • 마이크로서비스 간의 통신에서 동기식 통신(HTTP/REST)과 비동기식 메시지 전달(Event-Driven)은 성능 및 결함 격리 측면에서 어떤 트레이드오프를 가지며, 각각 어떤 시나리오에 적합한가?
  • 수백 개의 독립적인 마이크로서비스가 상호작용하는 환경에서, 트랜잭션의 흐름을 추적하고 디버깅하기 위한 분산 추적(Distributed Tracing) 및 관측성(Observability) 확보의 모범 사례는 무엇인가?

Practical Application Contexts

  • Implementation: 애플리케이션을 핵심 비즈니스 도메인 단위로 분할하여 별도의 코드베이스와 저장소를 생성한다. 이후 각 마이크로서비스가 고유한 데이터베이스를 유지하도록 구성하고, 서비스 간 통신은 REST API 또는 Kafka와 같은 이벤트 스트리밍 브로커를 활용하여 구현한다.
  • System Design: 소프트웨어 설계뿐만 아니라 조직 구조도 변경해야 한다. 각 마이크로서비스의 전체 생명주기(개발, 테스트, 배포, 운영)를 자율적인 소규모 팀(예: 투 피자 팀)이 온전히 소유할 수 있도록 콘웨이의 법칙(Conway's Law)에 부합하게 시스템과 팀 조직을 함께 설계한다.
  • Operation / Maintenance: 수십 개의 서비스를 수동으로 관리하는 것은 불가능하므로, 컨테이너(Docker)와 오케스트레이션 도구(Kubernetes)를 기반으로 배포 환경을 표준화해야 한다. 또한 서비스 디스커버리와 개별 CI/CD 파이프라인 자동화 등 고도화된 DevOps 실천이 유지보수의 필수 조건이 된다.
  • Learning Path: 우선 단일 코드베이스로 구성된 전통적인 모놀리식 아키텍처의 한계를 학습한 후, 도메인 주도 설계(DDD) 개념을 익혀 서비스 경계를 나누는 감각을 기른다. 이어서 분산 환경에서의 통신 패턴(API 통신, 비동기 메시징) 및 트랜잭션 관리 기법(Saga)을 연구하며 점진적으로 클라우드 네이티브 생태계로 학습을 확장한다.
  • My Project Relevance: 규모가 커져 유지보수 속도가 현저히 느려진 레거시 시스템을 개선하거나, 트래픽 변동폭이 극심한 대규모 애플리케이션을 새로 기획할 때 필수적으로 검토해야 하는 아키텍처 설계 지식이다. 프로젝트 팀의 DevOps 성숙도와 비용 예산을 종합하여 모놀리스를 유지할지, 마이크로서비스로 전환할지 결정하는 근거로 활용된다.

Adjacent Topics

  • Serverless Architecture
    • 확장 방향: 마이크로서비스에서 한 걸음 더 나아가 서버 인프라 관리 자체를 클라우드 제공자에게 완전히 위임하고 함수(Function) 단위로 실행하며 동적 확장을 극대화하는 클라우드 네이티브 아키텍처로 지식을 확장할 수 있다.
  • Modular Monolith
    • 확장 방향: 마이크로서비스가 초래하는 분산 통신 복잡성과 운영 오버헤드는 피하면서도, 도메인별 관심사의 분리라는 이점은 유지하는 타협적 대안 아키텍처로서 함께 비교 분석하기에 적합하다.

Last updated: 2026-05-02