docs: 산출물 4종(개발계획서·설계서·사용자/운영자 지침서) UIMS 이식 반영

This commit is contained in:
GUARDiA 2026-06-21 23:48:12 +09:00
parent ce313fae96
commit b5a6b829d2
8 changed files with 272 additions and 0 deletions

View File

@ -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":"임시비번 메일/로그 전용 — 어떤 응답에도 미노출"}
]
}

View File

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

View File

@ -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·승인대기·열거방지로 인증 보안 수준 향상"
]}
]
}

View File

@ -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 폴백으로 동작하며 데이터/상황에 따라 결과가 달라질 수 있습니다"
]}
]
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.