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 구성