서브도메인설정
Build & Deploy to K8s / build-and-deploy (push) Successful in 4m28s

This commit is contained in:
2026-04-24 04:56:40 +09:00
parent 94c9b4b602
commit 8be7e16e56
43 changed files with 6464 additions and 26 deletions
@@ -0,0 +1,176 @@
# 회사관리 UI 스키마 & 데이터 소스 레퍼런스
작성일: 2026-04-24
작성자: gbpark
대상 UI: `admin-companyList-v9-systemized.jsx` (v9 accordion 메인 화면)
관련 마이그레이션: `db/migrations/RUN_081_MIGRATION.md`
관련 실행계획: `notes/gbpark/2026-04-24-company-db-provisioning-execution-plan.md`
---
## 요약
목업 v9 accordion row 가 요구하는 **16개 필드** 중:
- **8개**는 `COMPANY_MNG` 정적 컬럼 (기존 + 081 에서 추가)
- **4개**는 런타임 집계 (`CompanyStatsService` 가 계산)
- **2개**는 MVP placeholder (추후 데이터 파이프라인 생기면 채움)
- **2개**는 화면에서 derive (표시 로직)
신규 API: `GET /api/admin/provisioning/companies-stats`
---
## 1. 목업 ↔ 데이터 소스 매핑
### 1.1 정적 필드 (COMPANY_MNG 컬럼)
| 목업 필드 | COMPANY_MNG 컬럼 | 비고 |
|---|---|---|
| `code` | `COMPANY_CODE` | 기존 |
| `name` | `COMPANY_NAME` | 기존 |
| `sub` | `SUBDOMAIN` | 079 추가 |
| `brn` | `BUSINESS_REGISTRATION_NUMBER` | 기존 |
| `owner` | `REPRESENTATIVE_NAME` | 기존. 목업이 `owner` 이지만 그대로 매핑 |
| `created` | `CREATED_DATE` | 기존 |
| `writer` | `WRITER` | 기존 |
| **`plan`** | `PLAN` | ★ 081 추가. 기본값 `'Starter'` |
| **`industry`** | `INDUSTRY` | ★ 081 추가. 기본 NULL |
| **`templates`** | `TEMPLATES_COUNT` | ★ 081 추가. 프로비저닝 시 `CompanyProvisioningService.initiate()` 가 "필수(3) + 선택 n" 합산해서 저장 |
추가로 DB 라우팅 관련 (079):
| 목업에 없지만 UI 에서 파생 | 소스 |
|---|---|
| `{prefix}.invyone.com` 프리뷰 | `SUBDOMAIN` + 하드코딩 도메인 |
| `{prefix}_vexplor` DB 명 | `DB_NAME` |
| 상태 dot | `DB_STATUS` |
### 1.2 런타임 집계 (CompanyStatsService)
| 목업 필드 | 계산 방법 | 구현 파일:함수 |
|---|---|---|
| `users` | tenant DB `SELECT count(*) FROM user_info` | `CompanyStatsService.enrichOne()` |
| `db_size_bytes` (숨김) | 메타 서버 `SELECT pg_database_size(?)` | 같음 |
| `db_size` ("4.2 GB" 포맷) | `formatBytes(bytes)` | 같음 |
| `db_pct` (0~100) | `bytes / (DB_QUOTA_GB * 1GB) * 100` | 같음 |
`DB_QUOTA_GB` 는 081 에서 추가된 컬럼. 회사별 할당량. 기본 20 GB. 추후 플랜별 자동 결정 로직 추가 가능.
### 1.3 MVP Placeholder (나중에 구현)
| 목업 필드 | 현재 값 | 언제 채움 |
|---|---|---|
| `active30` | `0` | `user_info` 또는 별도 `login_history` 테이블에 `last_login_date` 컬럼 생기면 ` WHERE last_login_date > NOW() - INTERVAL '30 days'` 로 구현 |
| `spark` | `[]` (빈 배열) | 일자별 사용자 집계 테이블 (`daily_active_users` 같은) 생기면 최근 12일 데이터 반환 |
### 1.4 화면에서 derive (백엔드 추가 작업 없음)
| 목업 필드 | 계산 |
|---|---|
| `url_preview` (`qnc.invyone.com`) | `${subdomain}.invyone.com` |
| `db_name_display` (`qnc_vexplor`) | `db_name` (이미 있음) |
---
## 2. 신규 API
### `GET /api/admin/provisioning/companies-stats`
회사관리 v9 accordion 메인 화면 전용.
**권한**: SUPER_ADMIN (개발 모드 익명 허용)
**응답 예시**:
```json
[
{
"company_code": "COMPANY_10",
"company_name": "큐엔씨",
"subdomain": "qnc",
"db_name": "qnc_vexplor",
"db_host": "183.99.177.40",
"db_status": "active",
"status": "active",
"plan": "Starter",
"industry": null,
"owner": "정대표",
"brn": "456-78-90123",
"email": "admin@qnc.kr",
"templates": 3,
"db_quota_gb": 20,
"created": "2026-04-24T...",
"writer": "SUPER_ADMIN",
"users": 31,
"active30": 0,
"db_size": "820 MB",
"db_size_bytes": 859963392,
"db_pct": 4,
"spark": []
},
...
]
```
정렬: `CREATED_DATE DESC`.
**N+1 주의**: 회사 N 개 → tenant DB N 번 + 메타 서버 N 번 접속. 현재 MVP 직렬 실행. 회사 50 개 넘어가면 병렬(`CompletableFuture`) 또는 5분 캐시 도입.
---
## 3. 081 마이그레이션 요약
```sql
ALTER TABLE COMPANY_MNG
ADD COLUMN IF NOT EXISTS PLAN VARCHAR(20) DEFAULT 'Starter',
ADD COLUMN IF NOT EXISTS INDUSTRY VARCHAR(50),
ADD COLUMN IF NOT EXISTS TEMPLATES_COUNT INT DEFAULT 0,
ADD COLUMN IF NOT EXISTS DB_QUOTA_GB INT DEFAULT 20;
```
- `PLAN` 기본 'Starter' → 기존 회사들도 자동 'Starter'.
- `TEMPLATES_COUNT` 는 신규 프로비저닝부터만 채워짐. 기존 회사들은 0.
- `INDUSTRY` NULL → UI 에서 "—" 로 표시.
---
## 4. 관련 코드 변경
### 신규
- `com/erp/provisioning/CompanyStatsService.java` — derived 집계
- `mapper/provisioning.xml``listCompaniesForUi` select 추가
### 수정
- `com/erp/provisioning/CompanyProvisioningService.java``initiate()` 에 templates_count 계산
- `com/erp/provisioning/ProvisioningController.java``/companies-stats` 엔드포인트 + `CompanyStatsService` 주입
- `mapper/provisioning.xml``insertCompanyWithTenant``PLAN`, `INDUSTRY`, `TEMPLATES_COUNT` 컬럼 추가
---
## 5. Phase 3-B 프론트가 할 일 정리
1. `GET /api/admin/provisioning/companies-stats` 호출해 회사 목록 획득
2. 응답 스키마 그대로 `R9` mock 자리에 주입
3. 필요 시 AccRow 가 `sub` 변수 대신 `subdomain` 사용하도록 네이밍 일관화
### 미구현 필드 표시 정책
- `active30 = 0` 이면 표시하되 "—" 로 회색 처리 추천
- `spark.length === 0` 이면 기존 Spark 컴포넌트가 "—" 반환 (이미 목업에 로직 있음)
- `industry === null` 이면 "—" 표시
---
## 6. 추후 작업 항목
| 항목 | 우선순위 | 트리거 |
|---|---|---|
| `active30` 구현 | 중 | `user_info.last_login_date` 컬럼 또는 `login_history` 테이블 생성 |
| `spark` 일자별 집계 | 낮 | 일 단위 배치로 `daily_active_users` 테이블 생성 |
| `companies-stats` 병렬 집계 | 중 | 회사 수 50 개 넘으면 |
| `industry` 선택 드롭다운 | 낮 | 마법사 Step1 에 "업종" 필드 추가 시 |
| `plan` 선택 UI | 낮 | 과금 시스템 도입 시점 |
| `DB_QUOTA_GB` 플랜 연동 | 낮 | 플랜별 자동 할당 (Starter=5, Standard=20, Enterprise=100) |
---
이 문서는 나중에 위 필드들을 실제 데이터로 채울 때 **체크리스트**로 쓰면 됨. 컬럼은 다 깔려있으니 추가 마이그레이션 없이 값만 채우면 화면이 바로 살아남.