MSAP.ai 블로그

MSAP.ai 블로그에서 최신 정보와 유용한 팁을 만나보세요. 다양한 콘텐츠와 전문 지식을 통해 더 나은 경험을 제공합니다.

MDA 에서 MSA로의 전환, 왜 의미 있을까요? (금융 서비스 관점)

MDA 는 빠르게 변화하는 금융 시장에 유연하게 대응하기 어렵습니다. 이 글은 이러한 한계를 짚고, MSA 전환이 가져오는 핵심 이점을 설명합니다.

2025년 05월 22일

MDA에서 MSA로 전환하는 것이 왜 의미가 있을까요? (금융 서비스 관점)

MDA 2 MSA: MDA to MSA Conversion: Financial Services

  • 민첩성 및 시장 대응 속도 향상: 금융 상품 및 서비스는 빠르게 변화합니다. MSA는 각 서비스를 독립적으로 개발, 배포, 확장할 수 있어 새로운 요구사항에 신속하게 대응할 수 있습니다.
  • 기술 다양성 및 최신 기술 도입 용이: 각 마이크로서비스는 특정 기능에 가장 적합한 기술 스택을 선택할 수 있습니다. 레거시 MDA 시스템이 특정 플랫폼이나 언어에 종속된 경우, MSA로 전환하며 최신 기술을 점진적으로 도입할 수 있습니다.
  • 확장성: 금융 거래량은 특정 시점(월말, 연말, 이벤트)에 급증할 수 있습니다. MSA는 필요한 서비스만 선택적으로 확장하여 비용 효율성을 높일 수 있습니다.
  • 장애 격리 및 시스템 안정성 향상: 특정 서비스의 장애가 전체 시스템에 미치는 영향을 최소화할 수 있습니다. 이는 24/7 가용성이 중요한 금융 서비스에 매우 중요합니다.
  • 팀의 자율성 및 생산성 증대: 서비스별로 독립적인 팀을 구성하여 개발 및 운영의 자율성을 높이고 책임감을 강화할 수 있습니다.

MDA에서 MSA로 전환하는 절차 및 변경 범위

MDA의 핵심 자산인 ‘PIM (Platform Independent Model)’은 MSA 전환 시 매우 유용한 출발점이 될 수 있습니다.

PIM은 비즈니스 로직, 데이터 모델, 프로세스 등을 플랫폼 독립적으로 기술하고 있기 때문입니다.

PIM의 가치: 왜 플랫폼 독립적 모델이 중요한가?

MDA의 핵심인 PIM은 특정 기술이나 플랫폼에 종속되지 않고 시스템의 본질적인 측면, 즉 “무엇을 하는가(What)”에 집중합니다. 이는 다음과 같은 정보들을 포함하며, MSA 전환 시 강력한 기반이 됩니다.

  • 비즈니스 로직: 시스템이 수행해야 하는 핵심적인 비셔니스 규칙과 계산 로직 (예: 이자 계산 규칙, 대출 승인 조건, 수수료 정책 등)
  • 데이터 모델: 비즈니스에 필요한 정보의 구조와 관계 (예: 고객 정보, 계좌 정보, 상품 정보, 거래 내역 등). UML 클래스 다이어그램 등으로 표현될 수 있습니다.
  • 프로세스 및 워크플로우: 비즈니스 목표를 달성하기 위한 작업의 순서와 흐름 (예: 대출 신청 처리 프로세스, 계좌 개설 프로세스). UML 액티비티 다이어그램, 시퀀스 다이어그램 등으로 표현될 수 있습니다.
  • 유스케이스: 사용자와 시스템 간의 상호작용, 또는 시스템이 제공해야 하는 기능적 요구사항 (예: “고객은 계좌 이체를 할 수 있다”, “은행원은 대출 신청을 승인/거절할 수 있다”).

이러한 PIM의 정보는 특정 프로그래밍 언어, 프레임워크, 데이터베이스 기술에 얽매이지 않기 때문에, 아키텍처를 MSA로 변경하더라도 비즈니스의 본질은 유지하면서 새로운 기술 스택으로 서비스를 재구성하는 데 매우 유용합니다. PIM은 MSA의 각 서비스가 어떤 책임을 가져야 하는지, 어떤 데이터를 소유해야 하는지, 어떤 인터페이스를 제공해야 하는지를 정의하는 데 중요한 출발점이 됩니다.

1. 분석 및 설계 단계 (가장 중요!)

이 단계는 전환의 성패를 좌우하며, PIM의 자산을 최대한 활용하는 것이 핵심입니다.

1-1. 기존 MDA 시스템 분석

PIM 검토 (PIM Review) – 심층 분석

  • 대상 아티팩트

MDA 프로젝트에서 생성된 PIM 관련 산출물을 모두 검토합니다. 이는 주로 UML(Unified Modeling Language) 다이어그램 형태일 가능성이 높습니다.

    • 클래스 다이어그램: 시스템의 핵심 엔티티(예: 고객, 계좌, 상품, 거래)와 그들 간의 관계(연관, 집합, 상속 등), 속성, 주요 오퍼레이션을 식별합니다. 이는 각 마이크로서비스가 소유할 데이터 모델의 기초가 됩니다.
    • 유스케이스 다이어그램 및 명세: 시스템의 주요 기능과 액터(사용자 또는 외부 시스템)를 파악합니다. 각 유스케이스는 잠재적인 마이크로서비스의 기능 단위가 될 수 있습니다. 유스케이스 명세에는 사전/사후 조건, 기본 흐름, 예외 흐름 등이 기술되어 있어 서비스의 세부 로직을 이해하는 데 도움이 됩니다.
    • 액티비티 다이어그램 / 시퀀스 다이어그램: 특정 비즈니스 프로세스나 유스케이스의 상세 흐름을 보여줍니다. 이를 통해 서비스 간의 상호작용, 데이터 흐름, 필요한 오퍼레이션 순서 등을 파악할 수 있습니다.
    • 상태 머신 다이어그램: 특정 엔티티(예: 대출 신청 건, 계좌 상태)의 생명주기와 상태 변화를 모델링합니다. 이는 해당 엔티티를 관리하는 서비스의 상태 관리 로직 설계에 중요합니다.
    • 비즈니스 규칙 (Business Rules): PIM 내에 명시적으로 정의된 규칙(예: OCL – Object Constraint Language로 기술된 제약조건)이나, 모델 주석, 관련 문서 등에 기술된 규칙들을 식별합니다. (예: “VIP 고객은 이체 수수료가 면제된다”, “미성년자는 특정 금융 상품에 가입할 수 없다”). 이 규칙들이 어떤 엔티티나 프로세스와 연관되는지 파악하는 것이 중요합니다.
  • 목표

