{
  "solution": "zioinfo-esn",
  "doc_type": "설계서",
  "out": "C:/GUARDiA/workspace/zioinfo-esn/doc/zioinfo-esn_설계서_v2.pptx",
  "subtitle": "ESL 통합관리 + UIMS 업무협업 / 지오정보기술 / 2026",
  "design": {"primary":"1F3A5F","accent":"2E86C1","text":"222222","font_ko":"맑은 고딕"},
  "sections": [
    {"title":"1. 시스템 구성도", "bullets":[
      "[Client] React 19 SPA  →  [App] Spring Boot 3.5 단일 JAR (8015)  →  [DB] PostgreSQL esn_db",
      "[App] ─ Ollama(11434, llama3.2:1b) : 알람분석·POS 분류 (폴백 내장)",
      "[App] ─ ITSM(9001) 연계 (선택)",
      "정적 리소스: backend classpath:/static/ 에 프론트 빌드 번들",
      "스키마 멱등 부팅: schema.sql → 90_uiws_system.sql → 91_uiws_port.sql"
    ], "note":"단일 JAR · 에이전트리스 · 온프레미스 AI"},
    {"type":"table", "title":"2. 도메인 요약 — ESL 코어", "headers":["도메인","역할"], "rows":[
      ["Tenant","멀티테넌트(LGInnotek/LGIT/Emart/ZIOINFO)"],
      ["StoreGroup / Store","매장그룹 · 매장"],
      ["Product","상품 / 가격"],
      ["Template","ESL 화면 템플릿"],
      ["TagBinding","ESL 기기 ↔ 상품 바인딩"],
      ["UpdateQueue","가격/화면 갱신 큐"],
      ["PosCvt","POS 데이터 변환·분류"],
      ["Alarm","알람 / 이력"],
      ["HCore","게이트웨이·허브 상태 관제"],
      ["Firmware","펌웨어 버전 관리"],
      ["WorkHistory","작업 이력"]
    ]},
    {"type":"table", "title":"3. 도메인 요약 — UIMS (신규)", "headers":["도메인","역할","테이블(tb_uiws_*)"], "rows":[
      ["Worklog","업무일지·진행상태·코멘트","worklog / worklog_dtl / worklog_cmt"],
      ["Schedule","일정·캘린더·첨부","schedule / diary / attach"],
      ["Message","쪽지 송수신·미읽음","message / message_rcv"],
      ["Stats","개인·회사별 업무 집계 피벗","(worklog 집계)"],
      ["System(RBAC)","역할·메뉴·코드·부서·거래처","role / menu / role_menu / code* / dept / company / sys_user"],
      ["Auth 2FA","로그인 인증코드 검증","login_verify"]
    ]},
    {"type":"table", "title":"4. API 설계 — 주요 엔드포인트", "headers":["영역","Base Path"], "rows":[
      ["ESL 코어","/api/stores · /api/store-groups · /api/tenants"],
      ["ESL 코어","/api/products · /api/templates · /api/tag-binding"],
      ["ESL 코어","/api/update-queue · /api/pos-cvt · /api/works"],
      ["ESL 코어","/api/alarms · /api/hcore · /api/firmware · /api/dashboard"],
      ["AI","/api/ai"],
      ["UIMS 업무","/api/worklogs · /api/schedules · /api/messages · /api/stats · /api/attachments · /api/diaries"],
      ["UIMS 시스템","/api/system/{roles,menus,programs,codes,depts,companies,users}"],
      ["인증","/api/auth (login·verify·signup·find-id·reset-password) · /api/public (depts·companies)"]
    ]},
    {"type":"table", "title":"5. 화면 설계 — 메뉴 목록", "headers":["메뉴 그룹","화면"], "rows":[
      ["대시보드","Dashboard"],
      ["ESL 운영","StoreList · TemplateList · ProductList · TagBindingList"],
      ["ESL 운영","UpdateQueueList · PosCvtList · WorkHistory"],
      ["관제","AlarmList · HCoreStatus · FirmwareList"],
      ["관리","TenantAdmin · UserList · AiAnalysis"],
      ["UIMS","WorklogList · ScheduleCalendar · MessageBox · StatsPivot"],
      ["시스템관리","RoleManagement · RoleMenuManagement · MenuManagement"],
      ["시스템관리","CodeManagement · DeptManagement · CompanyManagement"],
      ["인증","Login(2FA) · Signup · FindId · ResetPw · MobileApp(QR)"]
    ]},
    {"type":"table", "title":"6. DB 스키마 — 멱등 적용", "headers":["파일","내용"], "rows":[
      ["schema.sql","ESL 코어 테이블(esn_*)"],
      ["90_uiws_system.sql","권한관리 10테이블 + 시드(ADMIN/MANAGER/USER·ZIOINFO·ROOT)"],
      ["91_uiws_port.sql","업무 9테이블 + esn_user 2FA 컬럼 ALTER"],
      ["멱등 규칙","CREATE TABLE IF NOT EXISTS / ADD COLUMN IF NOT EXISTS / ON CONFLICT DO NOTHING"]
    ]},
    {"title":"7. 보안 설계", "bullets":[
      "인증: JWT(만료 24h) + 2FA(이메일 인증코드 5분, verify-token 5분, 실패 5회 잠금)",
      "2FA 우회 차단: verify-token purpose=2fa 클레임 → JwtFilter가 verify-token은 인증 컨텍스트 미설정(보호 API 접근 불가)",
      "회원가입 승인대기(approved=false) → ADMIN 승인 전 로그인 차단",
      "RBAC: /api/system/** 변경(POST/PUT/DELETE)은 ADMIN/MANAGER 한정 (UI 차단 + 백엔드 403 이중 방어)",
      "자격증명·비밀번호·내부IP 응답/로그 미노출 · 스택트레이스 차단 · 외부 API 0",
      "비밀번호 BCrypt 저장 · 아이디찾기 username 마스킹 반환"
    ]},
    {"type":"table", "title":"8. 연계 설계", "headers":["연계 대상","용도"], "rows":[
      ["Ollama (11434)","알람 원인 분석 · POS 데이터 자동 분류 (폴백)"],
      ["ITSM (9001)","운영 연계 (선택)"],
      ["메일/로그","2FA 인증코드 발송 (미설정 시 LogMailSender 폴백)"]
    ]}
  ]
}
