{ "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":"이중 방어 · 열거방지 · 온프레미스"} ] }