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