2. 마이크로서비스 설계
성공적인 MSA 구현의 핵심은 서비스를 어떻게 분리하고 설계하는지에 달려 있습니다. 도메인 주도 설계 (DDD)는 서비스 경계를 정의하는 데 유용한 접근 방식입니다.
2.1. 도메인 주도 설계 (DDD)를 통한 서비스 경계 정의
DDD는 비즈니스 도메인에 초점을 맞춰 소프트웨어를 설계하는 방법입니다. 바운디드 컨텍스트(Bounded Context) 개념을 사용하여 각 마이크로서비스의 명확한 경계를 설정합니다.
// DDD를 통한 서비스 분리 예시
// 'Order' 바운디드 컨텍스트
class OrderService {
createOrder(orderData) { /* ... */ }
getOrderDetails(orderId) { /* ... */ }
}
// 'Customer' 바운디드 컨텍스트
class CustomerService {
createCustomer(customerData) { /* ... */ }
getCustomerInfo(customerId) { /* ... */ }
}
2.2. API 설계 (REST, gRPC)
마이크로서비스 간 통신을 위해 잘 정의된 API가 필수적입니다. 일반적으로 REST (Representational State Transfer) 또는 gRPC가 사용됩니다.
- REST: 간단하고 HTTP 기반의 표준적인 웹 서비스 API. 리소스(Resource) 중심의 설계가 특징입니다.
- gRPC: 고성능, 언어 독립적인 RPC(Remote Procedure Call) 프레임워크. HTTP/2 기반으로 더 효율적인 통신이 가능합니다.
2.3. 서비스당 데이터 관리
각 마이크로서비스는 자체 데이터베이스를 소유하는 것이 일반적입니다. 이는 서비스 간의 느슨한 결합을 강화하고, 독립적인 배포를 가능하게 합니다.
// 'Product' 서비스의 데이터베이스
// Product DB (e.g., PostgreSQL)
// - products (table)
// - categories (table)
// 'Inventory' 서비스의 데이터베이스
// Inventory DB (e.g., MongoDB)
// - stock_levels (collection)
// - suppliers (collection)