PIM을 통해 시스템의 핵심 도메인(예: 고객 관리, 계좌 관리, 여신, 수신, 외환, 투자 등 금융 서비스의 주요 영역), 각 도메인 내의 주요 엔티티, 엔티티 간의 관계, 주요 비즈니스 프로세스 및 규칙을 명확히 이해합니다. 이는 MSA 전환 시 어떤 기준으로 서비스를 분리할지 결정하는 데 중요한 입력이 됩니다.

  • 산출물 (예상)

도메인 목록, 주요 엔티티 목록, 유스케이스 목록, 비즈니스 규칙 목록, 주요 프로세스 흐름도.

PSM (Platform Specific Model) 및 생성된 코드 분석 – 현실 파악

  • PIM과의 갭 분석

PIM은 이상적인 모델이지만, 실제 PSM 및 코드는 개발 과정에서의 제약, 성능 최적화, 특정 플랫폼의 한계 등으로 인해 PIM과 차이가 있을 수 있습니다. 이 갭을 파악하는 것이 중요합니다.

  • 모놀리식 구조 확인
    • 코드 의존성 분석: 정적 코드 분석 도구나 IDE 기능을 활용하여 모듈, 클래스, 함수 간의 호출 관계 및 의존성을 시각화하고 분석합니다. 과도하게 결합된(tightly coupled) 부분을 식별합니다.
    • 데이터베이스 스키마 분석: 단일 데이터베이스에 모든 테이블이 집중되어 있는지, 테이블 간 복잡한 JOIN이 많은지, 특정 비즈니스 도메인과 무관한 데이터들이 혼재되어 있는지 등을 확인합니다. 이는 데이터 분리의 어려움을 예측하게 합니다.
    • 공유 라이브러리 및 유틸리티: 여러 모듈에서 공통으로 사용하는 라이브러리나 유틸리티 클래스들이 어떻게 구성되어 있는지 파악합니다. 이들이 특정 도메인 로직과 강하게 결합되어 있다면 분리가 어려울 수 있습니다.
  • 기술 부채 식별

현재 시스템의 기술적 문제점(예: 오래된 프레임워크 사용, 테스트 커버리지 부족, 복잡한 레거시 코드)을 파악하여 MSA 전환 시 함께 해결할지, 아니면 점진적으로 개선할지 결정합니다.

  • 목표

현재 시스템의 실제 구현 상태, 모듈 간 결합도, 데이터베이스 구조의 복잡성, 잠재적인 분리 지점 및 난이도를 파악합니다. PIM에서 식별된 논리적 경계가 실제 코드에서는 어떻게 얽혀 있는지 이해합니다.

  • 산출물 (예상)

시스템 아키텍처 다이어그램(as-is), 주요 모듈 의존성 맵, 데이터베이스 ERD(as-is), 기술 부채 목록.

1-2. 마이크로서비스 식별 및 경계 정의

PIM에서 식별된 비즈니스 도메인과 기능을 기반으로, MSA의 핵심인 서비스 경계를 정의합니다.

도메인 주도 설계 (DDD – Domain-Driven Design) 활용 – 전략적 설계

  • PIM의 비즈니스 도메인 매핑

PIM에서 식별된 주요 비즈니스 도메인(예: 고객, 계좌, 여신, 상품)을 DDD의 Bounded Context 개념으로 매핑합니다. Bounded Context는 특정 도메인 모델이 일관성을 가지는 명확한 경계를 의미하며, 각 Bounded Context는 하나의 마이크로서비스 후보가 될 가능성이 높습니다.

  • Ubiquitous Language (보편 언어) 정의

각 Bounded Context 내에서 사용되는 용어와 개념을 명확히 정의합니다. PIM에 정의된 용어가 있다면 이를 적극 활용하고, 필요하다면 현업 담당자와의 논의를 통해 정제합니다. 예를 들어, ‘고객’이라는 용어도 ‘고객 정보 컨텍스트’와 ‘여신 심사 컨텍스트’에서는 의미나 중요 속성이 다를 수 있습니다.

  • Context Map 작성

식별된 Bounded Context들 간의 관계를 시각화합니다. (예: Customer-Supplier 관계, Shared Kernel, Anti-Corruption Layer 등). 이는 서비스 간의 협력 방식을 설계하는 데 도움이 됩니다.

  • 금융 서비스 예시 상세화
    • 고객 정보 서비스 (Customer Information Service): 고객의 기본 정보(이름, 연락처, 주소), KYC 정보, 고객 등급 등을 관리. PIM의 ‘고객’ 엔티티와 관련 유스케이스(고객 정보 조회/등록/수정)를 기반으로 함.
    • 계좌 관리 서비스 (Account Management Service): 계좌 개설/해지, 잔액 조회, 거래 내역 조회, 입출금 기본 로직. PIM의 ‘계좌’, ‘거래’ 엔티티와 관련 유스케이스를 기반으로 함.
    • 여신 심사 서비스 (Loan Origination/Underwriting Service): 대출 신청 접수, 신용 평가, 심사, 승인/거절 로직. PIM의 ‘대출 신청’, ‘신용 정보’, ‘심사 규칙’ 등과 관련.
    • 대출 실행 서비스 (Loan Servicing Service): 대출 계약 실행, 원리금 상환 처리, 연체 관리.
    • 이자 계산 서비스 (Interest Calculation Service): 예금/대출 상품별 이자 계산 로직. PIM의 ‘상품 조건’, ‘이자율 정책’과 연관.
    • 결제/송금 서비스 (Payment/Transfer Service): 자금 이체 처리, 외부 결제 시스템 연동.
  • 핵심 도메인(Core Domain) vs. 지원 도메인(Supporting Domain) vs. 일반 도메인(Generic Domain) 식별

