{
  "solution": "GUARDiA ESN",
  "doc_type": "설계서",
  "out": "C:/GUARDiA/workspace/guardia-esn/doc/guardia-esn_설계서_v1.pptx",
  "subtitle": "지오정보기술 / 2026",
  "design": {"primary":"1F3A5F","accent":"2E86C1","text":"222222","font_ko":"맑은 고딕"},
  "sections": [
    {"title":"1. 시스템 구성도", "bullets":[
      "프레젠테이션: React 19 + Vite + TS — backend static 번들(단일 JAR)",
      "애플리케이션: Spring Boot 3.5 / Java 17 / MyBatis — 포트 8016",
      "데이터: PostgreSQL esn_db / esn_user",
      "AI: Ollama 온프레미스(알람 분석·POS 분류, 폴백) — 외부 API 0",
      "외부 연계: 통합 메신저 앱 QR(중앙 ITSM APK 저장소 공개 엔드포인트, 읽기전용)"
    ], "note":"단일 JAR · 8016 · esn_db"},
    {"type":"table","title":"2. 멀티테넌트 도메인", "headers":["테넌트","비고"], "rows":[
      ["LGINNOTEK","ESL 운영 테넌트"],
      ["LGIT","ESL 운영 테넌트"],
      ["EMART","ESL 운영 테넌트"],
      ["ZIOINFO","ESL 운영 테넌트"]
    ]},
    {"type":"table","title":"3. 도메인 / 엔티티 (본연 13 VO)", "headers":["엔티티","의미"], "rows":[
      ["Tenant / StoreGroup / Store","테넌트·매장그룹·매장"],
      ["Template","ESL 화면 템플릿"],
      ["TagBinding","ESL 기기 바인딩"],
      ["Product","상품 / 가격"],
      ["Alarm","알람 + 알람이력"],
      ["HCore","게이트웨이 / 허브 관제"],
      ["PosCvt","POS 데이터 변환 / 분류"],
      ["Firmware / UpdateQueue","펌웨어 + 업데이트 큐"],
      ["WorkHistory","작업 이력"],
      ["Dashboard","통합 대시보드 집계"]
    ]},
    {"type":"table","title":"3-1. UIMS 이식 엔티티 (tb_uiws_*)", "headers":["영역","비고"], "rows":[
      ["worklog / schedule / message / stats","공통 업무협업 테이블"],
      ["tb_uiws_sys_user","시스템관리 사용자 (VARCHAR user_id)"],
      ["역할 / 메뉴 / 코드 / 부서 / 거래처","RBAC 시스템관리 테이블"],
      ["격리 원칙","tb_uiws_sys_user ≠ esn_user(BIGSERIAL) — 병합 금지"]
    ]},
    {"type":"table","title":"4. API 설계 — 본연 컨트롤러 15종", "headers":["컨트롤러","역할"], "rows":[
      ["Tenant / StoreGroup / Store","테넌트·매장 관리"],
      ["Template / TagBinding","템플릿·기기 바인딩"],
      ["Product","상품/가격"],
      ["Alarm / HCore","알람·게이트웨이 관제"],
      ["PosCvt","POS 변환/분류"],
      ["Firmware / UpdateQueue","펌웨어·업데이트 큐"],
      ["Work / User","작업이력·사용자"],
      ["Dashboard / Ai","대시보드·AI 분석"]
    ]},
    {"type":"table","title":"4-1. API 설계 — UIMS 이식 (uiws.system 10 + auth 3)", "headers":["base","항목"], "rows":[
      ["/api/system/codes","공통코드 (그룹 values[] 치환 PUT)"],
      ["/api/system/companies","거래처 (DELETE 바디 {ids[]})"],
      ["/api/system/depts","부서 (+/tree, 단건 DELETE)"],
      ["/api/system/menus","메뉴 (2-depth, 다중 DELETE)"],
      ["/api/system/roles","역할 (다중 DELETE)"],
      ["/api/system/roles/{roleId}/menus","역할-메뉴 권한 매핑 (읽기/쓰기)"],
      ["/api/system/{programs,users,DeptRole}","프로그램·사용자·부서역할"],
      ["/api/auth/signup | find-id | reset-password","로그인 보조 3종 (permitAll)"]
    ]},
    {"type":"table","title":"5. 화면 설계 — 메뉴 목록", "headers":["구분","화면"], "rows":[
      ["본연","Dashboard · TenantAdmin · StoreList · TemplateList · TagBindingList"],
      ["본연","ProductList · AlarmList · HCoreStatus · PosCvtList"],
      ["본연","FirmwareList · UpdateQueueList · WorkHistory · UserList"],
      ["본연","AiAnalysis · AuditLog · SystemSettings · MobileApp · Login · AiTechniqueSettings"],
      ["UIMS 업무","WorklogList · ScheduleCalendar · MessageBox · StatsPivot"],
      ["UIMS 시스템관리","RoleManagement · RoleMenuPermission · CodeManagement"],
      ["UIMS 시스템관리","MenuManagement · DeptManagement · CompanyManagement"]
    ]},
    {"title":"6. DB 스키마 설계", "bullets":[
      "DB: esn_db / 계정 esn_user (PostgreSQL)",
      "본연 도메인 스키마 + UIMS 이식 스키마 멱등 적용 (sql.init.mode=always)",
      "db/90_uiws_system.sql — tb_uiws_* (self-contained, 멱등)",
      "db/93_esn_login_helper.sql — esn_user에 name·approval_status 멱등 ALTER",
      "스키마 격리: tb_uiws_sys_user(VARCHAR) ≠ esn_user(BIGSERIAL) — 절대 병합 안 함"
    ], "note":"전 스키마 멱등 — 부팅 시 안전 재적용"},
    {"title":"7. 보안 설계", "bullets":[
      "인증: JWT + 2FA (verify-token purpose=2fa 우회차단 + 로그인 실패 잠금)",
      "RBAC: /api/system/** hasAnyRole(ADMIN,MANAGER) + 사이드바 esn_role==='ADMIN' 가드 (이중 방어)",
      "공개: /api/public/** · /api/auth/** permitAll",
      "열거방지: find-id 미존재 found:false, reset-password 항상 success=true",
      "임시비번 메일/로그 전용 — API 응답·예외 미노출",
      "온프레미스: 외부 API 0 (Ollama·SMTP만), 자격증명·스택트레이스 미노출"
    ], "note":"이중 방어 · 열거방지 · 온프레미스"}
  ]
}
