피드로 돌아가기![[SaaS] Enterprise 환경으로 확장하기 쉬운 Multi-Tenancy 서비스 구축하기](https://tsewlmecqtvqphyhezcm.supabase.co/storage/v1/object/public/thumbnails/a010f3c4-d3d7-425a-a1a0-ec999a7b159d.webp?)
강남언니 공식 블로그Backend
원문 읽기
[SaaS] Enterprise 환경으로 확장하기 쉬운 Multi-Tenancy 서비스 구축하기
힐링페이퍼가 Common/Tenant 서비스 분리, gomplate 기반 Kubernetes Manifest 관리, MongoDB tenantId suffix 전략으로 엔터프라이즈 멀티테넌시 환경 구축
AI 요약
Context
SaaS 제품이 엔터프라이즈 고객으로 확장되면서 전체 테넌트에 공통으로 적용되는 서비스와 테넌트별로 독립적으로 운영해야 하는 서비스를 구분 관리해야 했다. 초기에는 통합 데이터베이스 환경에서 시작하되, 향후 테넌트별 독립 DB로 마이그레이션할 때 스키마 변경을 최소화해야 했다.
Technical Solution
- Common 서비스와 Tenant 서비스 분리: 회원가입, 로그인 등 전체 테넌트 공통 기능은 Common 서비스로, 병원별 직원관리·시술관리 등 테넌트 고유 기능은 Tenant 서비스로 구분
- Kubernetes Manifest를 gomplate 템플릿으로 관리: 단일 YAML 템플릿에서 환경 변수 기반 파라미터화(NAMESPACE, IMAGE_TAG, AWS_SERVICE_ACCOUNT_ARN, SHOULD_INIT, ENV)를 통해 gomplate로 최종 Manifest 생성
- 엔터프라이즈별 Namespace 격리: Kubernetes Namespace로 테넌트별 리소스 분리
- ServiceAccount + AWS IAM Role(IRSA) 연동: 각 서비스가 AWS 서비스 접근 권한을 가진 IAM Role을 ServiceAccount 어노테이션을 통해 부여
- MongoDB tenantId suffix 전략: 논리적 Collection 이름에 tenantId를 suffix로 추가하여 물리적 Collection 생성(예: service_a_collection_{tenantId}), 스키마 관리는 Application Code로만 수행, 향후 독립 DB 마이그레이션 시 suffix 기반 Collection만 추출하여 dump 수행
- Semantic versioning 기반 다중 버전 관리: git tag를 참조하여 Container Image를 Build하고, Deployment의 Image tag 변경만으로 파트너별 다른 버전 배포
Key Takeaway
멀티테넌시 환경에서 즉시적인 엔터프라이즈 격리와 향후 데이터 마이그레이션 유연성을 동시에 확보하려면, Kubernetes Namespace 격리와 MongoDB의 동적 Collection 생성 특성을 활용한 애플리케이션 레벨의 tenantId suffix 전략이 DDL 변경 없이 스케일링을 가능하게 한다.
실천 포인트
멀티테넌시 SaaS 백엔드 개발 팀에서 gomplate를 이용한 파라미터화된 Kubernetes Manifest 관리를 도입하면, 서비스별 리소스 요청값, 컨테이너 구성, 이미지 태그를 중앙화하여 한눈에 서비스 구성을 파악할 수 있으며, MongoDB에서 tenantId suffix Collection 전략을 적용하면 통합 DB 단계에서도 스키마 DDL 변경 없이 새로운 테넌트를 즉시 추가할 수 있고 추후 테넌트별 독립 DB로의 마이그레이션이 Collection 단위 추출만으로 가능해진다.