DDD의 이 구분은 리소스 투입 우선순위를 정하고, 어떤 부분을 직접 개발하고 어떤 부분을 외부 솔루션으로 대체할지 결정하는 데 도움이 됩니다.

단일 책임 원칙 (SRP – Single Responsibility Principle) 적용

  • 각 마이크로서비스는 하나의 명확하고 응집력 있는 책임을 가져야 합니다. 즉, 서비스가 변경되어야 하는 이유는 단 하나여야 합니다.
  • 예를 들어, ‘고객 정보 서비스’는 고객 정보 관리에만 집중하고, 고객에게 알림을 보내는 기능(SMS, 이메일)은 별도의 ‘알림 서비스’로 분리하는 것을 고려할 수 있습니다. 이는 PIM의 유스케이스나 기능 요구사항을 더 세분화하여 SRP를 만족하는지 검토하는 과정입니다.
  • 만약 하나의 서비스가 너무 많은 책임을 지게 되면, 해당 서비스는 다시 작은 모놀리식이 되어 MSA의 장점을 잃게 됩니다.

비즈니스 기능 단위 (Business Capability) 기반 분리

  • 조직이 가치를 창출하기 위해 수행하는 고유한 비즈니스 기능을 하나의 서비스 단위로 고려합니다. 이는 조직 구조나 팀 구성과도 연관될 수 있습니다.
  • 예를 들어, “온라인 대출 신청 처리”라는 비즈니스 기능은 그 자체로 하나의 마이크로서비스 후보가 될 수 있으며, 이 기능은 독립적으로 개선되고 배포될 수 있습니다. PIM의 주요 프로세스나 유스케이스가 이러한 비즈니스 기능 단위에 해당할 수 있습니다.
  • 이 관점은 서비스가 비즈니스 가치와 직접적으로 연결되도록 합니다.

데이터 분리 (Database per Service 패턴 적용)

  • 각 마이크로서비스는 자신만의 데이터베이스를 소유하고, 다른 서비스는 오직 해당 서비스의 API를 통해서만 데이터에 접근해야 합니다.
  • PIM의 데이터 모델(클래스 다이어그램)을 참고하여, 각 식별된 마이크로서비스가 어떤 엔티티(테이블)의 소유권을 가져야 할지 결정합니다.
  • 이는 서비스 간의 결합도를 낮추고, 각 서비스가 독립적으로 데이터베이스 스키마를 변경하거나 다른 종류의 데이터베이스 기술을 선택할 수 있게 합니다. (예: 고객 정보 서비스는 RDBMS, 상품 추천 서비스는 NoSQL 사용)
  • 중요 고려사항: 데이터 중복 발생 가능성(예: 고객 ID는 여러 서비스에서 필요) 및 데이터 일관성 유지 방안이 함께 고민되어야 합니다.

1-3. API 설계

식별된 각 마이크로서비스가 외부에 제공할 인터페이스를 명확히 정의합니다.

API 계약 (API Contract) 우선 설계

  • PIM의 유스케이스, 엔티티의 오퍼레이션, 시퀀스 다이어그램 등을 참고하여 각 서비스가 제공해야 할 API 엔드포인트, 요청/응답 메시지 형식(JSON, XML 등), 데이터 타입, HTTP 메소드(GET, POST, PUT, DELETE 등), 상태 코드 등을 상세하게 정의합니다.
  • OpenAPI Specification (구 Swagger)이나 gRPC의 Protocol Buffers 와 같은 표준화된 명세 도구를 사용하여 API 계약을 문서화합니다. 이는 서비스 개발팀 간의 명확한 의사소통을 돕고, 클라이언트 개발 및 테스트를 용이하게 합니다.
  • 금융 서비스 고려사항: 민감 정보 처리 API의 경우, 요청/응답 페이로드 암호화, 필드 레벨 보안 등을 고려해야 합니다.

API 스타일 선택

  • RESTful API: HTTP 기반으로 자원(Resource)을 정의하고, HTTP 메소드를 통해 해당 자원에 대한 CRUD(Create, Read, Update, Delete) 연산을 수행하는 방식. 범용적이고 이해하기 쉬워 널리 사용됩니다.
  • gRPC: Protocol Buffers를 사용하여 메시지를 직렬화하고, HTTP/2 기반으로 통신하는 고성능 RPC 프레임워크. 서비스 간 내부 통신이나 성능이 중요한 경우 적합합니다.
  • 이벤트 기반 (비동기 API): 특정 이벤트 발생 시 메시지 큐를 통해 비동기적으로 알리는 방식. 서비스 간 결합도를 더욱 낮추고 응답성을 향상시킬 수 있습니다.

API 버전 관리 전략

향후 API 변경에 대비하여 URI 경로 기반, 헤더 기반 등의 버전 관리 전략을 수립합니다.

API 소비자 관점 고려

API를 사용하는 클라이언트(다른 마이크로서비스, 프론트엔드 애플리케이션 등) 입장에서 사용하기 쉽고 이해하기 쉬운 API를 설계해야 합니다.

1-4. 데이터 관리 전략 수립

서비스별로 데이터가 분산됨에 따라 발생하는 데이터 관리의 복잡성을 해결하기 위한 전략입니다.

데이터 분산 및 일관성 유지

  • 최종 일관성 (Eventual Consistency): 대부분의 MSA 환경에서는 분산 시스템의 특성상 강한 일관성(Strong Consistency)보다는 최종 일관성을 채택하는 경우가 많습니다. 즉, 데이터 변경 후 일정 시간이 지나면 모든 서비스에서 데이터가 일관된 상태를 보이게 됩니다.
  • PIM의 데이터 모델과 비즈니스 규칙을 분석하여, 어떤 데이터가 강한 일관성을 요구하고(예: 계좌 잔액), 어떤 데이터가 최종 일관성을 허용할 수 있는지(예: 상품 추천 목록) 판단해야 합니다.

분산 트랜잭션 처리 – 금융 서비스의 핵심 과제

  • Saga 패턴

