mtxs 없이 SaaS가 될까? — CAP Multi-tenancy 설정 #shorts #SAP #CAP
Moderator
· 조회 2
이 글이 답하는 질문
- CAP Node.js 앱을 SaaS로 만들려면 무엇이 필요한가?
@sap/cds-mtxs가 하는 일은 무엇인가?- 테넌트 구독(Subscribe)부터 데이터 격리까지 어떻게 동작하는가?
Single-tenant vs Multi-tenant
단일 테넌트 CAP 앱은 DB가 하나고 모든 사용자가 같은 스키마를 공유한다. SaaS로 배포하려면 고객(테넌트)마다 DB 스키마를 분리해야 한다. CAP는 @sap/cds-mtxs(MTX Streamlined) 패키지로 이 전환을 지원한다.
직접 해보기
1. mtxs 설치 및 package.json 설정
npm add @sap/cds-mtxs
// package.json
{
"cds": {
"requires": {
"multitenancy": true,
"auth": { "kind": "xsuaa" }
}
}
}
2. mtxs 사이드카 서비스 추가
CAP 4.x부터 mtxs는 별도 sidecar 마이크로서비스로 분리 배포를 권장한다. mtx/sidecar 디렉토리에 최소 패키지만 포함해 독립 배포한다.
// mtx/sidecar/package.json
{
"dependencies": {
"@sap/cds": "*",
"@sap/cds-mtxs": "*",
"@sap/cds-dk": "*"
},
"cds": {
"profile": "mtx-sidecar"
}
}
3. 테넌트 구독 흐름
SaaS Registry가 고객 구독 시 PUT /-/cds/saas-provisioning/tenant/{tenantId}를 호출한다. mtxs는 자동으로 HANA 스키마를 생성하고 CDS 마이그레이션을 실행한다.
// 테넌트별 DB HDI 컨테이너 자동 생성
// 수동 provisioning hook 추가 예시
const { mtx } = require('@sap/cds-mtxs')
mtx.on('provisioned', async ({ tenant }) => {
console.log(`Tenant ${tenant} ready`)
})
4. 테넌트 격리 확인
런타임에서 cds.context.tenant로 현재 테넌트 ID를 확인할 수 있다. CAP ORM이 자동으로 해당 HANA 스키마로 DB 커넥션을 라우팅한다.
this.before('READ', 'Orders', async req => {
const tenant = req.user.tenant // JWT에서 추출
// CAP가 알아서 tenant DB로 쿼리 전달
})
삽질 노트
multitenancy: true만 설정하고 xsuaa 바인딩 안 하면 로컬에서도 테넌트 컨텍스트가 undefined- mtxs sidecar를 메인 앱과 같은 컨테이너에 넣으면 Scale-out 시 각 인스턴스가 이중으로 provisioning 요청을 처리해 충돌 발생
- HANA 없이 SQLite로 로컬 멀티테넌시 테스트 시
cds.requires.db.kind: "sqlite"에서 schema-per-tenant 미지원 —in-memory모드로만 동작
핵심 한 줄
CAP Multi-tenancy = @sap/cds-mtxs + xsuaa + mtxs sidecar. 이 셋이 없으면 SaaS 배포 불가.
더 파볼 주제
- CDS 모델 확장성(Extensibility) — 테넌트별 커스텀 필드 추가
- HANA HDI 컨테이너 라이프사이클 관리
- SAP BTP SaaS Registry 구성