notes(hjjeong): cross-tenant 27/28.md 현재 상태 반영 (2026-04-29)
설계 27.md - 상단 최종 갱신 + 실행 로그 링크 + Phase A/B/C 완료 배너 - §10 단계별 체크리스트: A 4/5, B 3/4, C 3/14, 페이지네이션 cap ✓, D 미진행, E 일부 - §11 검증 시나리오: 5개 시나리오 상태 표 + TEST01 실 검증 결과 인용 - §14 다음 세션 진입 시: 즉시 가능한 4개 작업 우선순위 (TEST02 fan-out 검증 1순위) - gbpark/ 의 2026-04-24 두 문서 참조를 ../gbpark/ 로 보정 실행 로그 28.md - 상단 최종 갱신 + 핸드오프 문서 참조 - TL;DR: 푸시·커밋 안 함 → 3 커밋 푸시 완료, TEST02 활성 명기 - §4.4 신규 — *.localhost 라우팅이 같은 커밋 배치에 묶인 사실 + 2026-04-29 검증 결과 - §5: 워킹트리 → 3개 커밋 분배 의도 표 - §6: 권장 단계 8개 → 9개 (Gitea PR 추가), 각 항목 ✅/🟡/⏳/❌ 표기 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,8 +1,13 @@
|
||||
# Cross-Tenant 어드민 합산 설계 (SUPER_ADMIN 전사 보기)
|
||||
|
||||
작성일: 2026-04-27
|
||||
최종 갱신: 2026-04-29 — Phase A/B/C 구현·커밋 완료 표시, 검증 시나리오에 실제 결과 반영
|
||||
작성자: hjjeong
|
||||
관련: [docs/MULTI_TENANCY_ARCHITECTURE.md](../../docs/MULTI_TENANCY_ARCHITECTURE.md), [notes/gbpark/2026-04-24-company-db-provisioning-execution-plan.md](2026-04-24-company-db-provisioning-execution-plan.md), [notes/gbpark/2026-04-24-company-mgmt-ui-schema.md](2026-04-24-company-mgmt-ui-schema.md)
|
||||
관련: [docs/MULTI_TENANCY_ARCHITECTURE.md](../../docs/MULTI_TENANCY_ARCHITECTURE.md), [notes/gbpark/2026-04-24-company-db-provisioning-execution-plan.md](../gbpark/2026-04-24-company-db-provisioning-execution-plan.md), [notes/gbpark/2026-04-24-company-mgmt-ui-schema.md](../gbpark/2026-04-24-company-mgmt-ui-schema.md)
|
||||
실행 로그: [2026-04-28-cross-tenant-execution-log.md](2026-04-28-cross-tenant-execution-log.md)
|
||||
|
||||
> **상태 (2026-04-29):** Phase A/B/C 구현·검증·커밋 완료 (`hjjeong` 브랜치 `e16fb169`).
|
||||
> Phase D/E 미진행. 자세한 진행 현황·미진행 항목·커밋 분배 의도는 실행 로그 §5~§6 참조.
|
||||
|
||||
---
|
||||
|
||||
@@ -362,52 +367,78 @@ const editUrl = `https://${row.subdomain}.invyone.com/admin/userMng/userMngList?
|
||||
|
||||
---
|
||||
|
||||
## 10. 단계별 실행 체크리스트
|
||||
## 10. 단계별 실행 체크리스트 (2026-04-29 갱신)
|
||||
|
||||
### Phase A — 인프라 (최소)
|
||||
### Phase A — 인프라 (최소) — ✅ 완료
|
||||
|
||||
- [ ] `CrossTenantContext` (가드 클래스)
|
||||
- [ ] `CrossTenantAggregator` (직렬, cache off)
|
||||
- [ ] `mapper/provisioning.xml` 에 `listActiveCompanies` 추가
|
||||
- [ ] `SecurityConfig` 에 `/api/admin/cross-tenant/**` SUPER_ADMIN 가드
|
||||
- [ ] `CrossTenantController` 빈 컨트롤러 + 1개 엔드포인트 (`/users`)
|
||||
- [x] `CrossTenantContext` (가드 클래스) — boolean 반환식으로 구현 (실행로그 §1)
|
||||
- [x] `CrossTenantAggregator` (직렬, cache off)
|
||||
- [x] `mapper/provisioning.xml` 에 `listActiveCompanies` 추가
|
||||
- [ ] ~~`SecurityConfig` 에 `/api/admin/cross-tenant/**` SUPER_ADMIN 가드~~ — **의도적 미적용**. 95개 컨트롤러 회귀 위험 → 컨트롤러 레벨 `@RequestAttribute("role")` 검사로 대체 (실행로그 §1 표)
|
||||
- [x] `CrossTenantController` 빈 컨트롤러 + 1개 엔드포인트 (`/users`)
|
||||
|
||||
### Phase B — PoC: 사용자관리
|
||||
### Phase B — PoC: 사용자관리 — ✅ 부분 완료
|
||||
|
||||
- [ ] `mapper/admin-cross-tenant.xml` + `listUsers` SELECT
|
||||
- [ ] `/api/admin/cross-tenant/users` 동작 확인 (개발 회사 2~3개 띄워놓고)
|
||||
- [ ] 프론트 사용자관리 페이지에 host 분기 (admin.invyone.com → cross-tenant API 호출)
|
||||
- [ ] 회사 컬럼 + 회사 필터 드롭다운 추가
|
||||
- [x] `mapper/admin-cross-tenant.xml` + `listUsers` SELECT
|
||||
- [x] `/api/admin/cross-tenant/users` 동작 확인 (TEST01 1개 회사 / 8명)
|
||||
- [x] 프론트 사용자관리 페이지에 host 분기 (`isCrossTenantMode()` 헬퍼로 분기)
|
||||
- [~] 회사 컬럼 — `UserTable.tsx` 에 컬럼 정의 이미 있어 데이터만 박히면 자동 표시 / 회사 필터 드롭다운은 미구현
|
||||
|
||||
### Phase C — 14개 메뉴 확산
|
||||
### Phase C — 14개 메뉴 확산 — 🟡 일부 완료 (3/14, 4 보류, 7 미진행)
|
||||
|
||||
- [ ] 위 4.3 표 순서대로 mapperId + 프론트 분기 추가
|
||||
- [ ] 키 충돌 정책 (`company_code::pk`) 일괄 적용
|
||||
- [ ] 행 클릭 → 회사 도메인 새 탭 오픈 패턴 구현
|
||||
- [x] 권한그룹관리 (`/cross-tenant/roles`, TEST01 1건)
|
||||
- [x] 배치관리 (`/cross-tenant/batches`, TEST01 10건)
|
||||
- [x] 다국어 키관리 (`/cross-tenant/lang-keys`, TEST01 646건 → cap 200)
|
||||
- [ ] 메뉴관리 — **보류** (트리 구조 UX 결정 필요)
|
||||
- [ ] 공통코드관리 — **보류** (카테고리 트리 의존)
|
||||
- [ ] 외부 커넥션 관리 — **보류** (메타 JOIN + JSONB cast 다수)
|
||||
- [ ] 화면관리 / POP화면관리 / 대시보드관리 — **보류** (행 수 규모 + 페이지네이션 정책)
|
||||
- [ ] 권한관리 / 테이블 타입관리 / 메일관리 — 미진행
|
||||
- [ ] 키 충돌 정책 (`company_code::pk`) 일괄 적용 — 미진행
|
||||
- [ ] 행 클릭 → 회사 도메인 새 탭 오픈 패턴 — 미진행
|
||||
|
||||
### Phase D — 측정 후 옵셔널
|
||||
### 페이지네이션 cap (설계서 §4.2 / §9.3 보강) — ✅ 완료
|
||||
|
||||
- [x] 회사당 디폴트 cap 200, override 1~2000
|
||||
- [x] `truncated` 플래그 + `truncated_company_codes` 응답
|
||||
- [x] 응답 헤더 `X-CrossTenant-Truncated`
|
||||
- [x] 4개 cross-tenant 엔드포인트 (`/users`, `/roles`, `/batches`, `/lang-keys`) 모두 일원화
|
||||
|
||||
### Phase D — 측정 후 옵셔널 — ⏳ 미진행
|
||||
|
||||
- [ ] `CrossTenantCache` (5분 LRU)
|
||||
- [ ] 병렬 fan-out (`CompletableFuture` + 8 thread pool)
|
||||
- [ ] `companies_failed` 메트릭 노출 (Prometheus)
|
||||
- [ ] N≥50 회사 환경 부하 테스트 (`autocannon` 으로 cross-tenant 엔드포인트 1초 100rps)
|
||||
|
||||
### Phase E — 문서
|
||||
### Phase E — 문서 — 🟡 일부
|
||||
|
||||
- [ ] `docs/MULTI_TENANCY_ARCHITECTURE.md` 9장 "관련 마이그레이션" 표에 082~084 추가 + 본 문서 11장 참조 링크
|
||||
- [ ] `docs/MULTI_TENANCY_ARCHITECTURE.md` 새 섹션 "12. 어드민 cross-tenant 합산" 신설하여 본 문서 요약 + 링크
|
||||
- [x] `docs/MULTI_TENANCY_ARCHITECTURE.md` §4.2 (실행 모드 A/B) + §6 (1-b 분기) — dev `*.localhost` 분 갱신 (`383b837a` 에 포함)
|
||||
|
||||
---
|
||||
|
||||
## 11. 검증 시나리오
|
||||
## 11. 검증 시나리오 (2026-04-29 갱신 — 실 진행 상황 병기)
|
||||
|
||||
### 11.1 행복 경로
|
||||
| 시나리오 | 상태 |
|
||||
|---|---|
|
||||
| 11.1 행복 경로 | 🟡 단일 회사 (TEST01) 만 검증. TEST02 프로비저닝 후 fan-out 2회사 호출은 미진행 |
|
||||
| 11.2 부분 실패 | ⏳ 미검증. fan-out 2회사 검증 후 순차 진행 |
|
||||
| 11.3 권한 | ✅ `super_admin_required` (토큰 없이 호출 → 403) 스모크 통과 (실행로그 §1) |
|
||||
| 11.4 락 비획득 | ⏳ 미검증 |
|
||||
| 11.5 캐시 무효화 | ⏳ N/A — 캐시 미구현 (Phase D) |
|
||||
|
||||
### 11.1 행복 경로 (원안)
|
||||
|
||||
1. 회사 3개 (`qnc`, `kookje`, `topsil`) 활성. 각각 사용자 5명씩.
|
||||
2. SUPER_ADMIN 으로 `https://admin.invyone.com/admin/userMng/userMngList` 진입.
|
||||
3. 응답 `rows.length === 15`, 각 row 에 `company_code` 채워짐.
|
||||
4. 회사 필터 "qnc" 선택 → `?company_codes=COMPANY_QNC` → `rows.length === 5`.
|
||||
|
||||
> **실 검증 (2026-04-28):** TEST01 1개 회사 / 8명 — 행마다 `company_code: "TEST01"`, `companies_queried: 1, companies_failed: 0` 확인.
|
||||
> **다음:** TEST02 도 활성이므로 `companies_queried: 2`, 행에 두 회사 섞임 검증을 기다리는 상태 (즉시 호출 가능, 실행로그 §6 #3).
|
||||
|
||||
### 11.2 부분 실패
|
||||
|
||||
1. `topsil` 회사 DB pg_terminate 로 다운.
|
||||
@@ -420,6 +451,8 @@ const editUrl = `https://${row.subdomain}.invyone.com/admin/userMng/userMngList?
|
||||
1. 일반 `COMPANY_ADMIN` 으로 cross-tenant 엔드포인트 호출 → 403.
|
||||
2. SUPER_ADMIN 인데 회사 도메인(`qnc.invyone.com`) 으로 호출 → 400 `cross_tenant_requires_meta_context`.
|
||||
|
||||
> **실 검증 (2026-04-28):** 토큰 없이 `/api/admin/cross-tenant/_active-companies` 호출 → 403 `super_admin_required` ✓. SUPER_ADMIN 토큰 호출 → 200 ✓.
|
||||
|
||||
### 11.4 락 비획득
|
||||
|
||||
1. 한 회사 풀이 풀 maxPool=5 모두 점유 중.
|
||||
@@ -431,6 +464,8 @@ const editUrl = `https://${row.subdomain}.invyone.com/admin/userMng/userMngList?
|
||||
2. 그 사이 SUPER_ADMIN 이 회사 신규 프로비저닝 (FINALIZE 완료).
|
||||
3. 다음 cross-tenant 호출 시 새 회사가 즉시 반영되는지 확인 (companies snapshot version bump 동작).
|
||||
|
||||
> **N/A:** 캐시 자체가 Phase D 로 미루어진 상태 (1차 구현은 cache off + 직렬, 본 문서 §7.2). 캐시 도입 시 본 시나리오 활성.
|
||||
|
||||
---
|
||||
|
||||
## 12. 미정·후속
|
||||
@@ -458,8 +493,21 @@ const editUrl = `https://${row.subdomain}.invyone.com/admin/userMng/userMngList?
|
||||
|
||||
---
|
||||
|
||||
## 14. 다음 세션 진입 시
|
||||
## 14. 다음 세션 진입 시 (2026-04-29 갱신)
|
||||
|
||||
본 문서가 진실의 원천. 이미 만들어진 [CompanyStatsService.enrichOne()](../../backend-spring/src/main/java/com/erp/provisioning/CompanyStatsService.java) / [CompanyLifecycleService](../../backend-spring/src/main/java/com/erp/provisioning/CompanyLifecycleService.java) 를 참고하되, **새 코드는 raw JDBC 가 아니라 MyBatis sqlSession 을 그대로 쓴다** (TenantRoutingDataSource 가 있기 때문).
|
||||
본 설계 문서는 의도/원칙의 진실의 원천이고, **현재 구현·검증 진행 상황은 [실행 로그](2026-04-28-cross-tenant-execution-log.md) §5~§6 에서 확인.**
|
||||
|
||||
Phase A → B → C 순서 강제. Phase A 끝나기 전에 14개 메뉴 mapper 한번에 짜지 말 것 — Aggregator 가 흔들리면 다 같이 흔들림.
|
||||
Phase A/B/C 의 핵심 (직렬 fan-out + Aggregator + 4개 엔드포인트 + 페이지네이션 cap) 은 `hjjeong` 브랜치 `e16fb169` 에 커밋·푸시 완료.
|
||||
|
||||
### 즉시 가능한 다음 작업 (우선순위 순)
|
||||
|
||||
1. **TEST02 가 활성** 상태이므로 진짜 fan-out (`companies_queried: 2`) 호출 검증 — `/api/admin/cross-tenant/users` 등 4개 엔드포인트에 SUPER_ADMIN 토큰으로 호출, 행에 두 회사 섞이는지 + 실패 격리 확인. 본 설계 §11.1·§11.2 의 첫 실증.
|
||||
2. 화면 측 `truncated === true` 안내 박스 (4개 페이지) — 실행로그 §3.5 의 권장 사용 그대로.
|
||||
3. 보류 4개 메뉴 (메뉴/공통코드/외부커넥션/화면계열) UX 결정 후 mapper 작성.
|
||||
4. Phase D (캐시·병렬) — 회사 N≥20 환경 만든 뒤 측정 후 결정.
|
||||
|
||||
### 새 코드 작성 시 주의
|
||||
|
||||
- 새 코드는 raw JDBC 가 아니라 MyBatis `sqlSession` 을 그대로 쓴다 (`TenantRoutingDataSource` 가 있기 때문). 이미 만들어진 [CompanyStatsService.enrichOne()](../../backend-spring/src/main/java/com/erp/provisioning/CompanyStatsService.java) 의 raw JDBC 패턴은 1세대라 그대로 둔 것.
|
||||
- Phase A → B → C 순서 강제 원칙 유지. Aggregator 가 흔들리면 4개 엔드포인트가 모두 흔들림 — 새 메뉴 mapper 추가 시 `runFanOut(...)` 헬퍼 (실행로그 §3) 에 얹어서 일원화.
|
||||
- 컨트롤러 가드는 `SecurityConfig` 가 아닌 컨트롤러 레벨 `@RequestAttribute("role")` 검사 (실행로그 §1 의 의도된 우회).
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
# Cross-Tenant 어드민 합산 — 실행 로그
|
||||
|
||||
작성일: 2026-04-28
|
||||
최종 갱신: 2026-04-29 — 커밋/푸시 상태 반영, dev `*.localhost` 라우팅 후속 묶음 기재
|
||||
작성자: hjjeong
|
||||
관련 설계: [2026-04-27-cross-tenant-admin-aggregation.md](2026-04-27-cross-tenant-admin-aggregation.md)
|
||||
관련 후속(같은 커밋 배치): [2026-04-28-localhost-tenant-routing-handoff.md](2026-04-28-localhost-tenant-routing-handoff.md)
|
||||
관련 SoT: [docs/MULTI_TENANCY_ARCHITECTURE.md](../../docs/MULTI_TENANCY_ARCHITECTURE.md)
|
||||
|
||||
---
|
||||
@@ -13,7 +15,8 @@
|
||||
- **Phase B (사용자관리 PoC)** — 작성·검증 완료 (TEST01 회사 사용자 8명, `company_code` 정상 주입)
|
||||
- **Phase C (확산)** — 권한그룹/배치/다국어키 3개 작성·검증 완료 (TEST01: 1/10/646 건)
|
||||
- **페이지네이션 cap** — 회사당 디폴트 200, override 1~2000, `truncated` 플래그 응답 (검증 완료)
|
||||
- 푸시 / 커밋 모두 안 함. 모든 변경 워킹트리에 워킹카피 상태로 남음.
|
||||
- **커밋/푸시 완료** (2026-04-28 저녁) — `hjjeong` 브랜치에 3 커밋, `origin/hjjeong` 까지 푸시. base `gbpark-node` 대비 20 ahead / 0 behind
|
||||
- TEST02 회사 프로비저닝됨 — 진짜 fan-out (2회사 머지) 호출 검증은 **미진행** (조건만 충족)
|
||||
|
||||
---
|
||||
|
||||
@@ -196,44 +199,70 @@ fetch("/api/admin/cross-tenant/lang-keys", { headers: { Authorization: `Bearer $
|
||||
|
||||
(`.java-version` 은 jenv 표준 파일이라 커밋 권장 — 다른 Mac 개발자도 자동 21 전환됨. Windows 등에선 무해히 무시됨.)
|
||||
|
||||
---
|
||||
### 부수-4) dev `*.localhost` 테넌트 라우팅 (별도 문서)
|
||||
|
||||
## 5. 워킹트리 상태 (2026-04-28 오후)
|
||||
본 cross-tenant 작업과 한 묶음으로 진행된 dev 환경 패치. 별도 핸드오프 문서로 분리:
|
||||
[2026-04-28-localhost-tenant-routing-handoff.md](2026-04-28-localhost-tenant-routing-handoff.md)
|
||||
|
||||
```
|
||||
M .gitignore
|
||||
M backend-spring/src/main/resources/mapper/provisioning.xml
|
||||
M frontend/app/(auth)/login/page.tsx
|
||||
M frontend/lib/api/batch.ts
|
||||
M frontend/lib/api/multilang.ts
|
||||
M frontend/lib/api/role.ts
|
||||
M frontend/lib/api/user.ts
|
||||
?? .java-version
|
||||
?? backend-spring/src/main/java/com/erp/crosstenant/
|
||||
?? backend-spring/src/main/resources/mapper/admin-cross-tenant.xml
|
||||
?? frontend/lib/auth/crossTenantMode.ts
|
||||
?? notes/gbpark/2026-04-27-cross-tenant-admin-aggregation.md
|
||||
?? notes/gbpark/2026-04-28-cross-tenant-execution-log.md
|
||||
```
|
||||
요지: `qnc.localhost:9771` 같은 dev 호스트도 운영 `*.invyone.com` 과 동일하게 테넌트 DB 로 자동 라우팅되게.
|
||||
|
||||
페이지네이션 cap 추가 작업은 **새 파일 없이** 기존 신규/수정 파일 (admin-cross-tenant.xml, CrossTenant{Aggregator,Controller}.java) 안에서 이루어져 워킹트리 파일 목록 자체는 그대로.
|
||||
- 백엔드 `SubdomainResolverFilter.extractSubdomain()` 가 2파트 `{sub}.localhost` 호스트 인식 (RFC 6761)
|
||||
- 프론트 [client.ts](../../frontend/lib/api/client.ts) 1-b 분기 + [subdomain.ts](../../frontend/lib/tenant/subdomain.ts) 동일 규칙
|
||||
- `application.yml` CORS 디폴트에 `http://*.localhost:[*]` 추가
|
||||
- `SubdomainResolverFilterTest` 8 케이스 신규
|
||||
- 운영 3파트 코드 경로 무변경 (회귀 0)
|
||||
|
||||
푸시·커밋 모두 안 함.
|
||||
검증 (2026-04-29):
|
||||
- 백엔드 단위 테스트 8/8 통과 (bare/IP/베이스/dev 2파트/예약어/3파트 운영)
|
||||
- curl 4종 200 OK (test02.localhost / localhost / test02.invyone.com / nonexistent.localhost)
|
||||
- CORS preflight `Access-Control-Allow-Origin: http://test02.localhost:9771` echo 정상
|
||||
- 프론트 dev server `Host: test02.localhost:9771 → /login` 200
|
||||
- TenantGuard → `nonexistent.localhost` → `{exists:false}` → `/tenant-not-found` 200
|
||||
- 시각적 로그인 (비번 입력 → 강제 변경) 은 사용자 브라우저 검증 영역
|
||||
|
||||
---
|
||||
|
||||
## 6. 권장 다음 단계 (우선순위)
|
||||
## 5. 커밋·푸시 상태 (2026-04-29 갱신)
|
||||
|
||||
| # | 항목 | 비용 | 효용 |
|
||||
`hjjeong` 브랜치, 3 커밋. `origin/hjjeong` 까지 푸시 완료. base `gbpark-node` 대비 **20 ahead / 0 behind**.
|
||||
|
||||
```
|
||||
a6be4f2e 사용자관리 테이블 자체 스크롤 — viewport 기반 max-height 로 강제 (1 file, +5/-6)
|
||||
383b837a dev *.localhost 테넌트 라우팅 + direnv/Java 21 dev 환경 정비 (9 files)
|
||||
e16fb169 어드민 cross-tenant 집계 (SUPER_ADMIN) + 사용자관리 자체 스크롤 (16 files, +1654/-56)
|
||||
```
|
||||
|
||||
### 5.1 커밋 분배 의도
|
||||
|
||||
| 커밋 | 포함 작업 | 비고 |
|
||||
|---|---|---|
|
||||
| `e16fb169` | Phase A/B/C cross-tenant 전체 + 사용자관리 자체 스크롤 1차 + 본 실행 로그 / 설계 문서 두 MD | 본 문서 §1~§3 의 모든 작업 |
|
||||
| `383b837a` | dev `*.localhost` 라우팅 + direnv / Java 21 / `.java-version` / `.gitignore` / `application.yml` CORS / `MULTI_TENANCY_ARCHITECTURE.md` §4.2·§6 갱신 + 단위 테스트 8건 + 핸드오프 MD | 본 문서 §4 부수 작업 + 부수-4 |
|
||||
| `a6be4f2e` | UserTable 스크롤 후속 (viewport 기반 max-height 로 hack) | flex 기반 height 가 shadcn Table wrapper 와 충돌 — 안정화 |
|
||||
|
||||
설계서 §6 권장 #5 ("한 커밋으로 정리") 와 다르게 분리됨. 사유:
|
||||
- cross-tenant 본체와 dev 환경 라우팅은 영향 범위가 다른 도메인. 리뷰·되돌리기 단위가 다름
|
||||
- UserTable 스크롤 hack 은 후속 안정화라 별도 분리
|
||||
|
||||
### 5.2 워킹트리
|
||||
|
||||
이전 워킹카피 모두 커밋 처리됨. 현재 워킹트리는 깨끗 (untracked `.envrc` 만 — `.gitignore` 처리됨).
|
||||
|
||||
---
|
||||
|
||||
## 6. 권장 다음 단계 (2026-04-29 갱신)
|
||||
|
||||
| # | 항목 | 상태 | 비용 / 효용 |
|
||||
|---|---|---|---|
|
||||
| 1 | ~~Phase C 3개 메뉴 검증~~ | ✅ 완료 (2026-04-28 오전) | — |
|
||||
| 2 | ~~페이지네이션 cap 도입~~ | ✅ 완료 (2026-04-28 오후) | — |
|
||||
| 3 | 두번째 회사 프로비저닝 → 진짜 fan-out 효과 (`companies_queried: 2`, 행에 `TEST01` / `TEST02` 섞임) 확인 | 20~30분 | 머지 / 실패격리 동작 검증 |
|
||||
| 4 | 화면 측 `truncated === true` 안내 박스 — "200건 표시 중, 더 보려면 검색 좁히거나 회사 도메인 전환" | 페이지당 10분 × 4 | UX 개선 |
|
||||
| 5 | 전체 변경을 `feat: cross-tenant admin aggregation Phase A/B/C + pagination cap` 한 커밋으로 정리 | 5분 | 리포 위생 |
|
||||
| 6 | 보류 4개 메뉴 UX 설계 — 특히 메뉴관리(트리)와 공통코드(카테고리 의존) | 별도 세션 | 14개 메뉴 완주 |
|
||||
| 7 | Phase D (캐시 / 병렬) — 회사 N≥20 환경 만들어 측정 후 결정 | 별도 세션 | 운영 확장성 |
|
||||
| 8 | Phase E — [MULTI_TENANCY_ARCHITECTURE.md](../../docs/MULTI_TENANCY_ARCHITECTURE.md) §12 신설로 본 작업 통합 + 082~084 마이그레이션 표 갱신 | 30분 | 후임자 온보딩 |
|
||||
| 1 | Phase C 3개 메뉴 검증 | ✅ 완료 (2026-04-28 오전) | — |
|
||||
| 2 | 페이지네이션 cap 도입 | ✅ 완료 (2026-04-28 오후) | — |
|
||||
| 3 | 두번째 회사 프로비저닝 → 진짜 fan-out 효과 (`companies_queried: 2`, 행에 `TEST01` / `TEST02` 섞임) 확인 | 🟡 부분 — TEST02 프로비저닝 완료, fan-out 호출 검증은 미진행. 즉시 가능 | 20분 / 머지·실패격리 동작 검증 |
|
||||
| 4 | 화면 측 `truncated === true` 안내 박스 — "200건 표시 중, 더 보려면 검색 좁히거나 회사 도메인 전환" | ⏳ 미진행 | 페이지당 10분 × 4 / UX |
|
||||
| 5 | 전체 변경을 한 커밋으로 정리 | ❌ **다른 결정** — 3 커밋으로 분리 (§5.1 사유 참조) | — |
|
||||
| 6 | 보류 4개 메뉴 UX 설계 — 특히 메뉴관리(트리)와 공통코드(카테고리 의존) | ⏳ 별도 세션 | 14개 메뉴 완주 |
|
||||
| 7 | Phase D (캐시 / 병렬) — 회사 N≥20 환경 만들어 측정 후 결정 | ⏳ 별도 세션 | 운영 확장성 |
|
||||
| 8 | Phase E — [MULTI_TENANCY_ARCHITECTURE.md](../../docs/MULTI_TENANCY_ARCHITECTURE.md) §12 신설로 본 작업 통합 + 082~084 마이그레이션 표 갱신 | ⏳ 미진행 (단, dev `*.localhost` §4.2·§6 갱신은 `383b837a` 에 포함됨) | 30분 / 후임자 온보딩 |
|
||||
| 9 | Gitea PR 생성 (base: `gbpark-node`, compare: `hjjeong`) | ⏳ 사용자 결정 대기 — `tea` CLI 미설치 / 토큰 미세팅 | — |
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user