<aside> 🤖 AI 에이전트가 조직·정책을 자연어로 관리하는 엔터프라이즈 플랫폼
Java 25 · Spring Boot 4.1 · Spring AI MCP · React 19 · OAuth 2.1 · 1인 풀스택 개발
🌐 라이브 데모: https://omniadmin.parkjh.dev (admin / admin123!) 📦 GitHub 비공개 — 소스 코드 확인이 필요하시면 면접 시 시연 또는 별도 요청 부탁드립니다.
</aside>
<aside> 📊 BE / FE 파일: 167 Java / 133 TS·TSX API 엔드포인트: 153개 (20 도메인) 인증 방식: JWT + OAuth 2.1 (PKCE) + API Key + MCP (4중) AI 모델: Vertex AI Gemini 2.5 Flash (배포) / gemma-4-26B (개발 테스트) MCP: 11 Tools + 5 Resources + 6 Prompts 정책 캐시: ETag + Caffeine → DB 쿼리 0/분 설계 문서: ADR 24개 + 설계 문서 8건 DB 지원: H2 / MariaDB / Oracle / MSSQL Git 커밋: 98회+ 456건 매트릭스 테스트: 6모델 × 4도구셋 교차 검증 → gemma-4-26B 100% 정확도
</aside>
┌─────────────────────────────────────────────────────────────┐
│ OmniAdmin AI │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌─────────────┐ │
│ │ 웹 관리자 │ │PC 에이전트│ │ 외부 시스템│ │ AI 에이전트 │ │
│ │ (React) │ │ (REST) │ │ (OAuth) │ │(MCP/Claude) │ │
│ └────┬─────┘ └────┬─────┘ └────┬─────┘ └──────┬──────┘ │
│ │JWT │JWT │OAuth 2.1 │MCP │
│ ┌────┴─────────────┴─────────────┴────────────────┴──────┐ │
│ │ Spring Security (3 Filter Chains) │ │
│ │ /api/v1/** → HMAC JWT /mcp/** → RSA JWT + API Key │ │
│ │ /oauth2/** → Authorization Server │ │
│ └────────────────────────┬───────────────────────────────┘ │
│ │ │
│ ┌────────────────────────┴───────────────────────────────┐ │
│ │ 19 Domains: auth, org, user, policy, chat, search... │ │
│ └────────────────────────┬───────────────────────────────┘ │
│ │ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌────────────┐ │
│ │ Caffeine │ │ H2/Maria │ │ Spring AI│ │ Groq API │ │
│ │ Cache │ │ DB/Oracle│ │ MCP+LLM │ │ gemma2-9b │ │
│ └──────────┘ └──────────┘ └──────────┘ └────────────┘ │
└─────────────────────────────────────────────────────────────┘
요청 수신
│
├─ /mcp/** ──→ [체인 1] API Key 우선 → OAuth RSA JWT
│ X-API-Key → SHA-256 검증, IP 화이트리스트, 60/분
│ Bearer → RSA JWT 검증
│
├─ /oauth2/** ──→ [체인 2] Authorization Server
│ Auth Code + PKCE → RSA JWT 발급
│
└─ /api/v1/** ──→ [체인 3] Default SPA
HMAC JWT 검증 → SecurityContext
핵심: 모든 인증 방식이 동일한 SecurityContext로 통일
→ Service 코드가 인증 방식을 전혀 몰라도 됨
<aside> 🔑 접근 주체별 인증
▸ 웹 관리자 → JWT (HMAC-SHA256), access 30분 + refresh 7일 ▸ PC 에이전트 → JWT (HMAC-SHA256), Rate Limit 10/분, 계정잠금 5회 ▸ AI 에이전트 (MCP 표준) → OAuth 2.1 Auth Code + PKCE, RSA JWT ▸ AI 에이전트 (간편) → API Key (SHA-256 해시, 30일 미사용 자동 비활성) ▸ 외부 시스템 → OAuth 2.1 Client Credentials
</aside>
사용자 입력
├─ /slash 커맨드 (15개) → FE 즉시 처리 (토큰 0)
├─ WHERE/FIND/GOTO 인텐트 → NavRegistry 즉시 응답 (토큰 0)
└─ 자연어 질문 → BE → Groq LLM → AiToolBridge(8도구) → 응답
└─ LLM 불가 시 → 하드코딩 fallback (graceful degradation)
결과: 전체 질문의 ~70%를 토큰 0으로 처리 → 비용 70% 절감
<aside> 🔌 MCP Server (외부 AI 에이전트 연동)
▸ 엔드포인트: /mcp (Streamable HTTP) ▸ Tools 11개: searchUsers, savePolicies, globalSearch, resetPassword 등 ▸ Resources 5개: policy-templates, menu-tree, org-tree, codes, system-info ▸ Prompts 6개: search-users, change-policy, unlock-account 등 ▸ 글로벌 검색 (Ctrl+K): NavRegistry(FE 캐시) + 서버 8개 도메인 통합 검색
🌐 라이브 데모: http://powec.asuscomm.com:8085/mcp 🔑 API Key: omk_n59f07cqfsho3n056xfmww79q25ynjv07hdo1ibit7u63jk9
</aside>
<aside> 📈 AI 토큰 최적화 (70% 절감) ▸ 슬래시 커맨드 (~15%) → 토큰 0 ▸ WHERE/FIND/GOTO (~40%) → NavRegistry 즉시, 토큰 0 ▸ COUNT/인사말 (~15%) → BE 직접 처리, 토큰 0 ▸ 자연어 (~30%) → LLM 호출 + AiToolBridge truncate
정책 캐시 최적화 (DB 쿼리 0/분) ▸ 1000대 폴링 → Caffeine 캐시에서 ETag 반환 (DB 0회) ▸ 변경 시에만 캐시 refresh (DB 1회)
BE 성능 ▸ Virtual Threads · Caffeine PermissionCache O(1) · SlowApiMonitor(1초) ▸ HikariCP leak detection · JPA batch_size=50
</aside>