guardia-hrm/doc/_content_설계서.json

77 lines
5.9 KiB
JSON

{
"solution": "GUARDiA HRM",
"doc_type": "설계서",
"out": "C:/GUARDiA/workspace/guardia-hrm/doc/hrm_설계서_v1.pptx",
"subtitle": "시스템 설계서 (HR 본연 + UIMS 공통 업무협업) / 지오정보기술 2026",
"design": {"primary": "1F3A5F", "accent": "2E86C1", "text": "222222", "font_ko": "맑은 고딕"},
"sections": [
{"title": "1. 시스템 구성도", "bullets": [
"프레젠테이션: React 19 관리자 웹 + React Native 모바일 앱(app/hrm/)",
"애플리케이션: Spring Boot 3.5 단일 JAR (포트 8014) — HR 모듈 10 + UIMS 모듈 5",
"데이터: PostgreSQL hrm_db (hrm_* 인사 테이블 + tb_uiws_* 업무/권한 테이블)",
"AI: 온프레미스 Ollama sLLM — HR 인사이트 6종 + 폴백",
"연계: 통합 메신저 QR 배포(중앙 ITSM APK 저장소 공개 엔드포인트 재사용)"
],
"note": "도식 자리: 웹/모바일 → 8014 (HR/UIMS/system/auth) → hrm_db + Ollama"},
{"type": "table", "title": "2. 도메인 / 패키지 구조", "headers": ["패키지", "역할"], "rows": [
["com.zioinfo.hrm.employee 외 9", "HR 본연 도메인 (사원·조직·급여·근태·성과·채용·교육·ai·integration·admin)"],
["com.zioinfo.hrm.uiws.worklog", "업무일지 — /api/worklogs"],
["com.zioinfo.hrm.uiws.schedule", "일정·일지·첨부 — /api/schedules·/api/diaries·/api/attachments"],
["com.zioinfo.hrm.uiws.message", "쪽지 — /api/messages"],
["com.zioinfo.hrm.uiws.stats", "통계 — /api/stats"],
["com.zioinfo.hrm.uiws.system", "RBAC 권한관리 — /api/system/*, /api/public"],
["com.zioinfo.hrm.auth", "로그인 보조(/api/auth/*) + 2FA(verify)"]
]},
{"type": "table", "title": "3. API 설계 — UIMS 모듈 엔드포인트", "headers": ["모듈", "base path", "엔드포인트"], "rows": [
["업무일지", "/api/worklogs", "목록/달력/검색/진척/CRUD/댓글/확인"],
["일정", "/api/schedules·/api/diaries·/api/attachments", "월 달력/검색/CRUD/파일업로드"],
["쪽지", "/api/messages", "수신/발신함·상세·삭제·미읽음"],
["통계", "/api/stats", "개인/전사 근무 피벗"],
["시스템관리", "/api/system/*", "roles·role-menus·menus·depts·companies·codes (65파일)"],
["로그인보조", "/api/auth/*", "signup·find-id·reset-password (무인증)"],
["2FA", "/api/hrm/auth/verify", "이메일 코드 검증 → access 발급"]
]},
{"title": "4. API 설계 — RBAC 권한(system)", "bullets": [
"응답 봉투 표준: { success, message, data }, 목록 페이로드 data.content(PageResponse)",
"roles: 목록/상세/생성/수정/다중삭제(IdsRequest)",
"menus·companies: 다중삭제(IdsRequest{ids}) — 행별 삭제는 {ids:[id]} 래핑",
"depts: 트리(/tree)·검색(/search)·단건삭제, codes: 그룹+값(values 내장 PUT)",
"role-menus: 역할-메뉴 권한 매핑 (HRM 전용 신규 — 좌 권한목록 / 우 메뉴체크)"
]},
{"type": "table", "title": "5. 화면 설계 — 관리자 웹 메뉴", "headers": ["구분", "화면"], "rows": [
["대시보드", "DashboardPage"],
["HR 본연", "사원·조직도·급여·근태·성과·채용·교육·AI·Admin"],
["UIMS 업무", "업무일지(WorklogList)·일정관리(ScheduleCalendar)·쪽지함(MessageBox)·업무통계(StatsPivot)"],
["시스템관리", "RoleManagement·RoleMenuManagement·CodeManagement·MenuManagement·DeptManagement·CompanyManagement·SystemPage(탭 셸)"],
["로그인", "LoginPage (2FA 코드 입력 + 회원가입/아이디찾기/비밀번호초기화 링크)"]
]},
{"type": "table", "title": "6. DB 스키마 — 주요 테이블", "headers": ["분류", "테이블"], "rows": [
["HR 본연", "hrm_users 외 27개 (CREATE TABLE IF NOT EXISTS, DROP 없음)"],
["UIMS 업무", "tb_uiws_worklog/_dtl/_cmt·tb_uiws_schedule·tb_uiws_diary·tb_uiws_attach·tb_uiws_message/_rcv"],
["UIMS 인증", "tb_uiws_login_verify (verify-token·코드 만료 300초)"],
["UIMS 시스템", "tb_uiws_dept/_role/_company/_code/_code_grp/_role_menu/_menu/_program/_sys_user (10개)"],
["멱등 ALTER", "hrm_users: email_verify_code/expire·login_fail_count·locked·otp_secret·approved·pw_change_yn"]
]},
{"title": "7. 보안 설계", "bullets": [
"인증: JWT + 2FA(이메일 코드). verify-token에 purpose=2fa 클레임 — verify 전 보호 API 접근 차단",
"로그인 실패 누적 5회 시 계정 잠금(locked), verify-token·코드 만료 각 300초",
"회원가입 승인 게이트: approved=false 로그인 차단 (기본 role=VIEWER)",
"PII: AES-256-GCM 암호화 저장. 비밀번호·임시비번·인증코드 — API 응답 0(메일·로그 채널만)",
"username·email 마스킹, 사용자 열거 방지(미존재여도 success=true), 스택트레이스 미노출"
]},
{"title": "8. RBAC / 인가 설계", "bullets": [
"SecurityConfig: /api/system/** 조회=SUPERADMIN/MANAGER, 쓰기=SUPERADMIN",
"/api/auth/** 및 GET /api/public/** = permitAll(로그인 전 무인증)",
"UiwsCurrentUser RBAC를 HRM 역할(SUPERADMIN/MANAGER)로 적응",
"프론트 AdminRoute: 토큰+역할 이중 가드(UI 차단) — 실제 인가는 백엔드 RBAC가 403으로 강제",
"User 중복회피: UIMS system 사용자는 별도 tb_uiws_sys_user로 격리(인사 사원 테이블 무충돌)"
]},
{"title": "9. 연계 / 인프라 설계", "bullets": [
"단일 JAR: 프론트 빌드 → backend/src/main/resources/static 번들",
"deploy_server.py guardia-hrm 블록(포트 8014) + load uiws schema(91·92 psql) 스텝",
"AI 연계: Ollama 온프레미스(이직예측·성과예측·채용추천·조직건강도·이력서분석·HR인사이트), LogMailSender 폴백(외부 API 0)",
"다크/라이트: index.css --uiws-* 토큰(OS 다크모드 자동 전환, 색상 하드코딩 0)"
]}
]
}