{ "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 폴백)"] ]} ] }