이 기술 아티클은 SaaS 제품을 설계하거나 초기 설계를 벗어난 제품을 개선하고 있는 CTO, 아키텍트, 시니어 엔지니어를 대상으로 합니다. SaaS 플랫폼 엔지니어링 가이드에서는 사일로, 풀, 브릿지 테넌시 모델과 컨트롤 플레인을 소개합니다. 이 아티클은 각 레이어에서 격리가 어떻게 적용되는지, 데이터가 어떻게 파티셔닝되는지, 빌링이 어떻게 연결되는지, AI 기능이 테넌트 경계 내에 유지되는 방법, 플랫폼 확장 방법을 한 단계 더 깊이 다룹니다. 마켓플레이스는 마켓플레이스 플랫폼 아키텍처에서 다룹니다.
컨텍스트: 테넌트, 사용자, 배포
먼저 테넌트를 정의합니다. B2B SaaS에서 테넌트는 일반적으로 여러 사용자를 가진 고객 조직입니다. 일부 고객은 별도의 자회사나 테스트 및 프로덕션 환경처럼 여러 테넌트가 필요합니다. B2C 제품에서는 테넌트가 개인, 가족 또는 그룹일 수 있습니다. Microsoft의 Azure Architecture Center는 이 정의와 테넌시 모델이 고객에게 수용 가능한지 여부가 기술적 결정만큼이나 상업적 결정이라는 점을 지적합니다.
논리적 테넌트와 이를 서비스하는 배포를 분리합니다. 배포(스탬프라고도 함)는 하나의 인프라 집합입니다. 여러 테넌트가 배포를 공유하거나 하나의 테넌트가 전용 배포를 가질 수 있습니다. 처음부터 테넌트-배포 맵을 유지하면 나중에 애플리케이션을 재작성하지 않고도 테넌트를 배포 간에 이동할 수 있습니다.
격리는 레이어별로 결정됩니다
SaaS 테넌트 격리 전략에 관한 AWS 백서는 격리를 SaaS 설계의 근본이라고 설명하며, 테넌트 경계를 침범하는 것을 비즈니스에 회복하기 어려운 사건으로 기술합니다. Microsoft는 격리를 단일 스위치가 아닌 스펙트럼으로 설명합니다. 실제로 각 레이어는 별도의 답을 갖습니다:
| 레이어 | 공유 옵션 | 격리 옵션 | 결정 요소 |
|---|---|---|---|
| 컴퓨트 | 공유 애플리케이션 서버 | 테넌트별 전용 서버 또는 컨테이너 | 성능 보장, 노이지 네이버, 고객 요구 |
| 데이터베이스 | 테넌트 키가 있는 공유 테이블 | 테넌트별 별도 스키마 또는 데이터베이스 | 데이터 민감성, 백업 및 복구 필요성, 규모 |
| 파일 스토리지 | 테넌트 접두사가 있는 공유 버킷 | 테넌트별 버킷 또는 컨테이너 | 접근 정책, 데이터 레지던시, 보존 규칙 |
| 캐시 | 테넌트 접두사 키가 있는 공유 캐시 | 테넌트별 별도 캐시 | 키 충돌 위험, 메모리 압박 |
| 큐 및 잡 | 테넌트 태그가 있는 공유 큐 | 테넌트별 또는 티어별 큐 | 공정성, 한 테넌트의 백로그가 다른 테넌트를 지연시키지 않도록 |
| 검색 인덱스 | 테넌트로 필터링된 공유 인덱스 | 테넌트별 인덱스 | 인덱스 크기, 테넌트별 관련성 튜닝 |
| 로그 및 메트릭 | 테넌트 태그가 있는 공유 파이프라인 | 규제 테넌트를 위한 별도 스트림 | 지원 필요성, 감사 요구사항 |
| 암호화 키 | 플랫폼 관리 키 | 테넌트별 키 | 계약 요구사항, 오프보딩(테넌트 키 파기) |
| AI 검색 인덱스 | 테넌트 필터가 적용된 공유 벡터 인덱스 | 테넌트별 인덱스 또는 네임스페이스 | 데이터 민감성, 인덱스 크기, 오프보딩 |
일반적이고 합리적인 결과는 풀링된 애플리케이션 티어와 필요한 테넌트를 위한 격리된 데이터입니다. Microsoft는 일부 구성 요소를 테넌트별로 분리하고 다른 구성 요소를 공유하는 것을 수평 파티셔닝이라 하고, 선택된 테넌트에 전체 전용 배포를 제공하는 것을 수직 파티셔닝이라고 합니다.
데이터 파티셔닝 옵션
| 패턴 | 격리 적용 방법 | 장점 | 트레이드오프 | 적합한 경우 |
|---|---|---|---|---|
| 공유 스키마, 모든 행에 테넌트 키 | 모든 쿼리에 테넌트 필터, 데이터베이스 행 수준 정책으로 보완 | 가장 저렴하고 운영이 단순하며 크로스 테넌트 리포팅이 용이 | 데이터베이스 정책 없이 필터 누락 시 데이터 유출 가능; 노이지 네이버 | 소규모 테넌트 다수 |
| 테넌트별 스키마 | 하나의 데이터베이스 내 테넌트별 별도 스키마 | 명확한 분리, 테넌트별 복구가 용이 | 마이그레이션이 스키마마다 실행; 스키마 수에 실질적 한계 | 중간 규모 테넌트 수십~수백 개 |
| 테넌트별 데이터베이스 | 테넌트별 별도 데이터베이스 | 강한 격리, 테넌트별 튜닝, 레지던시 옵션 | 높은 비용, 마이그레이션 및 백업 플리트 관리 | 대형 또는 규제 테넌트 |
| 테넌트별 배포 | 테넌트별 별도 스택 | 가장 강한 격리, 독립적인 릴리스 타이밍 | 가장 높은 비용; 운영해야 할 배포 다수 | 소수의 매우 대형 또는 규제 고객 |
풀링된 데이터베이스의 경우, 애플리케이션 코드뿐만 아니라 데이터베이스 자체에서 격리를 적용합니다. PostgreSQL의 행 보안 정책이 한 방법입니다. 테이블에 활성화되면 정책이 허용하지 않는 한 행이 숨겨지므로, 테넌트 필터 없는 쿼리는 모든 것이 아닌 아무것도 반환하지 않습니다. 두 가지 세부 사항이 중요합니다. 정책은 테이블별로 활성화해야 하며, 테이블 소유자, 슈퍼유저 및 BYPASSRLS 속성을 가진 역할은 기본적으로 이를 우회합니다. 따라서 애플리케이션은 테이블을 소유하지 않는 역할로 연결하거나, 소유자에게도 정책이 적용되도록 테이블이 행 보안을 강제하게 설정해야 합니다.
요청 흐름과 테넌트 컨텍스트
멀티테넌트 플랫폼의 요청은 항상 동일한 경로를 따라야 합니다:
-
테넌트 확인
클라이언트가 자유롭게 변경할 수 있는 값이 아닌, 서브도메인, 커스텀 도메인 또는 인증 토큰의 클레임에서 테넌트를 확인합니다.
-
사용자 인증
사용자를 인증하고 해당 테넌트에 속하는지 확인합니다.
-
테넌트를 배포 및 데이터 위치에 매핑
테넌트 맵을 사용하여 배포 및 데이터 위치를 확인합니다.
-
테넌트 컨텍스트 설정
데이터베이스 세션에 테넌트 컨텍스트를 설정하여 행 정책 또는 스키마 선택이 자동으로 적용되도록 합니다.
-
컨텍스트 전파
백그라운드 잡, 이벤트, 캐시 키, 로그, 메트릭, AI 검색 호출에 컨텍스트를 전파합니다.
-
권한 확인
테넌트와 해당 테넌트 내 사용자의 역할 모두로 권한을 확인합니다.
대부분의 테넌트 데이터 유출은 한 곳에서 단계가 누락되어 발생합니다. 컨텍스트 없는 백그라운드 잡, 테넌트 접두사 없는 캐시 키, 또는 요청의 테넌트 ID를 신뢰한 관리자 엔드포인트가 그 예입니다.
빌링 및 미터링 아키텍처
멀티테넌트 SaaS의 빌링은 단일 통합이 아닌 파이프라인입니다.
| 단계 | 구성 요소 | 설계 참고사항 |
|---|---|---|
| 사용 이벤트 | 애플리케이션이 테넌트 및 기능별 이벤트를 발행 | 오늘 가격이 정액제라도 첫 번째 릴리스부터 발행 |
| 미터링 | 이벤트를 테넌트 및 기간별 사용량으로 집계 | 멱등성: 재시도된 이벤트가 이중 청구되지 않아야 함 |
| 엔타이틀먼트 | 각 테넌트가 사용할 수 있는 것과 한도를 결정 | 코드는 플랜 이름이 아닌 엔타이틀먼트를 확인 |
| 레이팅 | 사용량 및 플랜에 가격을 적용 | 설정으로 관리하여 가격 변경 시 릴리스 불필요 |
| 인보이싱 및 결제 | 빌링 또는 결제 제공업체가 청구 및 인보이스 처리 | 카드 데이터는 제공업체에 보관 |
| 매출 리포팅 | 매출, 이탈, 결제 실패에 대한 재무 뷰 | 미터링과 동일한 데이터 기반으로 구축 |
| AI 사용량 | 테넌트 및 기능별 모델 호출 및 토큰 | 엔타이틀먼트로 제한하여 한 테넌트가 플랜 마진을 소비하지 못하도록 |
-
테넌트별 정액 구독
엔타이틀먼트와 빌링 라이프사이클 필요; 미터링은 테넌트별 비용에도 유용
-
시트별
테넌트별 신뢰할 수 있는 사용자 수와 기간 중 변경 규칙 필요
-
사용량 기반
정확하고 멱등적인 미터링과 고객에게 표시되는 사용량 필요
-
하이브리드(기본 요금 + 사용량)
위의 모든 것과 명확한 한도 및 초과 규칙 필요
AI 기능: 데이터 격리 및 테넌트별 모델 비용
어시스턴트, AI 검색, 요약은 대부분의 화면보다 한 요청에서 더 많은 테넌트 데이터를 읽으므로 동일한 경계가 동일한 장소에서 적용되어야 합니다. AI 거버넌스는 이를 뒷받침하는 정책을 설정합니다.
- 프롬프트 외부에서 검색을 필터링합니다. 검색 서비스는 세션 컨텍스트의 테넌트 및 사용자 권한을 적용합니다. "이 고객의 데이터만 사용하라"는 프롬프트 지시는 격리가 아닙니다.
- 모든 AI 캐시를 테넌트별로 키를 지정합니다. 테넌트 키 없는 캐시된 답변과 임베딩은 한 고객의 콘텐츠를 다른 고객에게 반환할 수 있습니다.
- 공유 학습에서 테넌트 데이터를 제외합니다. 한 테넌트의 데이터로 공유 모델을 파인튜닝하지 않으며, 요청에 대한 학습을 제외하는 조건의 모델 제공업체를 선택합니다. 규제 테넌트는 지역 또는 전용 모델 배포가 필요할 수 있습니다.
- 테넌트별 모델 비용을 미터링합니다. 토큰과 호출은 테넌트 간에 크게 다릅니다. 기능별로 속성을 지정하고 엔타이틀먼트를 통해 한도를 적용합니다.
- 오프보딩 시 삭제합니다. 탈퇴하는 테넌트의 임베딩, 인덱스, 로깅된 프롬프트는 데이터베이스 행과 함께 삭제됩니다.
확장 선택
| 선택 | 사용 시점 | 비용 및 복잡성 |
|---|---|---|
| 공유 배포를 수직 및 수평으로 확장 | 유사한 테넌트로 초기 성장 중 | 가장 낮음; 공유 리소스 한계 주의 |
| 여러 데이터베이스에 테넌트 샤딩 | 단일 데이터베이스가 한계에 도달 중 | 중간; 테넌트 맵과 크로스 샤드 리포팅 필요 |
| 배포 스탬프 추가 | 지역 또는 테넌트 수 증가가 단일 스택을 초과 | 높음; 자동화된 프로비저닝 및 릴리스 필요 |
| 대형 테넌트를 전용 리소스로 이동 | 한 테넌트가 부하를 지배하거나 격리 필요 | 테넌트별; 검증된 마이그레이션 경로 필요 |
| 노이지 네이버 제어 | 항상 | 낮음; 속도 제한, 테넌트별 할당량, 공정한 잡 스케줄링 |
테넌트 마이그레이션 경로를 일찍 계획합니다. 테넌트의 데이터가 공유 데이터베이스에서 전용으로 이동하는 방법, 트래픽 전환 방법, 결과 검증 방법을 미리 설계하는 것이 나중에 즉흥적으로 고안하는 것보다 훨씬 쉽습니다.
운영: 릴리스, 마이그레이션, 복구
- 링 방식으로 릴리스합니다. 내부 테넌트에 먼저 배포하고, 소수의 고객, 그 다음 전체 고객 순으로 테넌트별 피처 플래그를 사용하여 출시합니다.
- 플리트 전체의 스키마 마이그레이션을 자동화합니다. 테넌트별 스키마 또는 데이터베이스의 경우, 하나의 릴리스가 수많은 마이그레이션을 의미합니다. 어떤 테넌트가 어떤 버전에 있는지 추적합니다.
- 플랫폼 전체가 아닌 단일 테넌트를 복구합니다. 고객은 단일 테넌트의 데이터 복구를 요청할 것입니다. 요청이 오기 전에 테스트해 두십시오.
- 테넌트별 비용을 측정합니다. 미터링과 클라우드 청구서를 결합하여 어떤 테넌트와 플랜이 비용을 충당하는지 파악합니다.
테스트 증거: 테스트해야 할 항목
이것은 특정 프로젝트의 결과가 아닌 일반 엔지니어링 관행입니다:
- 크로스 테넌트 접근 테스트. 다른 테넌트의 데이터를 읽거나 변경하려는 모든 엔드포인트와 잡에 대해 실패해야 하는 자동화된 테스트.
- 행 정책 테스트. 테넌트 컨텍스트 없이 실행된 쿼리는 애플리케이션의 데이터베이스 역할 하에서도 행을 반환하지 않아야 합니다.
- 노이지 네이버 부하 테스트. 한 테넌트가 높은 부하를 생성하는 동안 다른 테넌트의 응답 시간을 측정합니다.
- 단일 테넌트 복구 테스트. 깨끗한 환경에 백업에서 한 테넌트를 복구하고 레코드를 비교합니다.
- 미터링 테스트. 재생된 이벤트와 중복된 이벤트가 동일한 사용량 합계를 생성해야 합니다.
- 크로스 테넌트 AI 테스트. 다른 테넌트의 레코드에 대해 질문받은 어시스턴트는 캐시된 답변을 포함하여 아무것도 찾지 못해야 합니다.
더 광범위한 검사는 SaaS 보안 체크리스트에 있습니다.
사례: Printcart
Printcart는 Netbase의 5개 비즈니스 사업부 중 하나로, 온라인 주문을 인쇄 준비 파일과 라우팅된 이행으로 전환하는 웹투프린트 및 온디맨드 인쇄 플랫폼입니다. 판매자 자체 스토어 또는 Shopify, Wix, WooCommerce 앱으로 실행되며, 약 7일의 설정 기간으로 2,000개 이상의 스토어를 지원합니다. 하나의 제품에서 이렇게 많은 판매자를 지원하는 것이 이 아티클에서 설명하는 멀티테넌트 문제입니다. 각 판매자는 공유 플랫폼에서 자체 카탈로그, 주문, 스토어 연결이 필요합니다. Printcart 포트폴리오 레코드에서 Netbase JSC가 엔지니어링하고 운영하는 내용을 다루며, 인쇄 및 패키징에서 섹터 컨텍스트를 확인할 수 있습니다.
자체 제품 외에도, Netbase JSC는 2020년부터 중소기업에 SaaS로 판매되는 미국 고객의 멀티테넌트 클라우드 ERP(고객 이름 비공개)의 오프쇼어 개발 및 관리 파트너로 활동하고 있습니다.
Netbase JSC의 멀티테넌트 구축 접근 방식
Netbase JSC는 AWS, Google Cloud, DigitalOcean, Cloudflare와 함께 작업합니다. 클라우드 파트너 티어나 클라우드 인증은 주장하지 않습니다. 일반적인 타임라인은 SaaS MVP의 경우 8~12주, 중간 규모 제품의 경우 3~6개월, 엔터프라이즈 플랫폼의 경우 범위에 따라 6~12개월 이상입니다. 이는 범위이지 견적이 아닙니다. 보안은 첫 번째 스프린트부터 설계에 포함됩니다. 보안 코드 리뷰, 전송 중 TLS 및 저장 시 AES, 역할 기반 접근 제어, 관리자 대시보드 MFA, 취약점 스캐닝, 재해 복구 계획이 포함됩니다. AI 모델은 제품별로 선택하며 특정 벤더에 종속되지 않습니다. SaaS 개발 서비스가 제품을 구축하며, SaaS 제품 액셀러레이터는 계정, 테넌트, 역할, 빌링을 위한 재사용 가능한 모듈에서 시작합니다.
이 아티클의 한계
- 일반적인 패턴과 일반 관행을 설명합니다. 올바른 조합은 테넌트, 데이터, 지역 및 고객 계약에 따라 다릅니다.
- 인용된 AWS 백서는 AWS에 의해 역사적 참조로 표시되어 있습니다. 격리 원칙은 여전히 널리 사용되지만, 서비스 세부 사항은 현재 AWS 가이드를 확인하십시오.
- PostgreSQL은 데이터베이스 강제 격리의 한 예로 사용되며, 다른 데이터베이스는 다른 메커니즘을 제공합니다.
- 타임라인은 일반적인 범위입니다. Printcart는 공개된 제품 정보를 바탕으로 설명되며, 여기서는 성능 지표를 주장하지 않습니다.
다음 단계
테넌트 프로필, 데이터 민감도, 가격 모델을 공유해 주시면, 첫 번째 릴리스를 위한 격리 및 빌링 설계를 선택할 솔루션 리뷰를 예약하겠습니다. 관련 서비스를 확인하거나 더 많은 Netbase JSC 인사이트를 살펴볼 수도 있습니다.
관련 서비스 및 솔루션
자체 SaaS를 운영하는 팀의 AI 지원 SaaS 개발
Netbase는 창업자와 제품 팀이 고객이 기꺼이 비용을 지불하는 AI 기능을 갖춘 멀티테넌트 구독 소프트웨어를 출시하고 확장할 수 있도록 SaaS 개발 서비스를 제공합니다. 자체 SaaS 플랫폼인 Printcart와 AI 기반 Cloodo 워크플레이스를 직접 구축·운영하며, 그 경험을 클라이언트 제품에 적용합니다. 일반적인 SaaS MVP는 범위, 연동 및 검토 속도에 따라 8~12주가 소요됩니다.
더 알아보기
SaaS 제품 액셀러레이터: 검증된 Netbase JSC 모듈로 AI 지원 SaaS 출시
SaaS 제품 액셀러레이터는 계정, 결제, 역할 및 통합을 위한 재사용 가능한 Netbase JSC 모듈 세트로, 창업자와 제품 팀이 구독형 소프트웨어를 더 빠르게 출시하고 첫 번째 릴리스부터 인앱 AI를 도입할 수 있도록 지원합니다. 이 모듈을 재사용하면 개발 기간을 최대 60% 단축할 수 있으며, 이 접근 방식은 Netbase JSC의 자체 웹투프린트 SaaS인 Printcart를 통해 검증되었습니다.
더 알아보기
Netbase와 원격으로 협력하기
Netbase의 모든 프로젝트는 원격으로 진행되므로, 어느 국가, 어느 산업의 고객도 함께 일할 수 있습니다. Netbase는 80개국 고객과 협력해 왔습니다. 계약 및 청구서는 Netbase JSC 명의로 발행되며, 결제는 Netbase JSC 법인 계좌 또는 PayPal Business로 이루어집니다. CEO Huy Nguyen(David)에게 WhatsApp 또는 이메일로 문의하세요.
프로젝트 논의하기
Netbase JSC는 조직이 디지털 제품과 AI 기반 비즈니스 시스템을 설계, 구축, 현대화, 운영할 수 있도록 지원합니다.project@netbasejsc.com
+84 937 869 689
91 Nguyen Chi Thanh, Dong Da, Hanoi, Vietnam
연락하기
구축, 현대화 또는 운영하고 싶은 내용을 알려주세요.