guardia-esn/doc/_content/design_spec.json

85 lines
5.2 KiB
JSON

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