# 🗣️ 9-Agent 회의록: 통합 관리자(Admin) 대시보드 및 업로드 자동화 파이프라인 기획

**일시**: 2026-02-25 20:14  
**의제**: `app/admin` 경로를 중심으로 한 관리자 통합 기능(파일 업로드, 권한, 비용 모니터링) 구상 및 아키텍처 토의  
**참석자**: Jay(PM), Tony(Backend), Alex(Frontend), Sam(Data), Rachel(QA), Steve(Legal), Chris(UX), David(Planner), Reflex(KM)

---

## 1. 회의 안건 (User Requirements)
사용자(`Jay`)의 다음 요구사항을 `app/admin` 페이지에 통합 구현할 계획 수립 (구현은 내일 진행).

1. **사용자 친화적 안내문 제공**: 관리자가 업로드 전 필독해야 할 파일 규칙 및 유의사항 안내.
2. **사전 검증(Validation) 로직 탑재된 파일 업로드**:
   - 로컬에서 파일 선택 시, 즉시 파일 이름 구조(`{회사명}_{상품명}_{출시연월(YYMM)}.pdf`)를 파싱 및 정합성 검사.
   - 통과한 파일과 규칙 위반 파일을 UI 상에서 시각적으로 분리하여 "문제없음" 상태 표시.
3. **One-Click 구글 드라이브 동기화**:
   - 2번 검증을 통과한 파일들에 한해, 사용자가 '업로드' 버튼 클릭 시 InsuWiki 구글 드라이브의 알맞은 경로(`01_약관/생명보험/해당회사/...`)로 다이렉트 자동 업로드.
4. **계정/권한 설정 완전 통합**:
   - 기존에 구상/작업 중이던 `/admin/users` (역할 변경, Guest 승인 등) 기능을 통합 대시보드의 한 탭으로 편입.
5. **API 비용/토큰 사용량 모니터링Dashboard**:
   - Gemini API, Cloud Functions 등 주요 백엔드 파이프라인에서 발생하는 사용량과 대략적인 비용을 확인할 수 있는 위젯/차트 제공.

---

## 2. Agent별 역할 및 설계 의견

**Jay (PM/Orchestrator)**
> "드디어 흩어져 있던 관리자 기능이 `/admin` 이라는 하나의 뷰로 통합됩니다. 특히, CLI 환경(터미널)에서 스크립트를 돌려 드라이브를 시딩하던 것을, 웹 GUI 상에서 우아하게 처리하겠다는 기획이 핵심입니다. 사용자(관리자) 편의성을 극대화해야 합니다."

**David (Planner)**
> "페이지 구조는 좌측 Sidebar(LNB)와 우측 Content Area를 가진 Dashboard 레이아웃이 적합합니다. 
> - 탭 구성 1: **📁 문서 업로드 (Drive Sync)**
> - 탭 구성 2: **👥 사용자 및 권한 관리**
> - 탭 구성 3: **💰 시스템 비용 / 리소스 상태 모니터링**
> 각 뷰를 독립된 컴포넌트로 분리하여 점진적으로 구현하면 좋겠습니다."

**Chris (UX)**
> "문서 업로드 탭(Tab 1)의 사용자 경험이 중요합니다.
> 1. 최상단에 Alert 박스로 '파일 이름 네이밍 가이드' 노출.
> 2. Dropzone UI를 배치하여 여러 개의 PDF를 한 번에 드래그&드롭할 수 있게 함.
> 3. 파일이 올라가면 리스트업 하되, 좌측에 통과(🟢) / 실패(🔴) 상태 아이콘 렌더링. 실패 시 붉은색 텍스트로 '형식 오류: {사유}' 툴팁 제공.
> 4. 상태가 🟢인 파일들의 체크박스만 활성화되고, 하단의 `[구글 드라이브에 X개 업로드]` 메인 액션 버튼 렌더링."

**Tony (Backend)**
> "드라이브 자동 업로드(Tab 1)와 비용 모니터링(Tab 3)의 서버 측면 고민이 필요합니다.
> - **드라이브 업로드**: Next.js의 Server Action이나 API Route(`POST /api/admin/drive-upload`)를 파야 합니다. 로컬 서버(Vercel)로 파일을 먼저 스트리밍 받은 뒤, Service Account 권한(ADC)을 사용해 `googleapis` 파이프라인으로 구글 드라이브 해당 폴더를 찾아서 `create` 해야 합니다. 이때 `seed-insurance-metadata.ts`에서 썼던 경로 파싱 로직을 서버로 가져와야 파이프라인이 자동화됩니다.
> - **비용 모니터링**: Firebase Cloud Billing API나 GCP Cost Management API를 직접 쏘는 것은 권한도 까다롭고 과할 수 있습니다. 대신 `query_logs`나 `jobs` 컬렉션에 우리가 기록해 둔 '사용 토큰' 혹은 'Function 호출 횟수'를 `sum()`해서 대략적인 실사용량(Usage) 지표 베이스로 보여주는 접근을 추천합니다."