여러 서비스에 걸친 비즈니스 트랜잭션을 일련의 로컬 트랜잭션들로 나누어 처리하고, 각 로컬 트랜잭션 실패 시 보상 트랜잭션(Compensating Transaction)을 통해 이전 상태로 되돌리거나 일관성을 맞추는 패턴입니다.

    • Choreography-based Saga: 각 서비스가 이벤트를 발행하고 다른 서비스가 해당 이벤트를 구독하여 다음 로컬 트랜잭션을 수행하는 방식. 중앙 오케스트레이터가 없어 유연하지만, 전체 흐름 파악이 어려울 수 있습니다.
    • Orchestration-based Saga: 중앙의 오케스트레이터 서비스가 전체 트랜잭션의 흐름을 관리하고 각 서비스에 명령을 내리는 방식. 흐름 관리가 용이하지만, 오케스트레이터에 대한 의존성이 생깁니다.
  • 금융 서비스 예시 (계좌 이체)
    • 출금 서비스: A 계좌에서 출금 (로컬 트랜잭션 1)
    • (성공 시) 출금 완료 이벤트 발행
    • 입금 서비스: B 계좌에 입금 (로컬 트랜잭션 2 – 이벤트 구독 또는 오케스트레이터 명령)
    • (입금 실패 시) 출금 서비스에 출금 취소 요청 (보상 트랜잭션)
  • 2PC (Two-Phase Commit)

전통적인 분산 트랜잭션 프로토콜이지만, 모든 참여 서비스가 동기적으로 응답해야 하므로 가용성과 성능에 부정적인 영향을 미칠 수 있어 MSA에서는 지양되는 경향이 있습니다. 단, 매우 강력한 일관성이 요구되는 극히 제한적인 경우에 고려될 수 있습니다.

데이터 동기화 및 복제

  • 이벤트 기반 아키텍처 (EDA – Event-Driven Architecture): 한 서비스에서 데이터 변경(이벤트 발생)이 일어나면, 해당 이벤트를 메시지 큐(예: Apache Kafka, RabbitMQ)에 발행하고, 이 데이터가 필요한 다른 서비스들이 이벤트를 구독하여 자신의 로컬 데이터 저장소를 업데이트하는 방식입니다.
  • CQRS (Command Query Responsibility Segregation) 패턴 고려: 명령(데이터 변경) 모델과 조회 모델을 분리하여, 조회 성능을 최적화하거나 다양한 조회 요구사항에 대응할 수 있습니다. 이벤트 소싱(Event Sourcing)과 함께 사용되기도 합니다.
  • 데이터 복제 시 주의점: 데이터 중복으로 인한 저장 공간 증가, 동기화 지연으로 인한 일시적 불일치 가능성을 고려해야 합니다.

1-5. 공통 관심사 (Cross-Cutting Concerns) 처리 방안 수립

여러 마이크로서비스에 공통적으로 필요한 기능들을 어떻게 효율적으로 처리할지 결정합니다.

API 게이트웨이 (API Gateway)

  • 역할: 클라이언트 요청의 단일 진입점(Single Entry Point) 역할. 라우팅, 인증/인가, 로깅, 모니터링, 요청 변환, 캐싱, 로드 밸런싱, API 조합 등의 기능을 수행합니다.
  • 구현 방식: Netflix Zuul, Spring Cloud Gateway, Apigee, Kong 등 다양한 솔루션 활용.
  • PIM의 유스케이스 중 외부 시스템 연동이나 사용자 인터페이스 관련 부분을 참고하여 게이트웨이의 필요성과 역할을 정의할 수 있습니다.

서비스 디스커버리 (Service Discovery)

  • 역할: 동적으로 변하는 마이크로서비스들의 네트워크 위치(IP 주소, 포트)를 등록하고 조회할 수 있게 하는 메커니즘. (예: Netflix Eureka, Consul, Kubernetes 내장 기능)

설정 관리 (Configuration Management)

  • 역할: 각 서비스의 환경별 설정(DB 접속 정보, 외부 API 키, 기능 플래그 등)을 중앙에서 관리하고 동적으로 변경할 수 있도록 지원. (예: Spring Cloud Config, HashiCorp Consul, Vault)

인증 및 인가 (Authentication & Authorization)

  • 역할: 사용자 및 서비스 간 호출에 대한 신원 확인 및 권한 부여.
  • 구현 방식: OAuth 2.0, OpenID Connect (OIDC) 표준 프로토콜 활용, JWT (JSON Web Token) 기반 토큰 인증. 중앙 Identity Provider (IdP) 구축 고려.
  • PIM의 액터와 유스케이스별 접근 권한 요구사항을 참고하여 보안 정책을 수립합니다.

로깅 및 모니터링

  • 로깅: 분산된 서비스들의 로그를 중앙 집중식으로 수집, 검색, 분석할 수 있는 시스템 구축 (예: ELK Stack – Elasticsearch, Logstash, Kibana 또는 EFK Stack – Elasticsearch, Fluentd, Kibana). Correlation ID를 사용하여 요청 흐름 추적.
  • 모니터링: 서비스의 상태, 성능 지표(응답 시간, 에러율, 처리량), 리소스 사용량 등을 실시간으로 모니터링하고 시각화 (예: Prometheus, Grafana).
  • 분산 추적 (Distributed Tracing): 여러 서비스에 걸친 요청의 전체 경로와 각 단계별 소요 시간을 추적하여 병목 지점 및 장애 원인 분석 (예: Jaeger, Zipkin).

결정 사항

이러한 공통 기능들을 각 서비스에 라이브러리 형태로 내장할지(분산화), 별도의 중앙 집중형 서비스(예: API 게이트웨이, 인증 서버)를 구축할지, 또는 플랫폼(예: Kubernetes)에서 제공하는 기능을 활용할지 등을 결정합니다. 이는 개발 효율성, 운영 복잡성, 서비스 간 결합도 등을 고려하여 선택합니다.

결론

이처럼 분석 및 설계 단계는 PIM이라는 강력한 자산을 기반으로 하되, 실제 시스템의 현실과 MSA의 원칙들을 종합적으로 고려하여 신중하게 진행되어야 합니다. 이 단계에서의 결정들이 이후 개발, 테스트, 배포, 운영 전반에 큰 영향을 미치게 됩니다. 금융 서비스의 특성상 데이터 정합성과 보안에 대한 고려는 모든 단계에서 최우선 순위가 되어야 합니다.

2. 점진적 전환 단계: 스트랭글러 피그 패턴(Strangler Fig Pattern)을 활용한 안전한 MSA 전환

