멀티테넌시
📝 초안 (Draft)
이 문 서는 검토 중입니다. 내용이 변경될 수 있습니다.
Multi-SaaS Kit의 멀티테넌시 아키텍처와 테넌트 관리 방법을 설명합니다.
개요
**멀티테넌시(Multi-tenancy)**란 하나의 애플리케이션 인스턴스에서 여러 고객(테넌트)을 서비스하는 아키텍처입니다. 각 테넌트의 데이터는 완전히 격리되어 다른 테넌트가 접근할 수 없습니다.
┌─────────────────────────────────────────────────────────────────┐
│ Multi-SaaS Kit 플랫폼 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────── ┐ ┌───────────────┐ ┌───────────────┐ │
│ │ Tenant A │ │ Tenant B │ │ Tenant C │ │
│ │ (회사 A) │ │ (회사 B) │ │ (회사 C) │ │
│ ├───────────────┤ ├───────────────┤ ├───────────────┤ │
│ │ 사용자 │ │ 사용자 │ │ 사용자 │ │
│ │ 데이터 │ │ 데이터 │ │ 데이터 │ │
│ │ 설정 │ │ 설정 │ │ 설정 │ │
│ └───────────────┘ └───────────────┘ └───────────────┘ │
│ 🔒 🔒 🔒 │
│ 격리됨 격리됨 격리됨 │
└──────────────────── ─────────────────────────────────────────────┘
테넌트란?
테넌트는 플랫폼의 고객 단위입니다. 일반적으로 회사, 조직, 또는 구독자를 나타냅니다.
| 용어 | 설명 | 예시 |
|---|---|---|
| 테넌트 | 서비스를 이용하는 고객 단위 | 회사 A, 학교 B |
| 테넌트 관리자 | 테넌트를 관리하는 사용자 (Level 2) | 회사 A의 관리자 |
| 테넌트 멤버 | 테넌트에 소속된 일반 사용자 | 회사 A의 직원 |
격리 방식
Multi-SaaS Kit은 단일 데이터베이스 + RLS(Row-Level Security) 방식을 사용합니다.
격리 방식 비교
| 방식 | 설명 | 장점 | 단점 |
|---|---|---|---|
| 별도 데이터베이스 | 테넌트마다 DB 분리 | 완전한 격리 | 관리 복잡, 비용 높음 |
| 별도 스키마 | 테넌트마다 스키마 분리 | 격리 보장 | 마이그레이션 복잡 |
| RLS (채택) | 단일 DB + 행 수준 보안 | 효율적, 간단 | 정책 설계 중요 |
RLS 방식의 장점
- 단순한 인프라: 하나의 DB만 관리
- 효율적 리소스: 커넥션 풀 공유
- 간편한 마이그레이션: 모든 테넌트에 동시 적용
- 유연한 확장: 테넌트 수 제한 없음
테넌트 식별
테넌트는 다양한 방식으로 식별할 수 있습니다.
지원하는 식별 방식
| 방식 | 예시 | 설정 |
|---|---|---|
| 서브도메인 | company-a.app.com | 도메인 설정 필요 |
| 경로 기반 | app.com/tenant/company-a | 기본 제공 |
| 헤더 기반 | X-Tenant-ID: 123 | API 용 |
| 도메인 | company-a.com | 커스텀 도메인 |
테넌트 컨텍스트
현재 테넌트는 자동으로 감지되어 컨텍스트에 저장됩니다.
// 현재 테넌트 가져오기
$tenant = app('current.tenant');
// 테넌트 ID 확인
$tenantId = $tenant->getId();
// 테넌트 이름
$tenantName = $tenant->name;
사용자 기반 자동 감지
로그인한 사용자의 tenant_id를 통해 자동으로 테넌트가 설정됩니다.
// 사용자의 테넌트 ID
$user->tenant_id;
// 사용자가 속한 테넌트
$user->tenant;