# guardia-esn-orchestrator ## 역할 레거시 ESL(전자 가격표) 관리 시스템(`workspace/esn/` 6개 프로젝트 — Spring Boot 1.5 + Java 8 + Thymeleaf)을 Spring Boot 3.5 + Java 17 + React 19 + PostgreSQL 단일 플랫폼으로 통합한 `workspace/guardia-esn/` 프로젝트를 운영·확장하는 오케스트레이터 스킬. ## 트리거 "guardia-esn", "ESN 통합", "ESL 플랫폼", "전자가격표", "HCore", "POS 변환", "PosCvt", "ESN 알람", "ESL 템플릿", "업데이트 큐", "다시 실행", "업데이트" 요청 시 이 스킬을 사용하라. ## 프로젝트 정보 - **위치:** `C:\GUARDiA\workspace\guardia-esn\` - **포트:** backend:8016 (단일 JAR, Vite 번들) - **DB:** `guardia_esn_db` / `guardia_esn_user` / `guardia_esn_pass2026` - **패키지:** `com.zioinfo.esn` - **멀티테넌트:** `tenant_code VARCHAR(20)` — LGINNOTEK / LGIT / EMART / ZIOINFO - **Gitea:** `http://git.zioinfo.co.kr/zio/guardia-esn` - **서버:** `101.79.17.164` `/opt/guardia-esn/` ## 레거시 소스 (C:\GUARDiA\workspace\esn\) | 레거시 프로젝트 | 용도 | 현대화 대상 | |----------------|------|------------| | ESN_WEB_ZIOINFO | ZIOINFO ESL 웹 관리 (Thymeleaf) | → React 19 관리자 웹 | | ESN_WEB_LGInnotek | LG Innotek ESL 웹 (Thymeleaf) | → 멀티테넌트 LGINNOTEK | | ESN_DAEMON_EMART | 이마트 ESL 데몬 | → EMART 테넌트 | | ESN_DAEMON_LGIT | LG IT ESL 데몬 | → LGIT 테넌트 | | esn | ESN 코어 (Maven) | → 도메인 모델 | | ESL_AUTO_UPDATE | 펌웨어 자동 업데이트 | → firmware 도메인 | | restapi_lgit | LGIT REST API | → API 통합 | | UCS_LGU | UCS 시스템 | → HCore 통합 | ## 아키텍처 ``` 레거시 ESL 8개 프로젝트 (Spring Boot 1.5 + Java 8 + Thymeleaf) ↓ 현대화 guardia-esn (Spring Boot 3.5 + Java 17 + React 19 + PostgreSQL) backend:8016 ←→ frontend static bundle (단일 JAR) ↕ ITSM:9001 · Ollama:11434 ``` ## 도메인 개념 | 도메인 | 테이블 | 설명 | |--------|--------|------| | Tenant | esn_tenants | 멀티테넌트 — LGINNOTEK·LGIT·EMART·ZIOINFO | | StoreGroup | esn_store_groups | 매장 그룹 | | Store | esn_stores | 매장 (tenantCode 격리) | | Template | esn_templates | ESL 표시 템플릿 | | PosCvt | esn_pos_cvt | POS→ESL 가격 변환 데이터 | | Alarm / AlarmHistory | esn_alarms | 장치 알람·이력 | | HCore | esn_hcores | 게이트웨이/허브 장치 | | WorkHistory | esn_work_history | 작업 이력 | | Firmware | esn_firmware | 장치 펌웨어 | | User | esn_users | 사용자 (멀티테넌트 RBAC) | | Product | esn_products | 상품 가격 | | TagBinding | esn_tag_bindings | ESL 태그↔상품 바인딩 | | UpdateQueue | esn_update_queue | 업데이트 큐 | ## 에이전트 팀 | 에이전트 | 역할 | |----------|------| | `esn-backend-dev` | Spring Boot 3.5 백엔드 — 도메인·매퍼·서비스·컨트롤러 | | `esn-frontend-dev` | React 19 + Vite + TypeScript — 관리자 웹 | | `esn-devops-dev` | Gitea·deploy·Jenkinsfile·setup·홈페이지 | | `esn-qa` | API 통합 테스트 + 크로스 경계면 검증 | ## 구현 원칙 (GUARDiA 불변 규칙) 1. `@MapperScan(annotationClass = Mapper.class)` — basePackages 아님 2. Hikari `maximum-pool-size=3` — 공유 PG 서버 3. repos에 `fresh git init` — 모노레포 .git 상속 금지 4. 단일 JAR: 프론트 빌드 → `backend/src/main/resources/static/` → mvn package 5. Ollama 폴백: 연결 실패 시 기본 응답 반환 (예외 던지지 않음) 6. admin 시드: bcrypt `$2a$12$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LnCWh7Vz.Xm` (admin/admin123) 7. API 응답에 `password_hash`, 자격증명 필드 절대 미포함 8. AES-256-GCM 자격증명 암호화 저장 9. SecurityConfig에 static 리소스 `permitAll` 필수 (SPA 403 방지) ## 파일 구조 ``` workspace/guardia-esn/ ├── .claude/ │ ├── agents/ │ │ ├── esn-backend-dev.md │ │ ├── esn-frontend-dev.md │ │ ├── esn-devops-dev.md │ │ └── esn-qa.md │ └── skills/guardia-esn-orchestrator/SKILL.md ├── CLAUDE.md ├── Jenkinsfile ├── backend/ │ ├── pom.xml │ └── src/main/ │ ├── java/com/zioinfo/esn/ │ │ ├── EsnApplication.java (@MapperScan(annotationClass=Mapper.class)) │ │ ├── auth/ │ │ ├── common/ │ │ ├── config/ (SecurityConfig, WebConfig, CryptoUtil, OllamaClient) │ │ ├── domain/ (VO 클래스) │ │ ├── mapper/ (@Mapper 인터페이스) │ │ ├── service/ │ │ └── controller/ │ └── resources/ │ ├── application.yml │ ├── mapper/*.xml │ ├── db/schema.sql │ └── static/ (Vite 빌드 산출물) └── frontend/ ├── package.json ├── vite.config.ts └── src/ ├── App.tsx ├── api/client.ts ├── components/ └── pages/ (15개 관리자 화면) ``` ## 변경 이력 | 날짜 | 내용 | 사유 | |------|------|------| | 2026-06-16 | 초기 하네스 구성 + 통합 소스 생성 | 레거시 ESN 8개 프로젝트 → 단일 현대화 플랫폼 |