Decompose by Business Capability

“Decompose by Business Capability” 패턴은 마이크로서비스 아키텍처(MSA)에서 중요한 분해 패턴이다.
이 패턴은 비즈니스 능력을 기반으로 애플리케이션을 마이크로서비스로 분해하는 방법을 제시한다.

이 패턴은 조직의 비즈니스 능력을 기반으로 마이크로서비스를 정의한다.
비즈니스 능력은 조직이 가치를 창출하기 위해 수행하는 특정 기능이나 프로세스를 의미한다.

주요 목적은 다음과 같다:

  1. 비즈니스 목표와 소프트웨어 개발의 정렬
  2. 독립적으로 개발 및 유지보수 가능한 서비스 생성
  3. 조직 구조와 시스템 아키텍처의 일치

이 패턴을 효과적으로 적용하려면 조직의 비즈니스 도메인에 대한 깊은 이해가 필요하며, 지속적인 비즈니스 분석과 서비스 경계의 조정이 필요하다.

비즈니스 역량(Business Capability)이란?

비즈니스 역량은 조직이 수행하는 고유한 비즈니스 기능이나 프로세스를 의미한다.
예를 들어, 전자상거래 플랫폼에서는 주문 관리, 결제 처리, 상품 카탈로그 관리, 고객 서비스 등이 각각의 비즈니스 역량에 해당한다.

비즈니스 역량에 따른 분해의 단계별 접근

  1. 비즈니스 역량 식별:
    • 조직의 주요 비즈니스 기능을 파악한다. 이를 위해 조직의 구조, 업무 프로세스, 기능적 요구사항 등을 분석한다.
    • 각 기능이 독립적으로 수행될 수 있는지, 다른 기능과의 의존성은 어떤지 평가한다.
  2. 서비스 경계 정의:
    • 식별된 비즈니스 역량을 기준으로 서비스의 경계를 설정한다.
    • 각 서비스는 단일 비즈니스 역량에 초점을 맞추어 높은 응집도를 유지하고, 다른 서비스와의 결합도를 낮추도록 설계한다.
  3. 서비스 설계 및 구현:
    • 정의된 서비스 경계를 기반으로 개별 서비스를 설계한다.
    • 각 서비스는 독립적으로 배포 및 확장 가능하도록 설계하며, 필요에 따라 자체 데이터베이스를 가질 수 있다.
  4. 서비스 통합 및 관리:
    • 분리된 서비스 간의 통신 방식을 결정한다. 동기식 통신(예: REST API) 또는 비동기식 통신(예: 메시지 큐)을 고려할 수 있다.
    • 서비스 간의 데이터 일관성, 오류 처리, 트랜잭션 관리 등을 위한 전략을 수립한다.

주요 특징

  1. 비즈니스 중심 접근: 기술적 세부사항보다는 비즈니스 기능에 초점을 맞춘다.
  2. 안정적인 아키텍처: 비즈니스 능력은 상대적으로 안정적이므로 아키텍처도 안정적이다.
  3. 교차 기능 팀: 각 서비스는 특정 비즈니스 능력을 담당하는 독립적인 팀에 의해 개발된다.

구현 방법

  1. 비즈니스 능력 식별: 조직의 목적, 구조, 비즈니스 프로세스를 분석하여 핵심 비즈니스 능력을 파악한다.
  2. 서비스 정의: 각 비즈니스 능력에 대응하는 마이크로서비스를 정의한다.
  3. 경계 설정: 각 서비스의 책임 범위와 데이터 소유권을 명확히 정의한다.
  4. API 설계: 서비스 간 통신을 위한 명확한 API를 설계한다.

장점

  1. 안정적인 아키텍처: 비즈니스 능력은 상대적으로 안정적이므로 아키텍처도 안정적이다.
  2. 독립적인 개발: 각 팀이 자율적으로 서비스를 개발할 수 있다.
  3. 느슨한 결합: 서비스 간 결합도가 낮아 유지보수와 확장이 용이하다.

주의사항

  1. 비즈니스 능력 식별의 어려움: 정확한 비즈니스 능력을 식별하는 것이 쉽지 않을 수 있다.
  2. 서비스 간 결합도 관리: 비즈니스 능력 간 상호작용으로 인한 서비스 간 결합도를 관리해야 한다.
  3. 데이터 일관성 유지: 분산된 데이터로 인한 일관성 문제를 해결해야 한다.

추가 고려사항

  • 도메인 주도 설계(DDD)와의 연계: 비즈니스 역량에 따른 분해는 DDD의 하위 도메인(Sub-Domain)과 밀접하게 연관된다. DDD를 적용하여 하위 도메인을 식별하고, 이를 기반으로 서비스를 분해하면 더욱 효과적인 MSA를 구현할 수 있다.
  • 서비스 크기 결정: 처음에는 큰 단위로 서비스를 분해하고, 필요에 따라 점진적으로 더 작은 서비스로 분할하는 접근이 권장된다. 이는 초기 복잡성을 낮추고, 점진적인 개선을 통해 최적의 서비스 크기를 찾아가는 데 도움이 된다.

사용 예시

전자상거래 플랫폼에서의 비즈니스 능력 기반 분해 예:

  1. 제품 카탈로그 관리
  2. 재고 관리
  3. 주문 관리
  4. 배송 관리
  5. 고객 관리
  6. 결제 처리
    각 비즈니스 능력은 독립적인 마이크로서비스로 구현될 수 있다.

구현 예시

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
// 결제 서비스
class PaymentService {
    async processPayment(paymentDetails) {
        try {
            // 결제 처리 로직
            const paymentResult = await this.paymentGateway.process(paymentDetails);
            
            // 결제 이벤트 발행
            this.eventBus.publish('PaymentProcessed', {
                orderId: paymentDetails.orderId,
                status: paymentResult.status
            });
            
            return paymentResult;
        } catch (error) {
            // 보상 트랜잭션 처리
            this.handlePaymentFailure(paymentDetails);
        }
    }
}

참고 및 출처