테넌트 모듈
테넌트 모듈은 Lumie 플랫폼의 멀티테넌시를 관리하는 핵심 모듈입니다. 학원(테넌트) 등록, 테넌트별 설정 관리를 담당합니다. 2026-05-12 RLS 전환 이후 테넌트 프로비저닝은 public.tenants 안에서 끝나며, 별도 스키마 생성이나 Flyway 동적 실행은 없습니다.
서비스 개요
- 배포: lumie-backend 모놀리스의
modules/tenant - 데이터베이스: PostgreSQL
public스키마 (테넌트 메타데이터) - 주요 연동:
TenantCreatedEvent발행, billing 모듈의 after-commit 리스너가 구독 생성 처리
주요 기능
1. 테넌트 관리
- 테넌트 생성, 조회, 수정
- 테넌트 상태 관리 (PENDING → PROVISIONING → ACTIVE)
- 슬러그 기반 테넌트 식별
2. 테넌트 프로비저닝
public.tenants저장과 상태 전이로 완료 (스키마 생성 없음)- PENDING → PROVISIONING → ACTIVE 상태 머신 유지 (빌링 훅 시점 확보 목적)
- 프로비저닝은 사실상 즉시 완료 (별도 비동기 작업 불필요)
3. 테넌트 설정
- 학원명, 대표 연락처, 주소 관리
- 학원 로고 오브젝트 키 관리
- 커스텀 ID 관리
- 커스텀 도메인 공개 조회용 값 보관
- 관리자 사이드바 숨김 메뉴 목록 관리
헥사고날 아키텍처
modules/tenant/src/main/java/com/lumie/tenant/
├── adapter/
│ ├── in/web/ # REST 컨트롤러 (TenantController)
│ ├── in/internal/ # TenantService 구현체
│ └── out/{persistence,storage}/ # JPA 저장소, 로고 스토리지 어댑터
├── application/
│ ├── service/ # TenantCommandService, TenantRegistrationService
│ └── port/out/ # TenantPersistencePort
└── domain/
└── entity/Tenant.java # extends BaseEntity (public.tenants, RLS 미적용)
테넌트 프로비저닝
흐름 (RLS 전환 이후)
스키마 생성(CREATE SCHEMA)과 Flyway 동적 실행은 없습니다. PENDING → PROVISIONING → ACTIVE 상태 머신은 유지하지만, billing 모듈은 직접 호출하지 않고 TenantCreatedEvent를 after-commit 리스너로 소비합니다.
TenantCommandService
TenantCommandService는 REST 경로의 생성, 수정, 삭제, 정지, 재활성화 명령을 처리합니다. 생성 시 Tenant.create(...)로 PENDING 테넌트를 저장한 뒤 startProvisioning()과 activate()를 호출하고, TenantCreatedEvent를 발행합니다. 원장 가입 경로는 TenantServiceAdapter를 통해 TenantRegistrationService.registerTenant(...)를 호출하며, 같은 상태 전이와 저장 흐름을 사용합니다.