📌 서론 — 왜 이 구조를 쓰는가
MSA를 설계하다 보면 항상 부딪히는 고민이 있다.
- DB를 서비스마다 완전히 분리할 것인가?
- 아니면 하나의 DB 인스턴스에서 스키마만 나눌 것인가?
특히 초기 스타트업이나 사내 시스템에서는 다음 이유로
PostgreSQL 단일 인스턴스 + 스키마 분리를 선택하는 경우가 많다.
- 인프라 비용 절감
- 운영 복잡도 감소
- 빠른 개발 속도
하지만 이 구조는 “MSA처럼 보이지만 실제로는 강하게 결합된 구조”가 될 위험이 있다.
📌 구조 개요
PostgreSQL (Single Instance)
├── auth_schema
├── order_schema
├── payment_schema
└── user_schema
├── auth_schema
├── order_schema
├── payment_schema
└── user_schema
- 하나의 DB 인스턴스
- 서비스별 schema 분리
- 물리적 분리는 없음 (논리적 분리)
📌 영향도 분석 (핵심)
1️⃣ 장애 전파 (Blast Radius 문제)
문제
- DB 인스턴스 하나가 죽으면 전체 서비스 다운
예시
- payment에서 lock 발생 → DB 전체 성능 저하 → auth까지 영향
👉 MSA의 핵심인 장애 격리 실패
2️⃣ 리소스 경쟁 (CPU / I/O / Connection Pool)
문제
- 모든 서비스가 동일 리소스 공유
케이스
- 배치 (정산) 작업 → 디스크 I/O 폭증
- → 실시간 API latency 증가
👉 특히 르무엘님 하는 “정산 배치”에서 자주 터짐
3️⃣ 트랜잭션 결합 위험
문제
- cross-schema join이 쉬움
SELECT *
FROM order_schema.orders o
JOIN payment_schema.payments p
ON o.id = p.order_id;
FROM order_schema.orders o
JOIN payment_schema.payments p
ON o.id = p.order_id;
👉 이 순간 MSA 깨짐
- 서비스 간 DB 의존 발생
- 나중에 분리 불가능한 구조 됨
4️⃣ 배포 독립성 저하
문제
- DB migration 충돌
예시
- auth 서비스 migration 실행
- payment 서비스와 lock 충돌
👉 Flyway/Liquibase 운영 난이도 상승
5️⃣ 보안/권한 관리 복잡도
문제
- schema level 권한 관리 필요
GRANT USAGE ON SCHEMA auth_schema TO auth_user;
👉 잘못 설정하면:
- 다른 서비스 데이터 접근 가능
- 데이터 격리 실패
6️⃣ 스케일링 한계
문제
- 특정 서비스만 확장 불가
예:
- search 서비스만 트래픽 폭증
- → DB 전체 스케일 필요
👉 비용 비효율 발생
📌 언제 써도 되는가 (현실적인 기준)
✅ 적합한 상황
- 초기 스타트업 / PoC
- 트래픽 낮음
- 팀 규모 작음
- 빠른 개발이 중요한 경우
👉 “MSA 흉내 + 빠른 실행” 단계
❌ 피해야 하는 상황
- 금융 / 결제 / 정산 시스템
- 트래픽 높은 서비스
- 서비스 간 완전한 독립 필요
👉 르무엘님 구조는 사실 여기 해당됨
📌 실무 대응 전략 (중요)
1️⃣ 강제 격리 룰 설정
- cross-schema join 금지
- DB 접근은 서비스 내부에서만
👉 코드 리뷰로 강제
2️⃣ 커넥션 풀 분리
- 서비스별 datasource 분리
maxPoolSize: 10 (service별 제한)
👉 특정 서비스가 DB 독점 못하게
3️⃣ 점진적 분리 전략
초기:
- single instance + schema
중기:
- read replica 분리
후기:
- DB per service
👉 “탈출 전략” 반드시 설계해야 함
4️⃣ 이벤트 기반으로 전환
- DB join 대신
- Kafka / 이벤트 사용
OrderCreated → PaymentService consume
👉 DB 의존 제거
5️⃣ 배치 분리
- 정산 / 통계는 별도 DB or replica
👉 운영 안정성 핵심 포인트
📌 결론
PostgreSQL 단일 인스턴스 + 스키마 분리 전략은
**“MSA의 입문 단계에서만 유효한 타협안”**이다.
하지만 다음을 명확히 인지해야 한다.
- 장애는 공유된다
- 성능은 경쟁한다
- 구조는 쉽게 무너진다
👉 결국 중요한 건 하나다
“나중에 분리할 수 있는 구조인가?”
📌 한줄 정리
👉 스키마 분리는 시작일 뿐, 끝이 아니다 — 탈출 전략 없는 MSA는 모놀리식이다
LIST
'DB' 카테고리의 다른 글
| Prisma, 정말 쓸 만한가?장단점 솔직하게 정리해봤다 (0) | 2026.03.18 |
|---|---|
| [Database] 스키마 관리의 두 철학: Prisma Migrate vs Flyway 전격 비교 (0) | 2026.03.17 |
| JPA를 사용하면 성능이 느려진다고 하는 이유(N+1문제) (2) | 2026.03.11 |
| Spring Boot에서 @Transactional을 잘못 쓰면 생기는 7가지 문제 (0) | 2026.03.11 |
| Spring Boot에서 DB 커넥션 풀 크기를 계산하는 방법 (0) | 2026.03.11 |
