03 MSA Data 구조
03 MSA Data 구조
1. Note
- MSA에서는 컨텍스트마다 DB를 선택가능함
- 따라서 컨텍스트에 맞는 최적화된 Data구조를 선택할 수 있게됨
- 추가적으로 RDB는 각 DB마다 락, 트랜잭션이 어떻게 흘러가는지 추가적인 공부가 필요할듯.
- 그런데 너무 다양한 DB를 선택하게 되면 복잡해질 수가 있어서 경계 필요!
2. Monolith & MSA 데이터 구조 비교
1. Monolith 데이터 구조
- 모든 기능이 하나의 애플리케이션 + 하나의 DB를 공유
- 모든 테이블이 하나의 DB에 존재
- User, Order, Payment 모두 같은 DB 접근
- JOIN이 자유롭고 트랜잭션도 하나로 처리 가능
- 한계점
- 결합도 증가 / 스키마 변경이 전체 시스템 영향
- 확장성 한계 / 트래픽 많은 서비스만 따로 scale 불가
- 배포 비효율 / 하나 수정해도 전체 배포 필요
- 장애 전파 / DB 장애 = 전체 장애
2. MSA 데이터구조
- 서비스 기준으로 데이터가 분리함(Database-per-service)
- 서비스마다 DB 독립
- 다른 서비스 DB 직접 접근 금지
- 데이터 소유권이 서비스에 있음
- 구조
1 2 3
User Service → User DB Order Service → Order DB Payment Service → Payment DB
3. Database-per-Service
1. Database-per-Service
각 마이크로서비스가 독립된 데이터베이스를 소유하는 구조.- 서비스 간 데이터베이스 공유를 금지하고, 데이터의 소유권을 서비스 단위로 명확히 분리
- 데이터 조회 패턴
- API 호출 / Order 서비스 → User 서비스 호출
- 이벤트 기반 동기화 / User 변경 → 이벤트 발생 → Order가 복제 데이터 저장
2. 이점
1. 완전한 데이터 독립성 및 배포 자율성 보장
- 각 서비스는 자신의 데이터베이스 구조를 독립적으로 변경할 수 있음
- 따라서 특정 서비스의 스키마 변경이 다른 서비스에 영향을 주지 않음
- 각 팀은 서로 간섭 없이 독립적으로 기능을 개발하고 배포할 수 있으며, 배포 주기도 서비스 단위로 분리됨
2. 폴리글랏 데이터베이스(Polyglot Persistence) 지원
- 각 서비스는 자신의 도메인 특성에 가장 적합한 데이터 저장 기술을 선택할 수 있음
- 주문 / 결제 서비스 → MySQL, PostgreSQL (트랜잭션 중심)
- 상품 추천 / 카탈로그 서비스 → MongoDB (유연한 스키마, 대용량 읽기)
- 하나의 시스템에서 여러 DB 기술을 혼합하여 최적화된 구조를 구성할 수 있음
3. 완벽한 장애 격리 (Fault Isolation)
- 모놀리식 구조에서는 하나의 DB 장애가 전체 시스템 장애로 이어질 수 있음
- Database-per-Service 구조에서는 각 서비스의 DB가 독립되어 있음
- 장애 영향 범위가 서비스 단위로 제한됨
- 결제 DB 장애 발생 → 결제 기능만 영향
- 상품 조회 / 장바구니 기능은 정상 동작 유지
3. 한계점
1. 데이터 중복 및 동기화 비용 발생
- 여러 서비스에서 공통으로 사용하는 데이터(예: 사용자 정보 등)는 각 서비스 DB에 중복 저장될 수 있음
- 이 경우 데이터 변경 시 모든 관련 서비스에 반영해야 하므로,
- 데이터 동기화를 위한 이벤트 기반 처리 또는 별도 아키텍처가 필요
2. 분산 환경의 데이터 일관성(Data Consistency) 유지 어려움
- 단일 DB 환경에서 사용하던 JOIN, Foreign Key, ACID 트랜잭션을 그대로 사용할 수 없음
- 서비스 간 JOIN 불가능
- 분산 트랜잭션 불가
- 즉시 일관성 보장 어려움
- 문제를 해결하기 위해 Saga 패턴이나 Event-driven 구조를 코드 레벨에서 직접 설계해야함
- 시스템 복잡도가 크게 증가
3. 운영 및 인프라 복잡도 증가
- 서비스 수만큼 데이터베이스가 증가하므로 운영 부담이 커짐
- DevOps 및 인프라 관리 비용이 크게 상승함
- DB 인스턴스 수 증가
- 백업 및 복구 전략 분리
- 모니터링 대상 증가
- 커넥션 풀 및 성능 튜닝 개별 관리
- HA 구성 복잡도 증가
4. 서비스 간 데이터 흐름
1. API 기반 조회 (동기 통신)
- 필요한 데이터를 실시간으로 다른 서비스에게 요청하는 방식
- 흐름
1 2 3 4 5
Order Service ↓ 회원 정보 필요 User Service API 호출 ↓ 회원 데이터 반환
- 케이스
- 주문 서비스 → 회원 등급 조회
- 결제 서비스 → 주문 상태 확인
- 배송 서비스 → 배송지 조회
- 특징
- 즉시 최신 데이터 조회 가능
- 구현 단순
- 한계
- 서비스 간 강한 의존성 발생
- 연쇄 장애(Cascading Failure) 위험
- 응답 지연 증가
2. 이벤트 기반 데이터 동기화 (비동기 통신)
- 다른 서비스 데이터를 미리 복제하여 사용하는 방식
- 서비스 변경 사항을 이벤트로 발행하고, 필요한 서비스가 이를 구독하여 자신의 DB에 저장
- 흐름
1 2 3 4 5 6 7
User Service ↓ 회원 등급 변경 회원 변경 이벤트 발행 ↓ Kafka Order Service 수신 ↓ Order DB 업데이트
- 특징
- 서비스 간 결합도 낮음
- 장애 전파 감소
- 성능 및 확장성 우수
- 한계
- 데이터 동기화 복잡
- 즉시 일관성 보장 어려움
- eventual consistency 발생
5. 서비스별 DB 선택 전략 (RDBMS)
1. MySQL
1. 특징
- 가장 널리 사용되는 오픈소스 관계형 데이터베이스로,
단순한 구조와 높은 접근성을 기반으로 많이 사용 - 기본적으로 InnoDB 엔진을 사용하며, 트랜잭션과 외래키(Foreign Key)를 지원하여 관계형 데이터 모델을 안정적으로 처리
- 읽기 중심의 워크로드에서 높은 성능을 보이며, 캐싱 구조와 인덱스 최적화가 잘 되어 있어 일반적인 CRUD 기반 서비스에 적합
- 클라우드 환경(AWS RDS, GCP Cloud SQL 등)에서 기본적으로 지원되어 운영 편의성이 높음
2. 적합한 컨텍스트 유형
- 일반적인 웹 서비스 (CRUD 중심)
- 트래픽이 크지 않거나 중간 규모 서비스
- 읽기 비중이 높은 서비스
- 빠른 개발/배포가 중요한 스타트업 환경
- 커머스 기본 구조 (상품 조회, 주문 기본 처리 등)
3. 장단점
| 구분 | 내용 |
|---|---|
| 장점 | - 설치 및 운영이 매우 쉬움 - 읽기 중심 서비스에서 높은 성능 - 오픈소스로 비용 부담 없음 - 클라우드 지원이 매우 좋음 - 커뮤니티 및 자료가 풍부함 |
| 단점 | - 복잡한 쿼리 최적화 기능은 상대적으로 약함 - 고급 분석 기능 부족 - 대규모 트랜잭션/분석 처리에는 한계 - PostgreSQL 대비 SQL 기능 다양성 부족 |
2. PostgreSQL
1. 특징
- 표준 SQL에 가장 가까운 구조를 가진 고급 RDBMS
- 윈도우 함수, CTE(Common Table Expression) 등 고급 SQL 기능을 강력하게 지원하며, 복잡한 쿼리 처리에 최적화됨
- JSON, 배열 타입, GIS(PostGIS) 등
다양한 데이터 타입을 지원하여 관계형 + 비정형 데이터를 함께 처리할 수 있음 - 확장(Extension) 구조를 통해 기능을 추가할 수 있어, 매우 유연한 아키텍처 구성이 가능
VectorDB 활용가능함.
2. 적합한 컨텍스트 유형
- 복잡한 비즈니스 로직이 필요한 서비스
- 데이터 정합성과 무결성이 중요한 시스템
- 분석/조회 기능이 함께 필요한 서비스
- JSON 기반 유연한 데이터 구조가 필요한 서비스
- 확장성이 중요한 MSA 환경
3. 장단점
| 구분 | 내용 |
|---|---|
| 장점 | - SQL 기능이 매우 강력함 (CTE, 윈도우 함수 등) - 데이터 무결성 및 정합성 우수 - JSON, 배열, GIS 등 다양한 데이터 타입 지원 - 확장성(Extension) 구조로 기능 확장 가능 - 복잡한 쿼리 처리에 최적화 |
| 단점 | - MySQL 대비 학습 난이도 높음 - 설정 및 튜닝 복잡도 존재 - 운영 초기 진입 장벽 있음 |
3. Oracle DB
1. 특징
- 대표적인 상용 엔터프라이즈 RDBMS로,
안정성과 성능이 최상위 수준 - 대규모 트랜잭션 처리에 최적화
- 고급 보안 기능, 자동 장애 복구, RAC(Real Application Clusters) 같은 고가용성 기능을 제공
라이선스 비용이 매우 높고, 운영 구조가 복잡하여 일반 서비스보다는 엔터프라이즈 환경에 집중되어 있음
2. 적합한 컨텍스트 유형
- 금융권 / 은행 / 보험 시스템
- 대기업 핵심 미션 크리티컬 시스템
- 초고가용성(HA)이 필요한 서비스
- 대규모 OLTP 시스템
- 엄격한 데이터 보안이 필요한 환경
3. 장단점
| 구분 | 내용 |
|---|---|
| 장점 | - 대규모 트랜잭션 처리에 최적화 - 매우 강력한 안정성 및 고가용성 기능 - 고급 보안 기능 제공 - 엔터프라이즈급 성능 최상위 |
| 단점 | - 라이선스 비용 매우 높음 - 운영 및 관리 복잡도 높음 - 벤더 종속성 강함 - 개발/테스트 환경 구축 부담 큼 |
6. NoSQL 및 In-memory DB 전략
1. MongoDB
1. 특징
- 대표적인 Document 기반 NoSQL 데이터베이스로, 데이터를 JSON과 유사한 BSON(Binary JSON) 형태로 저장
- RDBMS처럼 고정된 스키마를 강제하지 않기 때문에, 서비스 요구사항 변화에 따라 필드 구조를 유연하게 수정할 수 있음
- 수평 확장(Sharding)에 강점을 가지며, 대량 데이터 처리 환경에서 유연하게 scale-out이 가능
- 특히 상품 정보처럼 속성이 자주 변하거나, 사용자별 데이터 구조가 달라질 수 있는 환경에서 강력한 장점
2. 적합한 컨텍스트 유형
- 데이터 구조가 자주 변경되는 서비스
- 유연한 스키마가 필요한 서비스
- 대규모 읽기/쓰기 트래픽 처리
- 상품 카탈로그, 콘텐츠 관리 시스템(CMS)
- 추천 시스템 및 사용자 행동 로그 저장
3. 장단점
| 구분 | 내용 |
|---|---|
| 장점 | - 스키마 변경이 매우 유연함 - JSON 기반 데이터 구조로 개발 생산성 높음 - 대규모 트래픽 처리 및 수평 확장에 강함 - 비정형 데이터 처리 적합 |
| 단점 | - JOIN 기능이 제한적임 - 복잡한 관계형 데이터 모델링에 불리함 - RDBMS 대비 강한 정합성 처리에 한계 존재 - 트랜잭션 중심 서비스에는 부적합 |
2. Redis (In-memory DB)
1. 특징
- 메모리(In-memory) 기반 Key-Value 저장소로, 매우 빠른 읽기/쓰기 성능을 제공한
- 디스크가 아닌 RAM 기반으로 동작하기 때문에 일반 RDBMS 대비 압도적으로 빠른 속도를 가짐
- 또한 TTL(Time To Live)을 지원하여 일정 시간이 지나면 데이터를 자동 삭제할 수 있어, 세션이나 임시 데이터 관리에 적합
- String, Hash, List, Set, Sorted Set 등 다양한 자료구조를 제공하여 단순 캐시 이상의 활용이 가능
2. 적합한 컨텍스트 유형
- 초고속 응답이 필요한 서비스
- 캐시(Cache) 시스템
- 로그인 세션(Session) 저장
- 실시간 랭킹 시스템
- 장바구니, 토큰, 인증 정보 관리
3. 장단점
| 구분 | 내용 |
|---|---|
| 장점 | - 매우 빠른 읽기/쓰기 속도 - TTL 지원으로 임시 데이터 관리 편리 - 다양한 자료구조 제공 - DB 부하 감소 및 성능 개선 효과 큼 |
| 단점 | - 메모리 기반이라 비용 부담 존재 - 서버 재시작 시 데이터 유실 위험 (설정에 따라 완화 가능) - 영구 저장소(Persistent DB) 용도로는 부적합 - 대용량 데이터 저장에 비효율적 |
7. 검색/조회 전용 저장소 (Elasticsearch)
1. ELS
1. 특징
- Apache Lucene 기반의 분산 검색 엔진으로, 대량 데이터에 대한 빠른 검색과 분석에 특화된 저장소
- Document 기반(JSON 형태)으로 데이터를 저장하며, 역색인(Inverted Index) 구조를 사용
- 일반 RDBMS의 LIKE 검색보다 훨씬 빠른 Full-text Search 성능을 제공
- Aggregation 기능을 통해 실시간 통계 및 데이터 분석이 가능하며, 로그 분석 플랫폼(ELK Stack) 구성에도 널리 활용
- MSA 환경에서는 주로 검색과 조회 성능을 분리하기 위한 Read Model 또는 조회 전용 저장소로 사용
내부적으로는 NoSQL 계열이 맞지만, 용도가 달라서 별도로 판단
2. 적합한 컨텍스트유형
- 상품 검색 시스템
- 대용량 Full-text Search
- 실시간 로그 분석 시스템
- 검색 성능이 중요한 서비스
- 데이터 집계(Aggregation) 및 통계 조회
- 추천 검색어 및 자동완성 기능
3. 장단점
| 구분 | 내용 |
|---|---|
| 장점 | - Full-text Search 성능이 매우 뛰어남 - 대용량 검색 처리에 강함 - Aggregation 기반 실시간 분석 가능 - 수평 확장(Scale-out)에 유리함 - 로그 분석 및 검색 서비스 구축에 적합 |
| 단점 | - Primary DB 용도로는 부적합 - 데이터 정합성 유지 어려움 (Eventual Consistency) - 데이터 동기화 아키텍처 추가 필요 - 메모리 사용량이 높고 운영 난이도 존재 |
This post is licensed under CC BY 4.0 by the author.