기존 시스템을 한 번에 새로운 마이크로서비스 아키텍처(MSA)로 전환하는 ‘빅뱅’ 방식은 예측 불가능한 문제 발생 시 대처가 어렵고, 전체 시스템 장애로 이어질 수 있는 매우 높은 위험을 수반합니다. 따라서, 기존 모놀리식 시스템(MDA 기반)을 안정적으로 운영하면서, 새로운 기능을 점진적으로 MSA로 개발하고 기존 기능을 점차 대체해 나가는 ‘스트랭글러 피그 패턴’을 적용하는 것이 바람직합니다. 이 패턴은 “마치 오래되고 좁은 국도 옆에 새롭고 넓은 고속도로를 건설하는 것과 같습니다. 처음에는 국도와 고속도로를 함께 사용하다가, 고속도로가 점점 더 많은 구간에서 개통되고 안정화되면 사람들은 자연스럽게 빠르고 편한 고속도로를 이용하게 됩니다. 결국에는 낡은 국도는 거의 사용되지 않거나 다른 용도로 바뀌게 되는 것처럼, 새로운 시스템이 점차 기존 시스템의 역할을 대체해 나가는 방식입니다.” 이 전략의 핵심은 새로운 시스템이 기존 시스템의 기능을 하나씩 ‘가로채어’ 대체해 나가면서, 최종적으로는 기존 시스템의 역할이 거의 없어지도록 만드는 것입니다. 각 단계는 신중한 계획과 철저한 검증을 통해 진행되어야 합니다.

2-1. 파일럿 프로젝트 선정 및 개발: MSA 전환 여정의 의미 있는 첫걸음

본격적인 마이크로서비스 아키텍처(MSA)로의 대규모 전환 작업에 착수하기 전에, 작지만 의미 있는 파일럿 프로젝트를 선정하여 개발하고 운영해보는 것은 매우 중요합니다. 이는 마치 큰 항해를 떠나기 전, 작은 보트를 타고 연안을 탐사하며 물길을 익히고 장비를 점검하는 것과 같습니다. 파일럿 프로젝트는 MSA 도입에 따른 기술적 불확실성을 해소하고, 실제 운영 경험을 통해 귀중한 교훈을 얻으며, 전체 전환 과정의 리스크를 최소화하는 데 핵심적인 역할을 합니다.

파일럿 프로젝트 선정 기준: 신중하고 전략적인 선택

성공적인 파일럿 프로젝트는 MSA 전환의 초석이 되므로, 다음 기준들을 종합적으로 고려하여 신중하게 대상을 선정해야 합니다.

1. 상대적 독립성 (High Cohesion, Low Coupling)

  • 의미: 파일럿으로 선정될 기능은 기존 모놀리식 시스템 내 다른 기능들과의 의존성이 가능한 한 낮아야 합니다. 즉, 해당 기능을 분리했을 때 다른 부분에 미치는 영향이 적고, 반대로 다른 기능의 변경으로부터도 비교적 자유로워야 합니다. 데이터 의존성, API 호출 관계 등을 면밀히 분석하여 독립성을 판단합니다.
  • 중요성: 독립성이 높을수록 파일럿 프로젝트의 개발 범위가 명확해지고, 분리 작업이 용이하며, 예상치 못한 연쇄 장애 발생 가능성을 줄일 수 있습니다. 이는 팀이 MSA 개발에 집중하고 초기 성공 경험을 쌓는 데 유리합니다.
  • 고려사항: “이 기능을 별도의 작은 회사(서비스)로 분리한다면, 다른 회사(기존 시스템의 다른 기능)와 최소한의 정보만 주고받으며 독립적으로 운영될 수 있는가?”를 자문해볼 수 있습니다.

2. 낮은 비즈니스 위험도 (Low Business Criticality)

  • 의미: 파일럿 프로젝트는 MSA라는 새로운 아키텍처와 기술을 시험하는 단계이므로, 실패했을 경우에도 전체 비즈니스에 치명적인 영향을 미치지 않는 기능이어야 합니다. 핵심 수익 창출 기능이나 고객에게 직접적인 큰 불편을 초래할 수 있는 기능은 초기 파일럿 대상으로는 부적합합니다.
  • 중요성: 실험적인 성격이 강한 파일럿 단계에서는 예기치 않은 문제나 시행착오가 발생할 수 있습니다. 위험도가 낮은 기능을 선택함으로써, 실패로부터 배우고 개선할 수 있는 안전한 환경을 확보하고, 조직 내 불안감을 최소화하며 MSA에 대한 점진적인 신뢰를 구축할 수 있습니다.
  • 고려사항: “만약 이 파일럿 서비스가 일시적으로 중단되거나 오류가 발생했을 때, 우리 비즈니스의 연속성이 심각하게 위협받는가? 수동으로 대체 처리하거나 고객에게 안내할 수 있는 수준인가?”를 판단해야 합니다.

3. 명확한 비즈니스 가치 및 측정 가능성 (Clear Business Value & Measurability)

  • 의미: 파일럿 프로젝트가 성공했을 때, MSA 도입의 효용성을 구체적으로 입증하고 조직 내 공감대를 형성할 수 있는 기능을 선택하는 것이 좋습니다. 이는 기술적 성공뿐만 아니라, 비즈니스 관점에서의 실질적인 개선 효과(예: 성능 향상, 배포 시간 단축, 특정 문제 해결 등)를 보여줄 수 있어야 합니다.
  • 중요성: 파일럿의 성공은 향후 MSA 전환 확대에 대한 투자와 지원을 이끌어내는 중요한 근거가 됩니다. 측정 가능한 목표(KPI)를 설정하고, 파일럿 전후의 변화를 비교하여 MSA의 이점을 명확히 보여주면, 경영진과 관련 부서의 이해와 지지를 얻는 데 효과적입니다.
  • 고려사항: “이 기능을 MSA로 전환했을 때 어떤 구체적인 개선(예: 응답속도 X% 향상, 특정 오류 Y% 감소, 신규 기능 추가 시간 Z일 단축 등)을 기대할 수 있으며, 이를 어떻게 측정할 것인가?”를 정의해야 합니다.

파일럿 프로젝트의 목표: 학습, 검증, 그리고 역량 강화