**Alex (Frontend)**
> "권한 관리 탭(Tab 2)은 기존에 논의했던 아키텍처 그대로 가져옵니다. Firestore의 `users` 컬렉션을 읽어와서 테이블로 렌더링하고, 권한 변경(Select Box) 시 관리자 권한 API(`/api/admin/roles`)로 PATCH 요청을 보내 Firestore 문서를 갱신하면 됩니다. 
> 중요한 것은 `/admin` 라우트 자체를 `middleware.ts` 나 `layout.tsx`단에서 현재 세션 유저의 `role == 'admin'`인지 반드시 체크해서 철저히 라우팅을 차단해야 하는 점입니다."

**Sam (Data)**
> "업로드 파이프라인에서 파일명 규칙이 상당히 복잡합니다.
> `{회사명}_{상품명}_{출시연월}.pdf` 인데, 여기서 '생명보험/손해보험' 같은 상위 카테고리는 회사명을 기반으로 DB나 서버의 Mapper 객체를 통해 역추적해야 합니다. 업로드 API에서 회사명을 보고 구글 드라이브 상의 부모 Folder ID를 똑똑하게 찾아가야 하니까, 사전에 매핑 딕셔너리(회사명 -> 분류) 관리가 필요합니다."

**Rachel (QA)**
> "드라이브에 이미 똑같은 파일 명이 있을 때 덮어쓰기(Update)를 할지, 튕겨낼지(에러), 아니면 `(1)`을 붙일지 정책을 정해야 합니다. 기존 스크립트는 '유지(Skip)' 했지만, 관리자가 명시적으로 웹에서 올리는 거라면 '파일 덮어쓰기' 혹은 '기존 파일 삭제 후 재업로드' 가 맞을 듯합니다."
> 
> *Jay: "기존 문서를 휴지통으로 보내거나 완전히 삭제한 후 새 버전으로 교체(Update)하는 로직으로 통일합시다."*

**Steve (Legal/Security)**
> "사용자 및 권한 관리에 접근하는 관리자의 액션은 반드시 Audit Log(감사 로그)로 남겨야 합니다. 누가 누구의 권한을 Editor에서 Admin으로 바꾸었는지, 백엔드에서 보안상 기록해두어야 만일의 사태를 막을 수 있습니다."

**Reflex (Knowledge Manager)**
> "현재 프로젝트 대시보드 및 Task 48의 설계 문서, 스펙들이 갱신되어 있습니다. 내일 `/admin` 구현에 착수할 때 Task 50 즈음으로 신규 마스터플랜을 세우고, `app/admin/...` 구조를 먼저 잡는 것으로 기록해 두겠습니다."

---

## 3. 합의된 구체적 구현 단계 (Action Plan for Tomorrow)

### Step 1: `/admin` 베이스 설계 및 권한 가드
- `app/admin/layout.tsx` 신설: 어드민 권한 체커(Guard) 및 Sidebar Navigation (업로드 / 사용자 / 비용 통계).

### Step 2: Tab 2 (사용자 및 권한 관리) 이동 & 통합
- Firestore `users` 테이블 연동 (Role, Status 변경).
- 권한 업데이트 용 API 엔드포인트 마련 및 Security Rule 점검.

### Step 3: Tab 1 (스마트 드라이브 업로더) 구현 ★핵심
- **UI**: 파일 드롭존 + 정규식(`/^([가-힣a-zA-Z]+)_([가-힣a-zA-Z0-9]+)_(\d{4})\.pdf$/`) 데코레이터.
- **Client**: 파일 파싱 에러/성공 상태 시각화.
- **Server API (`POST /api/admin/upload`)**: FormData 수신 → Google Auth 인증 → 대상 폴더 탐색/생성 → 파일 Stream 업로드 → `insurance_metadata` 자동 갱신 트리거.

### Step 4: Tab 3 (비용 모니터링 뷰)
- GCP 실제 청구 내역 조회 대신, 사내 DB(`jobs`, `query_logs`) 기반 '토큰 소모량 누적치' 및 'API 핑 통계' 차트를 우선 제공(Chart.js 또는 Recharts 이용).

---
*End of Protocol.*
