
1~4편에서는 주로 도메인/인증/권한 구조를 다뤘다.
tenant / user / tenant_user 패턴 이제부터는 “이걸 실제로 B2B SaaS로 키워 나갈 때” 생기는 고민들로 넘어가 보려고 한다.
같은 코드와 인프라 위에 여러 테넌트(고객사/입점사)를 올려두면,
언젠가 반드시 부딪히는 질문이 있다.
- 데이터는 어디까지 함께 두고, 어디부터 분리할까?
- 특정 테넌트가 과도하게 사용하면 다른 테넌트는 어떻게 보호하지?
- 비용과 리소스를 어떻게 테넌트 단위로 관리할까?
이 글은 이런 질문들에 대해:
까지 정리해 보는 글이다.
Lv1. 단일 DB, 단일 스키마, tenant_id 컬럼
Lv2. 단일 DB, 테넌트별 스키마 분리
Lv3. 테넌트별 별도 DB (같은 클러스터)
Lv4. 테넌트별 별도 클러스터/프로젝트 (물리적 분리)
트래픽/리소스 측면에서는
“처음부터 모든 테넌트를 물리적으로 분리”하기보다는:
기본은 Lv1(공유 DB + tenant_id)로 시작하고,
부담이 큰 테넌트부터 Lv3/Lv4로 점진적으로 분리하는 전략이
엔지니어링/비용/운영 측면에서 가장 현실적이다.
멀티테넌시를 인프라/스케일링 관점에서 바라보면,
고민 포인트는 대략 네 가지 축으로 정리할 수 있다.
데이터(Data)
트래픽 / 리소스(Resource)
운영 / 배포(Ops)
보안 / 규제(Security & Compliance)
이 네 가지 축을 염두에 두고,
각 레벨의 분리 전략을 선택하게 된다.
tenant_id 컬럼가장 기본이 되는 형태다.
user
---------
id
tenant_id
name
...
order
---------
id
tenant_id
user_id
amount
...
장점
단점
언제 좋냐?
이번에는 DB 인스턴스는 하나지만,
테넌트마다 스키마를 나누는 방식이다.
db_main
├─ schema_common -- 공통 메타/코드/로그 등
├─ schema_tenant_a -- tenant A용 테이블들
└─ schema_tenant_b -- tenant B용 테이블들
장점
단점
언제 좋냐?
이제는 아예 테넌트별 DB 인스턴스를 쪼개는 수준이다.
(혹은 같은 DB 클러스터 안에서 테넌트별 데이터베이스를 분리)
db_cluster
├─ db_tenant_a
├─ db_tenant_b
└─ db_tenant_c
장점
단점
언제 좋냐?
마지막은 아예 인프라 레벨에서 테넌트를 분리하는 방식이다.
각 테넌트마다
장점
단점
언제 좋냐?
데이터를 어떻게 나누든,
트래픽 관점에서는 항상 noisy neighbor 문제가 따라온다.
한 테넌트가 갑자기 대량의 API를 호출하거나,
대량의 배치 작업을 돌리면
다른 테넌트의 응답 속도와 가용성이 함께 떨어지는 문제.
이를 막기 위해 쓸 수 있는 몇 가지 패턴을 정리해보면:
테넌트별로:
유료 플랜/무료 플랜에 따라 Quota 를 다르게 가져갈 수도 있다.
예시 정책:
팁
실무에서 자주 놓치는 포인트 중 하나는 배치/백그라운드 작업이다.
이런 작업들이 한 테넌트에서만 폭증해도
전체 시스템에 부담을 줄 수 있다.
그래서:
예:
전체 RPS, 전체 에러율만 보는 것으로는
noisy neighbor 문제를 찾기 어렵다.
최소한 다음 정도는 테넌트별로 모니터링하는 것을 추천한다.
이를 위해 로그/메트릭에 항상 tenant_id 태그를 붙여 두는 것이 중요하다.
인프라는 분리해도,
대부분의 멀티테넌트 SaaS는 코드 베이스는 하나를 유지하고 싶어 한다.
여기서 자주 나오는 고민이:
테넌트별로:
이때는 “Tenant Config 서비스”를 하나 두고
tenant_id 기준으로 설정을 내려주는 패턴을 많이 쓴다.Lv1 구조(공유 DB + tenant_id)에서 시작했다가
나중에 일부 테넌트를 Lv3(별도 DB)로 옮길 때,
보통은 이런 순서로 간다.
이 과정에서 테넌트별 DataSource(또는 커넥션 정보)를
동적으로 바인딩하는 레이어가 필요하다.
마지막으로, “분리하면 좋다”가 아니라
“분리해야만 한다” 가 되는 경우도 있다.
예를 들어:
금융/공공 고객이
특정 고객과의 계약 상
이 경우에는 사실상 Lv4(별도 클러스터/프로젝트)가 된다.
코드는 최대한 공유하되,
인프라와 데이터는 독립된 설치형처럼 다뤄야 한다.
지금까지 내용들을 정리하면,
개인적으로는 멀티테넌트 B2B SaaS를 이렇게 가져가는 걸 선호한다.
1단계 – Shared Everything
- 단일 DB + tenant_id 컬럼
- 기본적인 Rate Limit + 모니터링
- 테넌트 수/트래픽이 아직 크지 않을 때
2단계 – Logical Isolation 강화
- 테넌트별 사용량 모니터링, 배치 큐 분리
- 일부 중요한 테넌트에 대해 스키마/DB 분리 시범 적용
3단계 – Heavy Tenant 분리
- 트래픽/데이터가 큰 테넌트를 Lv3(Lv4)로 분리
- DataSource 라우팅, 마이그레이션 자동화
4단계 – 규제/특수 고객 대응
- 보안/규제 요구가 높은 고객은 별도 클러스터/프로젝트
- 공통 코드베이스 + 템플릿 인프라로 반복 구축
핵심은:
“처음부터 모든 걸 완벽하게 나누지 않고,
데이터/트래픽 패턴을 보면서 점진적으로 분리해 나가는 것”
이다.
이번 5편에서는
멀티테넌트 회원·인증 구조 위에
을 정리해 보았다.
1~4편이 “어떻게 모델링하고 인증/권한을 설계할 것인가”에 가까웠다면,
5편은 “그 구조를 실제 B2B SaaS로 키워 나갈 때 어떤 선택을 하게 되는가”에 대한 이야기다.
다음 편(6편)에서는
지금까지의 내용을 한 번에 정리하면서,
- “우리 서비스에 정말 멀티테넌트가 필요한가?” 체크리스트
- 설계/구현에서 자주 나오는 안티패턴
- 프로젝트 초기에 어떤 수준까지 고민하면 좋은지
를 한 번에 정리해볼 예정이다.
Microsoft Docs, “Multitenant SaaS database tenancy patterns”, Azure SQL Database.
BIX Tech, “Multi-Tenant Architecture: The Complete Guide for Modern SaaS and Analytics Platforms”.
Azure Architecture Center, “Noisy Neighbor Antipattern”.
AWS Architecture Blog, “Throttling a tiered, multi-tenant REST API at scale using API Gateway”.
DreamFactory, “Rate Limiting vs Throttling: Multi-Tenant API Use Cases”.
Neon / Medium 등, “Noisy Neighbor Problem in Multi-Tenant Systems” 관련 글들.