파일럿 프로젝트는 단순히 기능을 이전하는 것을 넘어, 다음과 같은 구체적인 목표를 달성하기 위해 수행됩니다.

1. 선택한 MSA 기술 스택의 적합성 검증

  • 내용: MSA 구현을 위해 선정한 프로그래밍 언어, 프레임워크, 데이터베이스, 메시징 큐, 컨테이너 기술(예: Docker, Kubernetes) 등이 실제 환경에서 예상대로 작동하는지, 성능 및 안정성 요구사항을 만족하는지 등을 실질적으로 검증합니다. 또한, 개발 생산성, 학습 용이성, 커뮤니티 지원 등도 평가 요소가 될 수 있습니다.
  • 결과물: 특정 기술 조합에 대한 운영 경험, 성능 벤치마크 결과, 기술적 이슈 및 해결 방안, 향후 기술 선택을 위한 가이드라인 등을 확보합니다.

2. MSA 개발 및 운영 프로세스 경험 확보

  • 내용: 단일 마이크로서비스에 대한 독립적인 CI/CD(지속적 통합/지속적 배포) 파이프라인 구축, 분산 환경에서의 로깅 및 모니터링 시스템(예: ELK Stack, Prometheus, Grafana) 구축 및 활용, 서비스 디스커버리, API 게이트웨이 연동 등 MSA 운영에 필요한 핵심 프로세스들을 실제로 경험하고 정립합니다.
  • 결과물: MSA 개발 라이프사이클에 대한 이해 증진, 자동화된 배포 파이프라인 템플릿, 모니터링 대시보드 구성 경험, 장애 대응 절차 초안 등을 마련합니다.

3. 팀의 MSA 역량 강화 및 학습 곡선 관리:

  • 내용: 파일럿 프로젝트를 통해 개발팀, 운영팀이 새로운 기술과 아키텍처에 대한 실질적인 경험을 쌓고, MSA 환경에서의 설계, 개발, 테스트, 배포, 운영 노하우를 습득하도록 합니다. 이 과정에서 발생할 수 있는 기술적 어려움이나 지식 격차를 조기에 파악하고, 교육이나 스터디 등을 통해 팀 전체의 학습 곡선을 완만하게 관리합니다.
  • 결과물: MSA 프로젝트 수행 경험을 갖춘 핵심 인력 양성, 내부 기술 문서 및 가이드라인 축적, 팀원 간 지식 공유 활성화, 향후 MSA 프로젝트 진행 시 발생할 수 있는 시행착오 감소.

파일럿 프로젝트 예시: 구체적인 적용 사례

위의 선정 기준과 목표를 고려했을 때, 다음과 같은 기능들이 파일럿 프로젝트의 좋은 후보가 될 수 있습니다.

고객 알림 서비스 (SMS, 이메일, 푸시 알림 발송)

  • 선정 이유
    • 독립성: 알림 발송 로직은 다른 핵심 비즈니스 로직(예: 주문 처리, 결제)과 비교적 느슨하게 결합되어 있는 경우가 많습니다. 외부 게이트웨이(SMS 발송 업체, 이메일 서버 등)와의 연동이 주를 이루므로 내부 시스템 의존성이 낮습니다.
    • 위험도: 일시적인 알림 지연이나 실패가 발생하더라도, 핵심 서비스의 중단으로 이어질 가능성은 낮습니다. (물론 중요한 알림의 경우 대체 수단이나 재시도 로직이 필요합니다.)
  • 가치: 안정적이고 신속한 알림은 고객 경험 향상에 기여하며, MSA로 전환 시 독립적인 확장 및 관리가 용이해질 수 있습니다.
    학습 포인트: 비동기 처리, 외부 API 연동, 메시지 큐 활용, 독립적인 배포 및 모니터링 등을 경험할 수 있습니다.

단순 조회성 API (Read-Heavy, Low-Volatility Data)

  • 예시: 상품 카테고리 목록 조회, 공지사항 목록 조회, FAQ 조회, 지역 코드 조회 등.
  • 선정 이유
    • 독립성: 데이터 변경이 거의 없거나 특정 관리 도구를 통해서만 이루어지므로, 다른 트랜잭션 기능과의 복잡한 데이터 동기화 문제에서 비교적 자유롭습니다.
    • 위험도: 주로 정보를 제공하는 기능이므로, 일시적인 장애가 발생하더라도 데이터 손실 위험이 적고, 캐싱 전략 등으로 영향을 최소화할 수 있습니다.
  • 가치: 특정 조회 기능의 성능 개선이나 안정성 확보를 목표로 할 수 있으며, MSA로 분리 시 해당 API의 독립적인 스케일 아웃이 가능해집니다.
  • 학습 포인트: API 설계, 데이터 모델링, 캐싱 전략, 독립적인 데이터베이스 운영(필요시), API 게이트웨이 연동 등을 연습하기에 적합합니다.

결론적으로, 파일럿 프로젝트는 MSA로의 성공적인 전환을 위한 디딤돌입니다. 신중한 대상 선정, 명확한 목표 설정, 그리고 과정에서의 학습과 개선을 통해 팀의 자신감을 높이고 기술적 기반을 다질 수 있습니다. 작은 성공 경험들이 모여 거대한 변화를 이끌어낼 것입니다.

2-2. API 게이트웨이 도입: MSA로 향하는 단일 관문 구축

API 게이트웨이는 클라이언트의 모든 요청을 받는 단일 진입점(Single Point of Entry) 역할을 수행합니다. 이는 MSA 전환 과정에서 핵심적인 구성 요소입니다.

주요 역할

  • 라우팅: 클라이언트 요청을 분석하여 해당 요청을 처리할 적절한 마이크로서비스 또는 아직 전환되지 않은 기존 모놀리식 시스템의 특정 기능으로 전달합니다.
  • 인증 및 권한 부여: 공통적인 인증/인가 처리를 중앙에서 관리하여 각 마이크로서비스의 부담을 줄입니다.
  • 요청/응답 변환: 필요시 클라이언트와 서비스 간의 데이터 형식 변환을 수행합니다.
  • 로깅 및 모니터링: 모든 트래픽에 대한 통합적인 로깅 및 모니터링 지표 수집이 가능합니다.
  • 로드 밸런싱, 캐싱, API 제한 (Rate Limiting): 서비스 안정성 및 성능 향상을 위한 부가 기능 제공.

