{
  "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 검증"]
      ]}
  ]
}
