diff --git a/doc/_content/admin_guide.json b/doc/_content/admin_guide.json new file mode 100644 index 0000000..4ec902d --- /dev/null +++ b/doc/_content/admin_guide.json @@ -0,0 +1,60 @@ +{ + "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":[ + "구성: 단일 JAR — frontend(React) 빌드 산출물을 backend static에 번들", + "서비스 포트: 8016 (단일 진입점)", + "패키지: com.zioinfo.esn (Spring Boot 3.5 / Java 17)", + "기동: systemd 서비스로 단일 JAR 실행, 부팅 시 자동 기동", + "프론트 빌드 → backend static 번들 → JAR 빌드 → 배포 순서" + ]}, + {"title":"2. 환경 설정", "bullets":[ + "DB: PostgreSQL esn_db / 계정 esn_user", + "멀티테넌트: LGINNOTEK / LGIT / EMART / ZIOINFO 4개 테넌트 데이터 격리", + "AI: Ollama 온프레미스 호스트 연동 (알람 분석·POS 분류, 폴백 동작)", + "스키마: sql.init.mode=always — 전 스키마 멱등, 부팅 시 안전 재적용", + "schema-locations에 db/90_uiws_system.sql, db/93_esn_login_helper.sql 포함" + ], "note":"멱등 스키마 — 누락 테이블 발생 시 재기동으로 재적용"}, + {"type":"table","title":"3. 시스템관리 (RBAC 권한관리)", "headers":["화면","기능"], "rows":[ + ["RoleManagement","역할 등록/수정/다중삭제"], + ["RoleMenuPermission","역할-메뉴 읽기/쓰기 권한 매핑"], + ["CodeManagement","공통코드 그룹/값 관리 (사용중 코드값 시 삭제 차단)"], + ["MenuManagement","메뉴 2-depth 트리 관리"], + ["DeptManagement","부서 2-depth 트리 관리"], + ["CompanyManagement","거래처 관리"], + ["UserList / 승인","사용자 관리 + 회원가입 승인대기 처리"] + ]}, + {"title":"4. 백업 / 복구", "bullets":[ + "DB 백업: esn_db 정기 덤프(스케줄) — 본연 + tb_uiws_* 포함", + "복구: 덤프 복원 후 단일 JAR 재기동, 멱등 스키마로 정합 보장", + "tb_uiws_* 와 esn_user는 분리 스키마 — 복구 시 병합 금지 원칙 유지", + "펌웨어/업데이트 큐는 작업 상태 정합 확인 후 재개" + ]}, + {"title":"5. 모니터링 / 헬스", "bullets":[ + "서비스 헬스: 8016 기동 상태 점검(systemd active + 헬스 확인)", + "HCore 관제(HCoreStatus): 게이트웨이/허브 상태 실시간 모니터링", + "알람(AlarmList) + AI 원인 분석(AiAnalysis)으로 이상 징후 추적", + "AuditLog: 감사 로그로 운영 행위 추적", + "Dashboard: 통합 운영 현황 집계" + ]}, + {"title":"6. 장애 대응", "bullets":[ + "기동 실패: 단일 JAR 로그 확인 → DB 연결(esn_db)·포트(8016) 점검", + "누락 테이블(relation does not exist): 멱등 스키마 재적용(재기동) 후 확인", + "AI 응답 지연/실패: 폴백으로 degraded 동작 — Ollama 호스트 상태 점검", + "POS 변환 오류(PosCvtList): 변환/분류 큐 상태·원본 데이터 확인", + "오류 응답: 스택트레이스 미노출 — 요약 메시지 기준으로 원인 추적" + ]}, + {"title":"7. 보안 운영", "bullets":[ + "자격증명·비밀번호·내부 IP API 응답/로그 미노출 (불변 규칙)", + "외부 API 0 — Ollama(AI)·SMTP(메일)만 사용", + "인증: JWT + 2FA + 로그인 실패 잠금, verify-token purpose=2fa 우회차단", + "RBAC: /api/system/** hasAnyRole(ADMIN,MANAGER) + 사이드바 가드 이중 방어", + "회원가입 승인대기(PENDING) 운영 — 미승인 계정 접근 차단", + "열거방지: 아이디찾기 마스킹·미존재 비표시, 비밀번호 재설정 항상 success=true" + ], "note":"임시비번 메일/로그 전용 — 어떤 응답에도 미노출"} + ] +} diff --git a/doc/_content/design_spec.json b/doc/_content/design_spec.json new file mode 100644 index 0000000..5875624 --- /dev/null +++ b/doc/_content/design_spec.json @@ -0,0 +1,84 @@ +{ + "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":"이중 방어 · 열거방지 · 온프레미스"} + ] +} diff --git a/doc/_content/dev_plan.json b/doc/_content/dev_plan.json new file mode 100644 index 0000000..44f0ec2 --- /dev/null +++ b/doc/_content/dev_plan.json @@ -0,0 +1,80 @@ +{ + "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":[ + "레거시 ESN(전자가격표/전자선반, ESL) 8개 프로젝트가 Spring Boot 1.5/Java 8 등 구형 스택에 분산 운영", + "통합 대상: ESN_WEB_ZIOINFO, ESN_WEB_LGInnotek, ESN_DAEMON_EMART, ESN_DAEMON_LGIT, esn, ESL_AUTO_UPDATE, restapi_lgit, UCS_LGU", + "단일 현대화 플랫폼으로 통합하여 멀티테넌트 운영·유지보수·관제를 일원화", + "온프레미스 sLLM(Ollama)으로 알람 원인 분석·POS 데이터 자동 분류 AI 적용 (외부 API 금지)" + ]}, + {"title":"2. 목표", "bullets":[ + "8개 레거시 프로젝트 → Spring Boot 3.5 Java 17 + React 19 단일 플랫폼 통합", + "멀티테넌트(LGINNOTEK / LGIT / EMART / ZIOINFO) 단일 운영 콘솔", + "ESL 화면 템플릿·기기 바인딩·상품/가격·펌웨어·업데이트 큐 통합 관리", + "HCore 게이트웨이/허브 관제 + 알람 이력 + 작업 이력 통합 가시화", + "UIMS(UIWS) 공통 업무협업 레이어 + 시스템관리(RBAC) 이식으로 운영 협업 체계 내장" + ]}, + {"type":"table","title":"3. 범위 — 솔루션 본연 모듈", "headers":["모듈","설명"], "rows":[ + ["Tenant / StoreGroup / Store","멀티테넌트·매장그룹·매장 관리"], + ["Template / TagBinding","ESL 화면 템플릿 + ESL 기기 바인딩"], + ["Product","상품 / 가격 관리"], + ["Alarm","알람 + 알람 이력"], + ["HCore","게이트웨이 / 허브 관제"], + ["PosCvt","POS 데이터 변환 / 분류"], + ["Firmware / UpdateQueue","펌웨어 버전 관리 + 업데이트 큐"], + ["Work","작업 이력"], + ["Dashboard / Ai","통합 대시보드 + Ollama AI 분석"] + ]}, + {"type":"table","title":"3. 범위 — UIMS(UIWS) 이식 추가 모듈", "headers":["모듈","설명"], "rows":[ + ["worklog","업무일지"], + ["schedule","일정(FullCalendar)"], + ["message","쪽지"], + ["stats","통계"], + ["uiws.system","시스템관리(권한관리 RBAC) 10 컨트롤러"], + ["auth (보조)","회원가입 승인대기 · 아이디찾기 · 비밀번호 재설정"] + ]}, + {"type":"table","title":"4. 기술 스택", "headers":["레이어","기술"], "rows":[ + ["Backend","Spring Boot 3.5 / Java 17 / MyBatis (단일 JAR)"], + ["Frontend","React 19 + Vite + TypeScript (backend static 번들)"], + ["Database","PostgreSQL (esn_db / esn_user)"], + ["AI","Ollama 온프레미스 (알람 분석·POS 분류, 폴백 포함)"], + ["패키지","com.zioinfo.esn"], + ["인증","JWT + 2FA (verify-token purpose=2fa 우회차단)"] + ]}, + {"title":"5. 아키텍처", "bullets":[ + "단일 JAR — frontend(React) 빌드 산출물을 backend static에 번들", + "백엔드 포트 8016 (단일 진입점)", + "DB: PostgreSQL esn_db / 계정 esn_user", + "멀티테넌트 4개 테넌트(LGINNOTEK / LGIT / EMART / ZIOINFO) 데이터 격리", + "AI: Ollama 온프레미스 단일 호스트, 폴백 동작 — 외부 API 호출 0" + ], "note":"단일 JAR · 8016 · esn_db · 멀티테넌트"}, + {"title":"6. UIMS 이식 범위 (이번 세션 추가)", "bullets":[ + "공통 업무협업: worklog·schedule·message·stats (com.zioinfo.esn.uiws.*) — 사전 이식 + 이번 보조", + "시스템관리(RBAC): com.zioinfo.esn.uiws.system, base /api/system/* — 10 컨트롤러, 화면 6종", + "테이블 프리픽스 tb_uiws_* (self-contained, esn_user와 분리 — 절대 병합 안 함)", + "로그인 보조 3종: 회원가입 승인대기·아이디찾기(마스킹)·비밀번호 재설정(임시비번 메일 전용)", + "2FA: 기존 JWT + 2FA 유지 + 로그인 실패 잠금", + "모바일 앱 QR: 통합 메신저 앱 다운로드(중앙 ITSM APK 저장소 공개 엔드포인트 재사용, 읽기전용)" + ], "note":"기존 ESL/HCore·login/2FA 흐름 무변경 — 신규 레이어만 가산"}, + {"type":"table","title":"7. 일정 (WBS)", "headers":["단계","주요 작업","산출물"], "rows":[ + ["분석","레거시 8개 도메인 분석·통합 설계","통합 도메인 모델"], + ["설계","ERD·API·화면 설계","설계서"], + ["구현(코어)","ESL·HCore·Product·Firmware·UpdateQueue·Alarm","백엔드 15 컨트롤러"], + ["구현(프론트)","Dashboard·관제·관리 화면","React 페이지"], + ["이식(UIMS)","업무협업·시스템관리(RBAC)·로그인 보조·2FA","uiws.* + 화면 6종"], + ["AI","Ollama 알람 분석·POS 분류","AI 분석 화면"], + ["검증/배포","빌드·경계면 QA·단일 JAR 배포(8016)","릴리스"] + ]}, + {"title":"8. 기대 효과", "bullets":[ + "레거시 8개 프로젝트 통합 → 운영·유지보수 비용 절감, 기술부채 해소", + "멀티테넌트 단일 콘솔로 4개 테넌트 ESL 통합 관제", + "온프레미스 AI로 알람 원인 분석·POS 분류 자동화 (외부 의존 0)", + "UIMS 공통 업무협업·RBAC 내장으로 운영 협업·권한 통제 강화", + "JWT+2FA·승인대기·열거방지로 인증 보안 수준 향상" + ]} + ] +} diff --git a/doc/_content/user_guide.json b/doc/_content/user_guide.json new file mode 100644 index 0000000..d6a6aae --- /dev/null +++ b/doc/_content/user_guide.json @@ -0,0 +1,48 @@ +{ + "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":[ + "로그인 화면에서 아이디·비밀번호 입력 후 로그인", + "2단계 인증(2FA): 인증코드 확인 단계 통과 후 접속 (실패 누적 시 잠금)", + "회원가입: 로그인 화면 하단 '회원가입' → 신청은 승인대기(PENDING) 상태, 관리자 승인 후 사용", + "아이디 찾기: '아이디찾기' → 이름·이메일 입력, 일치 시 마스킹된 아이디 표시(예: ad****)", + "비밀번호 재설정: '비밀번호 재설정' → 임시비밀번호가 등록 이메일로 발송됨" + ], "note":"임시비밀번호는 화면에 표시되지 않고 메일로만 전달됩니다"}, + {"title":"2. ESL 관리 — 템플릿 / 태그바인딩 / 상품가격", "bullets":[ + "템플릿(TemplateList): ESL 화면 템플릿을 등록·조회·관리", + "태그바인딩(TagBindingList): ESL 기기와 상품/템플릿 바인딩 설정", + "상품/가격(ProductList): 상품 정보·가격을 등록·조회·수정", + "테넌트/매장(TenantAdmin·StoreList): 멀티테넌트·매장 단위로 데이터 조회" + ]}, + {"title":"3. 관제 — HCore / 알람 / POS / 펌웨어 / 업데이트큐", "bullets":[ + "HCore 상태(HCoreStatus): 게이트웨이/허브 관제 상태 모니터링", + "알람(AlarmList): 알람 및 알람 이력 조회, AI 알람 원인 분석 참고(AiAnalysis)", + "POS 변환(PosCvtList): POS 데이터 변환/분류 현황 조회", + "펌웨어(FirmwareList): 펌웨어 버전 관리", + "업데이트 큐(UpdateQueueList): 펌웨어/업데이트 작업 큐 진행 상황 조회", + "작업 이력(WorkHistory): 수행 작업 이력 조회" + ]}, + {"title":"4. 업무협업 (UIMS) — 업무일지 / 일정 / 쪽지 / 통계", "bullets":[ + "업무일지(WorklogList): 일일 업무 내용을 작성·조회", + "일정(ScheduleCalendar): 캘린더(FullCalendar)에서 일정 등록·확인", + "쪽지(MessageBox): 구성원 간 쪽지 송수신", + "통계(StatsPivot): 업무 통계 피벗 조회" + ]}, + {"title":"5. 모바일 앱 (QR 다운로드)", "bullets":[ + "MobileApp 화면에서 통합 메신저 앱 다운로드 QR 코드 확인", + "QR 스캔 → 다운로드 페이지에서 앱 설치 (앱스토어 불필요)", + "QR/버전 정보는 중앙 APK 저장소를 읽기 전용으로 표시" + ]}, + {"title":"6. FAQ", "bullets":[ + "Q. 회원가입 후 로그인이 안 됩니다 → 승인대기 상태입니다. 관리자 승인 후 이용 가능", + "Q. 아이디 찾기에서 결과가 안 나옵니다 → 이름·이메일이 등록 정보와 일치해야 합니다(보안상 미존재 시 결과 비표시)", + "Q. 비밀번호 재설정 메일이 안 옵니다 → 등록 이메일 확인, 스팸함 확인", + "Q. 시스템관리(권한) 메뉴가 안 보입니다 → 관리자(ADMIN) 권한 사용자에게만 노출됩니다", + "Q. AI 분석 결과가 비어 있습니다 → 온프레미스 AI 폴백으로 동작하며 데이터/상황에 따라 결과가 달라질 수 있습니다" + ]} + ] +} diff --git a/doc/guardia-esn_개발계획서_v1.pptx b/doc/guardia-esn_개발계획서_v1.pptx new file mode 100644 index 0000000..293a4a3 Binary files /dev/null and b/doc/guardia-esn_개발계획서_v1.pptx differ diff --git a/doc/guardia-esn_사용자지침서_v1.pptx b/doc/guardia-esn_사용자지침서_v1.pptx new file mode 100644 index 0000000..622e5db Binary files /dev/null and b/doc/guardia-esn_사용자지침서_v1.pptx differ diff --git a/doc/guardia-esn_설계서_v1.pptx b/doc/guardia-esn_설계서_v1.pptx new file mode 100644 index 0000000..aa1b3ef Binary files /dev/null and b/doc/guardia-esn_설계서_v1.pptx differ diff --git a/doc/guardia-esn_운영자지침서_v1.pptx b/doc/guardia-esn_운영자지침서_v1.pptx new file mode 100644 index 0000000..83433e0 Binary files /dev/null and b/doc/guardia-esn_운영자지침서_v1.pptx differ