점진적 전환 지원

처음에는 모든 트래픽을 기존 모놀리식 시스템으로 보내다가, 새로운 마이크로서비스가 개발될 때마다 해당 서비스로의 라우팅 규칙을 추가하여 점진적으로 트래픽을 전환합니다. 클라이언트는 이러한 내부 변화를 인지할 필요 없이 일관된 엔드포인트를 통해 서비스를 이용할 수 있습니다.

2-3. 기능 분리 및 마이그레이션: 모놀리식 해체와 MSA 구축

기존 MDA 시스템의 PIM(Platform Independent Model)에서 식별된 논리적 모듈 또는 비즈니스 기능 단위를 기준으로, 하나씩 새로운 마이크로서비스로 개발하고 이전합니다.

프로세스

  • 대상 기능 식별: MDA PIM 분석을 통해 다음 마이그레이션 대상이 될 논리적 모듈/기능을 선정합니다. 이때, 비즈니스 중요도, 독립성, 개발 용이성 등을 고려합니다.
  • 마이크로서비스 구현: 선정된 기능을 새로운 마이크로서비스로 설계하고 개발합니다. 이 과정에서 MSA 원칙(단일 책임, 독립적 배포 등)을 준수합니다.
  • 트래픽 전환: 개발 및 테스트가 완료된 마이크로서비스로 API 게이트웨이를 통해 실제 트래픽을 점진적으로 전환합니다. (예: Canary 배포, Blue/Green 배포 활용)
  • 기존 기능 제거 (Strangling): 새로운 마이크로서비스가 안정적으로 운영되는 것이 확인되면, 기존 모놀리식 시스템 내의 해당 기능을 비활성화하거나 제거합니다.

데이터 마이그레이션 전략

  • 데이터 소유권 정의: 새로운 마이크로서비스가 독립적으로 소유하고 관리할 데이터의 범위를 명확히 정의합니다.
  • 점진적 데이터 이전
    • 초기 동기화: 기존 시스템의 관련 데이터를 새 서비스의 데이터베이스로 일괄 이전합니다.
    • 변경 데이터 동기화: 초기 동기화 이후 발생하는 데이터 변경 사항을 지속적으로 새 데이터베이스에 반영합니다. (예: CDC – Change Data Capture, 이벤트 기반 동기화)
    • 애플리케이션 수준 동기화: 기존 시스템과 새 서비스 양쪽에서 데이터를 읽고, 쓰기는 새 서비스에만 수행하며 데이터 정합성을 맞추는 방식도 고려할 수 있습니다.
  • 다운타임 최소화: 데이터 이전 과정에서 서비스 중단을 최소화하기 위해, 읽기 전용 전환, 점진적 전환, 데이터 동기화 도구 활용 등 다양한 전략을 수립하고 검증해야 합니다. 데이터 정합성 유지가 매우 중요합니다.

2-4. 기존 시스템과의 연동: Anti-Corruption Layer (ACL) 도입

새로운 마이크로서비스와 아직 전환되지 않은 기존 모놀리식 시스템 간에 불가피하게 통신이 필요한 경우가 발생합니다. 이때, 두 시스템 간의 직접적인 의존성을 차단하고 모델 차이를 흡수하기 위해 중간에 Anti-Corruption Layer (ACL, 부패 방지 계층)를 도입합니다.

목적

  • 모델 격리: 새로운 마이크로서비스의 깨끗한 도메인 모델이 레거시 시스템의 복잡하거나 오래된 모델에 의해 “오염”되는 것을 방지합니다. 반대로 레거시 시스템도 새로운 모델의 변경에 직접적인 영향을 받지 않도록 보호합니다.
  • 의존성 최소화: ACL은 두 시스템 간의 통신을 위한 번역기 역할을 하며, 한쪽 시스템의 변경이 다른 쪽에 미치는 영향을 최소화합니다.

구현 방식

  • ACL은 새로운 마이크로서비스의 일부로 구현되거나, 독립적인 어댑터 서비스로 구현될 수 있습니다.
  • Facade 패턴, Adapter 패턴 등을 활용하여 레거시 시스템의 인터페이스를 새로운 마이크로서비스가 이해하기 쉬운 형태로 변환합니다.

예시

기존 모놀리식 시스템의 데이터 모델이 Customer_Info_Legacy라는 복잡한 테이블 구조를 가지고 있고, 새로운 ‘고객 관리 마이크로서비스’는 간결한 CustomerProfile 모델을 사용한다고 가정합니다. ACL은 Customer_Info_Legacy 데이터를 조회하여 CustomerProfile 모델로 변환해주는 역할을 수행합니다.

2-5. 철저한 테스트 및 검증: 분산 환경에서의 품질 보증

마이크로서비스는 독립적으로 배포되고 운영되지만, 서로 상호작용하며 전체 시스템을 구성합니다. 따라서 개별 서비스의 품질뿐만 아니라 서비스 간 연동의 안정성까지 보장해야 합니다.

테스트 유형

  • 단위 테스트 (Unit Test): 각 마이크로서비스 내부의 개별 컴포넌트(함수, 클래스)가 의도대로 작동하는지 검증합니다.
  • 통합 테스트 (Integration Test): 마이크로서비스가 외부 의존성(데이터베이스, 메시지 큐, 다른 서비스 등)과 올바르게 연동되는지 검증합니다.
  • 계약 테스트 (Contract Test): 서비스 간의 API 명세(계약)가 올바르게 지켜지는지 검증합니다. 주로 소비자(Consumer)가 정의한 기대치를 제공자(Provider)가 충족하는지 확인하는 방식으로 진행됩니다 (Consumer-Driven Contract Testing).
  • End-to-End (E2E) 테스트: 실제 사용자 시나리오를 기반으로 여러 마이크로서비스를 아우르는 전체 시스템의 흐름을 검증합니다.
  • 성능 테스트 (Performance Test): 각 마이크로서비스 및 전체 시스템의 응답 시간, 처리량, 부하 감당 능력 등을 평가합니다.
  • 보안 테스트 (Security Test): 인증, 인가, 데이터 암호화, 취약점 점검 등 보안 관련 요구사항을 검증합니다.

