guardia-mall/doc/_content/mall_design_v2.json

77 lines
6.0 KiB
JSON

{
"solution": "GUARDiA Mall",
"doc_type": "설계서",
"out": "C:/GUARDiA/workspace/guardia-mall/doc/mall_설계서_v2.pptx",
"subtitle": "지오정보기술 / GUARDiA Platform / 2026 (v2)",
"design": {"primary":"1F3A5F","accent":"2E86C1","text":"222222","font_ko":"맑은 고딕"},
"sections": [
{"title":"1. 시스템 구성도", "bullets":[
"단일 JAR(React 19 빌드 → Spring Boot static, 포트 8011) · 프론트 개발 포트 3010.",
"DB: PostgreSQL 전용 데이터베이스 mall_db / 전용 계정 mall_user.",
"계정 모델: 고객/운영 단일 테이블 mall_account(역할 USER/ADMIN/MANAGER) + UIMS·시스템관리 별개 계정모델(tb_uiws_sys_user) 분리.",
"AI 엔진: Ollama 온프레미스(포트 11434) · 외부 API 미사용.",
"연계: GUARDiA CRM(회원)·ERP(재고/정산)·OCR(상품등록)·BI(매출분석)·ITSM(CS)."
], "note":"구성도 자리 (Client → Spring Boot(static+API) → MyBatis → PostgreSQL / Ollama / ITSM)"},
{"title":"2. 인증 / 보안 설계", "bullets":[
"인증: JWT 기반 + 2차 인증(2FA) — purpose=2fa 토큰 우회 차단(JwtFilter).",
"운영자 승인 게이트: 운영(ADMIN/MANAGER) 계정은 approved=false 시 로그인 차단. approved=NULL(기존·고객)은 게이트 미적용(회귀 0).",
"권한: RBAC(역할 기반 접근 제어) · 고객 쇼핑회원(USER)과 운영(ADMIN/MANAGER) 분리. /api/system/** = ADMIN/MANAGER, /api/public/** = permitAll.",
"운영자 로그인 보조: 회원가입(승인대기)·아이디찾기(부분 마스킹)·비밀번호초기화(임시비번 미노출·열거 방지 success=true).",
"자격증명 보호: 민감 자격증명 AES-256-GCM 암호화 저장(응답 미노출). 임시비번·존재여부 응답/로그 미포함.",
"감사: 주요 행위 감사로그 기록 · 에러 응답 스택트레이스 미노출(friendlyError).",
"보안 불변: IP/SSH/비밀번호/내부 자격증명 API 응답·로그 미노출."
]},
{"type":"table","title":"3. 주요 모듈 / API 영역",
"headers":["모듈","API 영역 설명"],
"rows":[
["스토어/배송권역","매장·ZIP 배송권역·매장별 재고 ON/OFF"],
["상품 카탈로그","상품/3사이즈/옵션"],
["주문/장바구니","장바구니·주문·타임슬롯 스케줄링·당일배송"],
["구독/프라이싱","정기 구독·서지(피크) 프라이싱"],
["배송/라우팅","배송·기사 라우팅·매장간 재고이양"],
["리뷰/CS","리뷰·고객 CS"],
["AI","상품추천·리뷰요약·자연어검색·CS응답·수요예측·재고이양추천(Ollama)"],
["로그인 보조 (v2)","/api/mall/auth: signup·find-id·reset-password (운영 계정 한정·permitAll)"],
["시스템관리 (v2)","/api/system: roles·role-menus·codes·menus·depts·companies (RBAC ADMIN/MANAGER)"],
["공개 룩업 (v2)","/api/public: 로그인 전 룩업(permitAll)"],
["UIMS 업무협업 (v2)","업무일지·일정·쪽지·업무통계 (com.zioinfo.mall.uiws.*)"]
]},
{"type":"table","title":"4. 화면 설계 — 메뉴 구성",
"headers":["영역","메뉴 / 화면"],
"rows":[
["[고객]","Home·Category·Search·Product Detail·Cart·Checkout·Subscription·Daily Standard·Events·Wishlist·Mypage·Orders·Review·CS"],
["[관리자]","Dashboard·Inventory·Orders(실시간)·Transfers·Loyalty·Events·Schedule·Analytics·User·Audit·Settings"],
["[관리자-시스템관리] (v2)","권한관리·역할별메뉴권한·공통코드·메뉴관리·부서관리·거래처관리 (/admin/uiws/system/*)"],
["[관리자-로그인] (v2)","운영자 가입·아이디 찾기·비밀번호 초기화(AdminLogin 하단 링크 + 모달)"],
["[업무협업 UIMS]","업무일지·일정·쪽지·업무통계"],
["[모바일]","고객앱(QR)·관리자앱(QR) · 앱 다운로드 QR(/admin/app)"]
]},
{"title":"5. DB 스키마 설계", "bullets":[
"전용 DB mall_db · 계정 mall_user (타 솔루션과 격리).",
"MyBatis XML 매퍼 + schema.sql 기반 스키마 정의.",
"초기화: sql.init(멱등 시드) + continue-on-error로 후행 테이블/컬럼 안정 적용. schema-locations에 91_uiws_port.sql · 92_uiws_system.sql 추가.",
"운영자 승인: mall_account에 approved BOOLEAN 멱등 ALTER(91_uiws_port.sql).",
"시스템관리(권한): tb_uiws_* 11개 테이블 CREATE IF NOT EXISTS 멱등(92_uiws_system.sql) — tb_uiws_sys_user 등 별개 계정모델로 mall_account/mall_member와 비병합(충돌 0).",
"공통(UIMS) 테이블(TB_*: 업무일지·일정·쪽지·통계) 멱등 이식."
], "note":"ERD 요약 자리 (도메인 엔티티 + UIMS 공통 TB_* + tb_uiws_* 권한 + 감사로그)"},
{"title":"6. AI / 연계 설계", "bullets":[
"AI: 상품추천·리뷰요약·자연어검색·CS응답·수요예측·재고이양추천(Ollama 온프레미스).",
"Ollama 클라이언트: 타임아웃·동시성 제한·폴백(미가용 시 degraded) 내장.",
"연계: GUARDiA CRM(회원)·ERP(재고/정산)·OCR(상품등록)·BI(매출분석)·ITSM(CS).",
"모든 AI 호출은 온프레미스(외부 전송 0) — 데이터 폐쇄망 보존.",
"메일/알림: LogMailSender 폴백(@Component) 재사용 — 비밀번호 초기화 안내 등 운영 메일."
], "note":"연계 시퀀스 자리"},
{"type":"table","title":"7. 배포 / 운영 설계",
"headers":["항목","값"],
"rows":[
["백엔드 포트","8011"],
["프론트 포트","3010"],
["데이터베이스","mall_db"],
["AI","Ollama 11434 (온프레미스)"],
["스키마 초기화","sql.init: 91_uiws_port.sql · 92_uiws_system.sql (멱등·continue-on-error)"],
["배포 방식","Gitea webhook → Jenkins/deploy_server → systemd 단일 JAR"],
["CI/CD","빌드(mvn+npm) → 단일 JAR → health 검증"]
]}
]
}