창업교육·창업컨설팅 기업을 위한 멀티테넌트 B2B SaaS — 프로젝트 관리부터 전자결재까지, 한 번에.
- 설계 기준: 설계문서 v1.8 · Phase 1 실행계획서 v1.4
- 작업 규칙: CLAUDE.md (멀티테넌시·민감정보·발송 분리 등 하드 규칙 포함)
| 영역 | 선택 |
|---|---|
| 프레임워크 | Next.js 14 App Router + TypeScript (strict) |
| 스타일 | Tailwind CSS + shadcn/ui (수동 벤더링) + Pretendard |
| DB / 인증 | Supabase (서울 리전) — RLS 멀티테넌시, tenant_id는 JWT app_metadata |
| 호스팅 | Vercel |
npm install
cp .env.example .env.local # Supabase 키·base URL 입력
npm run devDB 스키마는 supabase/migrations/의 SQL을 Supabase 프로젝트(서울 리전)에 순서대로 적용한다.
- 업무·광고 SMS: 테넌트별 BYO 공급자 — 각 테넌트가 공급자(솔라피/알리고/NHN 등)와
자사 API 키·발신번호를 등록해 발송 (어댑터 +
tenant_sms_configs, 단계 14). - 인증 OTP(전문가 로그인·등록): 전역 발송 — Supabase Send SMS Hook
(
supabase/functions/send-sms-hook) → 플랫폼 운영사(넥스트랩) 솔라피 계정. 솔라피 실연동 배포 완료 — Function Secrets(SOLAPI_API_KEY/SECRET/SENDER, SEND_SMS_HOOK_SECRET) 설정 시 실발송, 미설정 시 명시적 오류. 개발·테스트는 대시보드 Test Phone Numbers로 진행한다(Hook 미경유). - 신규 전문가 가입은 등록 링크(
/j)로만 이뤄지며 로그인 OTP는 기존 계정에만 발송된다(shouldCreateUser=false).
직원·관리자 계정은 셀프 가입이 없다. 첫 플랫폼관리자만 수동으로 만든다:
- Supabase 대시보드 → Authentication → Users → Add user (이메일·비밀번호)
- SQL Editor에서 역할 스탬핑:
update auth.users set raw_app_meta_data = coalesce(raw_app_meta_data, '{}'::jsonb) || '{"role":"platform_admin"}'::jsonb where email = '관리자이메일';
/login로그인 →/platform-admin에서 테넌트 생성 시작
이후 테넌트·기업총괄관리자·직원 계정은 전부 화면에서 생성한다.
플랫폼 기능은 "공통 기반 + 선택 모듈 3축"으로 나뉘며, 각 테넌트는 모듈을 하나만 쓰거나 조합해 쓸 수 있다 (CLAUDE.md 1-2).
| 축 | 내용 |
|---|---|
| 공통 기반 (항상 활성) | 계정·권한, 테넌트 설정, 발송 인프라, 감사로그 |
experts |
전문가 섭외·관리 — 풀·등록·서류·섭외·지급/세무 |
approvals |
품의·전자결재 — 품의서·결재라인·전결규정·대결 |
operations |
프로젝트·행사 운영 — 21스텝·일정·공개링크 |
활성 여부는 tenants.feature_flags.modules(JSONB)로 관리하며 미설정 시 전부
활성이다. 모듈 게이트는 서버에서 강제한다 (lib/modules).
| 경로 | 대상 |
|---|---|
/ |
랜딩페이지 (Claude Design v2 시안) |
/{tenant-slug}/dashboard |
직원·관리자 대시보드 |
/{tenant-slug}/admin/org |
기업총괄관리자 |
/platform-admin |
플랫폼관리자 (전역) |
/expert |
전문가 포털 (전역 — 테넌트 비종속) |
/e /j /d /u + /{token} |
공개 매직링크 (섭외동의·전문가등록·서류제출·수신거부) |
테넌트 슬러그는 영문 소문자 kebab-case만 허용하며 a~z 단일 문자 26개 전부와
시스템 경로가 예약어로 차단된다 (lib/routing/reserved-slugs.ts).
- 단계 1 — 프로젝트 초기화 (TS strict, shadcn/ui, Pretendard)
- 단계 2 — Supabase 클라이언트 3종 + tenant_id 주입 구조
- 단계 3 — 라우팅 셸 + 공개 경로 + 슬러그 검증 + 디자인 토큰 + 랜딩 포팅
- 단계 4 — DB 1차 마이그레이션 + RLS (로컬 PG16에서 격리 검증 완료, 원격 적용 완료)
- 단계 5 — 인증 흐름 (직원 이메일
/login· 전문가 휴대폰 OTP/expert/login· 미들웨어+레이아웃 이중 가드) - 단계 6 — 전문가 소유 신원 모델 (등록 링크
/j/{token}· 기업 전문가 목록 · 전문가 포털 프로필/연결 · 활성 테넌트 전환) - 단계 6.5 — 기능 모듈 구조 (테넌트별 experts/approvals/operations 선택 사용,
lib/modules) - 단계 7 — 서류함 (비공개 버킷·만료 서명 URL·기업별 열람 허용·전 건 열람 로그. 자동파기 스케줄러는 단계 16)
- 단계 8 — 테넌트 생성(모듈 조합 선택)·직원 계정·직급 관리 (임시 비밀번호 1회 표시, 초대 메일은 단계 14)
- 단계 9 — 프로젝트 기본 구조 (사업연도 축·기본 21스텝 라이프사이클·스텝 상태 관리)
- 단계 10 — 전자결재 엔진 (전결규정 자동 라인·병렬 합의·대결 병기·재상신 연결·규정 개정 이력)
- 단계 11 — 전문가 섭외 (experts↔operations 연동 — 전용 연결 테이블·공개 /e 동의 링크·포털 섭외함·수락=계약 성립)
- 단계 12 — 일괄 지급·지급 품의 (experts↔approvals 연동 — 소득유형별 원천징수 참고 계산·프로젝트별 일괄 품의·승인→확정 동기화)
- 단계 13 — 엑셀 내보내기(전문가·직원·프로젝트·결재·지급 5종, SheetJS) + 대시보드 통계(사업연도 축·모듈별 카드)
- 단계 14 — 발송 인프라 (BYO 공급자 어댑터·API 키 암호화·유형 분리 서버 강제·수신거부
/u·OTP Hook 솔라피 실연동·Resend. 예약 발송은 단계 16 스케줄러와 함께) - 단계 15~19 — 실행계획서 참조
app/globals.css의 CSS 변수로 관리한다. --brand-*는 테넌트 화이트라벨
런타임 주입 지점이므로 컴포넌트에 색상값을 하드코딩하지 않는다.
| 토큰 | 값 | 용도 |
|---|---|---|
--brand |
#246BFF |
프라이머리 블루 |
--brand-navy |
#0B1D3A |
딥 네이비 |
--brand-sky |
#6CA8FF |
라이트 블루 |
--brand-amber |
#FFB000 |
앰버 |