2-6. 배포 자동화 (CI/CD 파이프라인 구축): 신속하고 안정적인 서비스 제공

각 마이크로서비스는 독립적으로 개발, 테스트, 배포될 수 있어야 합니다. 이를 위해 각 서비스별로 자동화된 CI/CD(Continuous Integration/Continuous Delivery or Deployment) 파이프라인을 구축하는 것이 필수적입니다.

핵심 요소

  • 독립적인 파이프라인: 각 마이크로서비스는 자체적인 소스 코드 저장소와 빌드, 테스트, 배포 파이프라인을 가집니다.
  • 자동화된 프로세스: 코드 변경 시 자동으로 빌드, 단위/통합 테스트가 실행되고, 테스트 통과 시 스테이징 또는 프로덕션 환경으로 자동 배포(CD)되거나 배포 준비(Continuous Delivery) 상태가 됩니다.
기대 효과
  • 신속한 배포: 개발 변경사항을 빠르고 안전하게 사용자에게 전달할 수 있습니다.
  • 배포 위험 감소: 자동화된 테스트와 점진적 배포 전략(카나리, 블루/그린 등)을 통해 배포 실패 위험을 줄입니다.
  • 개발 생산성 향상: 개발자는 코드 작성에 집중하고, 반복적인 배포 작업은 자동화된 파이프라인에 맡깁니다.
  • 일관성 있는 배포: 수동 작업으로 인한 실수를 방지하고 일관된 배포 품질을 유지합니다.

이처럼 스트랭글러 피그 패턴을 활용한 점진적 전환은 초기 투자와 노력이 필요하지만, 장기적으로 시스템의 안정성을 확보하고 비즈니스 민첩성을 높이는 효과적인 전략입니다. 각 단계마다 철저한 계획, 실행, 검증을 통해 성공적인 MSA 전환을 이룰 수 있습니다.

3. 운영 및 최적화 단계

1. 모니터링 및 로깅 중앙화: 분산된 서비스들의 상태를 통합적으로 모니터링하고 로그를 수집/분석할 수 있는 시스템(예: ELK Stack, Prometheus, Grafana)을 구축합니다.
2. 서비스 디스커버리 및 로드 밸런싱: 동적으로 생성되고 소멸되는 마이크로서비스 인스턴스들을 관리하고 트래픽을 분산합니다. (예: Eureka, Consul, Kubernetes 내장 기능)
3. 장애 복구 및 탄력성 확보: 서킷 브레이커, 재시도 패턴, 타임아웃 등을 적용하여 시스템의 안정성을 높입니다.
4. 보안 강화: 서비스 간 통신 암호화(mTLS), API 보안, 데이터 보안 등을 강화합니다.

얼마큼 변경해야 하는가? (변경 범위)

  • 아키텍처: 모놀리식/계층형 아키텍처에서 분산형 마이크로서비스 아키텍처로 근본적인 변화가 발생합니다.
  • 코드
    • PIM의 비즈니스 로직: 상당 부분 재활용 가능성이 있습니다. PIM은 플랫폼 독립적인 모델이므로, 이를 기반으로 각 마이크로서비스의 핵심 로직을 구현할 수 있습니다.
    • PSM 및 생성된 코드: 대부분 재작성되거나 새로운 기술 스택으로 대체될 가능성이 높습니다. MSA는 각 서비스에 최적화된 기술을 사용하므로, 기존 MDA에서 생성된 플랫폼 종속적인 코드는 그대로 사용하기 어렵습니다.
  • 데이터베이스: 중앙 집중형 데이터베이스에서 서비스별 분산 데이터베이스로 변경됩니다. 데이터 모델도 서비스 경계에 맞게 재설계될 수 있습니다.
  • 인프라: 컨테이너화(Docker), 오케스트레이션(Kubernetes), 클라우드 기반 인프라 도입이 일반적입니다.
  • 개발 문화 및 조직: DevOps 문화 도입, 서비스별 독립적인 팀 구성 등 조직 문화 및 구조에도 변화가 필요합니다.
  • 테스팅 전략: 분산 시스템에 맞는 새로운 테스팅 전략이 필요합니다. (예: 계약 테스트, 통합 테스트의 복잡성 증가)
  • 운영: 더 많은 배포 단위, 네트워크 통신, 분산 데이터 등으로 인해 운영 복잡성이 증가합니다. 이를 자동화와 모니터링으로 해결해야 합니다.

금융 서비스 전환 시 특히 고려할 점

  • 트랜잭션 관리: 앞서 언급했듯이, 분산 환경에서의 트랜잭션 처리는 매우 중요합니다. 특히 자금 이체와 같이 원자성이 보장되어야 하는 경우, Saga 패턴을 정교하게 설계하거나, 경우에 따라서는 특정 핵심 트랜잭션 영역은 모놀리식으로 유지하는 하이브리드 접근도 고려할 수 있습니다.
  • 데이터 정합성: Eventual Consistency를 허용할 수 있는 부분과 Strong Consistency가 필요한 부분을 명확히 구분하고, 그에 맞는 전략을 수립해야 합니다.
  • 보안: 각 서비스 API의 보안, 서비스 간 통신 보안, 데이터 암호화, 접근 제어 등 금융 규제(예: PCI DSS, ISMS 등)를 충족하는 강력한 보안 체계가 필수입니다.
  • 규제 준수 및 감사 추적: 모든 트랜잭션과 데이터 변경에 대한 감사 추적이 가능하도록 설계해야 합니다. 이는 규제 당국의 요구사항을 만족시키는 데 중요합니다.
  • 성능 및 응답 시간: 고객 대면 서비스의 경우 응답 시간이 매우 중요합니다. 서비스 간 호출 오버헤드를 최소화하고, 필요한 경우 캐싱 전략을 사용해야 합니다.

마무리

MDA에서 MSA로의 전환은 기존 PIM이라는 좋은 설계 자산을 활용할 수 있다는 장점이 있지만, 그럼에도 불구하고 상당한 기술적, 조직적 변화를 수반하는 복잡한 과정입니다. 특히 금융 서비스의 경우, 데이터 정합성, 보안, 규제 준수 등 해결해야 할 과제가 많습니다.

References & Related Links

Share This Story, Choose Your Platform!

Go to Top