docs: refresh project README
All checks were successful
Deploy to OCIWP / deploy (push) Successful in 2m1s
All checks were successful
Deploy to OCIWP / deploy (push) Successful in 2m1s
This commit is contained in:
623
README.md
623
README.md
@@ -1,154 +1,469 @@
|
|||||||
# DAP Backend
|
# AX HUB MCP Tool
|
||||||
|
|
||||||
Spring Boot 기반 DAP 관리자 백엔드 API 서버 및 MCP(Model Context Protocol) Gateway / Tool 분산 서버 프로젝트 입니다.
|
신한라이프 업무 시스템과 AI Agent를 연결하는 MCP(Model Context Protocol) Gateway 및 Tool 서버 프로젝트입니다.
|
||||||
|
|
||||||
---
|
Agent는 Gateway에서 Tool 목록과 입력 명세를 받고, Gateway는 권한과 정책을 확인한 뒤 Tool 서버로 요청을 전달합니다. 업무 Tool은 `DTO → UseCase → Converter → MCI/EAI Client` 구조로 레거시 시스템을 호출합니다.
|
||||||
|
|
||||||
## 아키텍처 개요 (Architecture Overview)
|
## 전체 흐름
|
||||||
|
|
||||||
DAP Backend는 2개의 주요 애플리케이션으로 분리 운영됩니다:
|
```text
|
||||||
|
AI Agent / MCP Client
|
||||||
1. **MCP Gateway (`DapGatewayApplication`)**: 외부 LLM(Claude, GPT 등) 서버의 MCP 통신을 받아, 내부 Tool 서버들로 분배(라우팅)하는 허브 서버이자 관리자 웹(Scaffolder)을 제공하는 통합 서버 (포트: 8081)
|
│
|
||||||
2. **MCP Tool (`DapTool*Application`)**: 실제 레거시 시스템(MCI, EAI 등)과 통신하여 비즈니스 로직(결제, 휴가신청 등)을 수행하는 어댑터 서버 (포트: 8082~8085 등 분산 구성 가능)
|
▼
|
||||||
|
MCP Gateway (dap-gateway)
|
||||||
---
|
├─ Tool 목록·스키마 제공
|
||||||
|
├─ Tool 권한·승인·가드레일 확인
|
||||||
## 환경 (Environment)
|
├─ Redis Registry 및 실행 추적
|
||||||
|
└─ 대상 Tool 서버로 라우팅
|
||||||
| 항목 | 버전 |
|
│
|
||||||
|------|------|
|
▼
|
||||||
| Java | 21 |
|
Tool Server (dap-tool-sms / dap-tool-oth)
|
||||||
| Spring Boot | 4.0.5 |
|
└─ BusinessToolController
|
||||||
| Build Tool | Gradle |
|
│
|
||||||
| 주요 기술 스택 | MyBatis, Lombok, MapStruct, P6Spy |
|
▼
|
||||||
| 데이터베이스 | H2 (in-memory, 로컬 개발용) |
|
UseCase → Converter → MCI/EAI Client → 레거시 시스템
|
||||||
| 세션/캐시 저장소 | Redis |
|
```
|
||||||
| **장애 격리 / 제어** | **Resilience4j (RateLimiter, CircuitBreaker, Retry)** |
|
|
||||||
| **메시지 큐** | **Kafka (트래픽 폭주 시 대기열 전환용)** |
|
## 현재 구조와 목표 구조
|
||||||
|
|
||||||
---
|
현재는 Gateway와 두 개의 Tool 애플리케이션으로 구성됩니다.
|
||||||
|
|
||||||
## ▶ 실행 방법 (How to Run)
|
```text
|
||||||
|
현재: Gateway + SMS Tool Pod + OTH Tool Pod
|
||||||
### 1. Gateway & Tool 서버 실행 (MCP 연동용)
|
목표: Gateway + 고객 Pod + 영업 Pod + 지급/납입 Pod + 알림 Pod + 인사 Pod + 공통 Pod
|
||||||
- **Gateway 서버 기동:**
|
```
|
||||||
- `./gradlew :dap-gateway:bootRun`
|
|
||||||
- **Tool 서버 기동:**
|
`dap-tool-oth`에는 여러 업무 카테고리가 함께 있습니다. AA 협의 후에는 부서·업무 소유권 단위로 Tool 서버, 이미지, Pod, 배포 파이프라인을 분리합니다. 이 목표 구조는 향후 전환 방향이며 현재 구현 완료 상태가 아닙니다.
|
||||||
- `./gradlew :dap-tool-oth:bootRun` (또는 dap-tool-payment 등)
|
|
||||||
- Tool 서버가 기동되면 자동으로 Gateway(8081)에 자신을 등록(Auto-Registration)합니다.
|
## Gradle 멀티모듈
|
||||||
- **(선택) 특정 Tool 그룹만 실행하기:**
|
|
||||||
- 업무 특성에 따라 세분화된 그룹에 속한 Tool만 띄우고 싶다면, 실행 인수에 `--mcp.tool.target=그룹명`을 추가합니다.
|
| 모듈 | 역할 | 실행 포트 |
|
||||||
- **지원되는 그룹명:**
|
|---|---|---:|
|
||||||
- `NOTIFICATION`: 이메일, SMS 발송
|
| `dap-gateway` | MCP 진입점, Tool Registry, 라우팅, 권한·가드레일, Chat API | 8081 |
|
||||||
- `CLAIM`: 청구 처리, 심사 상태 조회
|
| `dap-tool-core` | 공통 어노테이션, Controller, JSON Schema, MCI/EAI 지원, 보안·로깅 공통 기능 | 라이브러리 |
|
||||||
- `POLICY`: 증권 발행, 발행 가능 여부 조회
|
| `dap-tool-sms` | SMS/알림 Tool 서버 | 8082 |
|
||||||
- `HR`: 휴가 등록, 연차 갯수 조회
|
| `dap-tool-oth` | 공통·업무·샘플·MCI Tool 서버 | 8084 |
|
||||||
- `CONTRACT`: 계약 상태, 계약 상세 조회
|
|
||||||
- `CUSTOMER`: 고객 등급, 고객 상세 정보 조회
|
기술 기준은 Java 21, Spring Boot 4, Gradle, Spring AI MCP Server, Redis, MapStruct, MyBatis, Resilience4j입니다.
|
||||||
- `SAMPLE`: 날씨, 환율, 명언 조회 등 외부 연동 샘플
|
|
||||||
- IntelliJ IDEA: `Run/Debug Configurations`에서 `DapTool*Application` 의 `Program arguments` 에 `--mcp.tool.target=NOTIFICATION` 입력
|
## 환경 (Environment)
|
||||||
|
|
||||||
|
| 항목 | 버전 / 기준 |
|
||||||
---
|
|---|---|
|
||||||
|
| Java | 21 |
|
||||||
## 🤖 AI Agent 연동 아키텍처 (MCP & Agent Builder)
|
| Spring Boot | 4.0.5 |
|
||||||
|
| Gradle Wrapper | 8.14.3 |
|
||||||
본 시스템은 **투트랙(Two-Track) AI 연동 아키텍처**를 제공하여 로컬 개발 환경과 프로덕션 환경 모두를 완벽하게 지원합니다.
|
| Spring AI BOM | 2.0.0 |
|
||||||
|
| Spring AI MCP Server | `spring-ai-starter-mcp-server-webmvc` |
|
||||||
### 1. 로컬 코딩 AI (Antigravity, Cursor, Claude Desktop 등) 연동
|
| Redis Client | Lettuce 6.6.0.RELEASE |
|
||||||
표준 MCP 통신(Stdio)을 요구하는 로컬 AI 에이전트를 위해 자바 기반의 브릿지 스크립트(`McpBridge.java`)를 내장하고 있습니다. 브릿지가 Stdio 요청을 HTTP로 변환하여 로컬 환경의 Gateway(포트: 8281)로 전달합니다.
|
| Resilience | Resilience4j 2.2.0 |
|
||||||
|
| MyBatis Spring Boot Starter | 3.0.3 |
|
||||||
- **설정 방법**: IDE의 `mcp_config.json` 설정 파일에 아래와 같이 등록합니다.
|
| MapStruct | 1.5.5.Final |
|
||||||
```json
|
| Lombok | 1.18.32 |
|
||||||
"mcpServers": {
|
| JSON Schema Validator | networknt 1.4.0 |
|
||||||
"dap-gateway": {
|
| OpenAPI UI | springdoc 2.5.0 |
|
||||||
"command": "java",
|
| 컨테이너 실행 | Docker Compose |
|
||||||
"args": ["C:/절대경로/dap-backend-main/McpBridge.java"]
|
|
||||||
}
|
프로젝트는 JDK 21을 기준으로 컴파일됩니다. IntelliJ에서는 Project SDK, Gradle JVM, Run Configuration JRE를 모두 JDK 21로 맞춰야 합니다.
|
||||||
}
|
## 5분 빠른 시작
|
||||||
```
|
|
||||||
- **특정 카테고리 툴 필터링**: `McpBridge.java` 내부의 URI 파라미터(`?categoryKey=sample` 등)를 수정하여 원하는 도메인의 툴만 선택적으로 AI에게 학습시킬 수 있습니다.
|
Docker와 JDK 21이 준비된 로컬 개발 환경 기준입니다.
|
||||||
|
|
||||||
### 2. 프로덕션 클라우드 AI (Google Cloud Agent Builder 등) 연동
|
```powershell
|
||||||
실제 라이브 서비스에서 동작하는 클라우드 Agent Builder는 REST API 기반의 OpenAPI Spec을 요구합니다.
|
# 1. Redis와 MCI Mock만 먼저 실행
|
||||||
`dap-gateway`는 이미 **Agent Builder 규격의 REST API(`/mcp/api/v1/tools/call`)를 네이티브로 제공**하므로, 별도의 브릿지나 어댑터 없이 Endpoint URL과 Swagger(OpenAPI) 문서만 클라우드 콘솔에 등록하면 즉시 라이브 챗봇/에이전트로 서비스할 수 있습니다.
|
$env:ACTIVE_PROFILE = 'local'
|
||||||
|
docker compose up -d redis mci-mock
|
||||||
---
|
|
||||||
|
# 2. Gateway 실행 (새 PowerShell)
|
||||||
## 비공개 Tool 관리 및 Fallback 연동 (Visibility & Routing)
|
$env:SPRING_PROFILES_ACTIVE = 'local'
|
||||||
|
$env:OPENROUTER_API_KEY = '<개발용 비밀 저장소의 키>'
|
||||||
저희 시스템은 MSA 보안 및 아키텍처 원칙에 따라 Tool의 **레지스트리 등록 여부(라우팅)**와 **API 노출 여부(가시성)**를 완벽히 분리하여 관리합니다.
|
.\gradlew.bat :dap-gateway:bootRun
|
||||||
|
|
||||||
1. **`visible = false`**:
|
# 3. OTH Tool 실행 (또 다른 PowerShell)
|
||||||
레지스트리에 정상적으로 등록되어 게이트웨이가 동적으로 라우팅하지만, 클라이언트에게 제공되는 `/tools/list` API 목록에서는 숨겨집니다.
|
$env:SPRING_PROFILES_ACTIVE = 'local'
|
||||||
2. **`register = false`**:
|
$env:AXHUB_GATEWAY_URL = 'http://localhost:8081'
|
||||||
내부 레지스트리(Redis)에 툴 정보를 등록하지 않습니다 (외부 레지스트리를 독자적으로 사용할 경우 등).
|
$env:AXHUB_TOOL_URL = 'http://localhost:8084'
|
||||||
이 경우 게이트웨이는 `application.yml`의 `mcp.gateway.fallback.routes` 설정을 참조하여 **Fallback 정적 라우팅**을 수행하므로 연동이 100% 보장됩니다.
|
.\gradlew.bat :dap-tool-oth:bootRun
|
||||||
|
```
|
||||||
```java
|
|
||||||
@McpFunction(
|
Tool 서버가 기동된 뒤 아래 URL로 등록된 Tool 목록을 확인합니다.
|
||||||
name = "secret_tool",
|
|
||||||
visible = false, // 목록 숨김 여부 (기본값: true)
|
```text
|
||||||
register = false // 내부 Redis 등록 여부 (기본값: true)
|
http://localhost:8081/mcp/api/v1/tools/list
|
||||||
)
|
```
|
||||||
```
|
|
||||||
|
SMS Tool도 함께 확인하려면 별도 PowerShell에서 아래 명령을 실행합니다.
|
||||||
---
|
|
||||||
|
```powershell
|
||||||
## 🛡️ 시스템 안정성 및 네트워크 제어 (Resilience & Network)
|
$env:SPRING_PROFILES_ACTIVE = 'local'
|
||||||
|
$env:AXHUB_GATEWAY_URL = 'http://localhost:8081'
|
||||||
MSA 및 외부 시스템(MCI) 연동 환경의 안정성을 위해 완벽한 3-Tier 방어 체계를 구축했습니다.
|
$env:AXHUB_TOOL_URL = 'http://localhost:8082'
|
||||||
|
.\gradlew.bat :dap-tool-sms:bootRun
|
||||||
1. **Gateway 라우팅 방어 (Timeout & Fallback):**
|
```
|
||||||
- MCP 라우터(`McpRouterController`) 단에 1초 타임아웃을 강제 적용하여 특정 Tool Pod의 응답 지연이 전체 시스템 장애로 이어지는 것을 방지하고 신속하게 정적 Fallback 라우팅으로 전환합니다.
|
|
||||||
2. **MCI 네트워크 안정화 (HTTP/1.1 Downgrade):**
|
전체 컨테이너 환경이 필요하면 개별 실행 대신 다음 한 줄을 사용합니다.
|
||||||
- 기존 HTTP/2 사용 시 레거시 시스템 연동 중 간헐적으로 발생하던 `RST_STREAM` 오류를 원천 차단하기 위해, MCI 전용 `HttpEimsSender`에는 고도로 최적화된 **HTTP/1.1 전용 커넥션 풀(Factory)**이 고정 적용되어 네트워크 단절을 방지합니다.
|
|
||||||
3. **Resilience4j 기반 트래픽 제어:**
|
```powershell
|
||||||
- **Gateway 계층 (동적 방어):** Tool 등록 시 제출된 SLA 메타데이터를 기반으로 동적 CircuitBreaker 및 RateLimiter를 가동하며, 한계치 초과 시 Kafka 큐로 비동기 전환합니다.
|
$env:ACTIVE_PROFILE = 'local'
|
||||||
- **Tool 계층 (정적 방어):** 레거시 커넥터 내부에 `@CircuitBreaker`, `@RateLimiter` 어노테이션 기반의 장애 전파 차단 로직이 2차적으로 가동됩니다.
|
docker compose up -d --build
|
||||||
|
```
|
||||||
---
|
## Tool 등록과 실행
|
||||||
|
|
||||||
## 모듈(Pod) 및 Tool 코드 자동 생성 (Scaffolders)
|
### 등록과 목록 제공
|
||||||
|
|
||||||
새로운 도메인의 기능을 추가할 때 발생하는 반복적인 설정(보일러플레이트, 설정 파일 복사 등)을 1초 만에 자동화하기 위해 **DAP Developer Portal (Web UI)** 및 **CLI 스캐폴더 2종**을 제공합니다.
|
1. Tool 서버 기동 시 `ToolRegistryHeartbeatSender`가 `@McpTool`, `@McpFunction`을 스캔합니다.
|
||||||
|
2. Tool 이름, 설명, 입력 JSON Schema, `categoryKey`, 연동 방식, 실행 URL을 메타데이터로 생성합니다.
|
||||||
### 1. DAP Developer Portal (Web UI) - 가장 추천하는 방식!
|
3. Gateway Redis Registry에 등록·Heartbeat 정보를 전송합니다.
|
||||||
이제 더 이상 터미널에서 명령어를 칠 필요가 없습니다. Gateway 모듈에 내장된 웹 화면에서 빈칸만 채우면 신한라이프 패키지 개발 가이드에 맞춘 코드가 마법처럼 찍혀 나옵니다.
|
4. Agent와 관리 화면은 Gateway에서 Tool 목록과 명세를 조회합니다.
|
||||||
|
|
||||||
1. **접속 방법**: Gateway 서버 기동 후 브라우저에서 `http://localhost:8081/admin/scaffold.html` 접속
|
### 실행
|
||||||
2. **Pod (모듈) 생성 탭**: 모듈명(예: hr)과 포트만 입력하면 독립적인 Spring Boot 모듈이 디렉토리부터 빌드 스크립트까지 완벽히 생성됩니다.
|
|
||||||
3. **Tool (기능) 생성 탭**: 생성된 모듈에 새로운 툴 코드를 자동으로 주입합니다.
|
1. Agent가 Gateway에 Tool 이름과 입력값을 보냅니다.
|
||||||
- **MCI 연동 기반 툴 생성**: 4자리 시스템 코드(예: `nclg`)를 기반으로 알맞은 패키지에 `MciNclgClient`, `Converter`, `_I`, `_O` 파일이 정확하게 생성됩니다.
|
2. Gateway가 Tool 존재 여부, 허용 Tool, 쓰기 승인, 가드레일을 확인합니다.
|
||||||
- **완벽한 보일러플레이트 자동화**: `UseCaseImpl` 내부에 컴포넌트(`Client`, `Converter`)가 자동으로 의존성 주입되며, Java 15 Text Block을 활용해 들여쓰기(Indentation)까지 완벽히 정렬된 코드를 제공합니다.
|
3. Gateway가 Tool 서버의 `/mcp/{toolName}`으로 요청을 전달합니다.
|
||||||
|
4. `BusinessToolController`가 Tool 메서드를 찾아 DTO로 변환하고 JSON Schema를 검증합니다.
|
||||||
### 2. CLI 스캐폴더 (기존 터미널 방식)
|
5. UseCase가 업무 흐름을 수행합니다.
|
||||||
웹 화면을 사용할 수 없는 환경이거나 터미널이 익숙한 경우, 아래 명령어를 통해 CLI 마법사를 사용할 수 있습니다.
|
6. Converter가 업무 DTO를 인터페이스 ID 기반 MCI 요청 DTO로 변환합니다.
|
||||||
|
7. MCI/EAI Client가 레거시를 호출하고 결과를 Tool 응답으로 반환합니다.
|
||||||
### 1⃣ 새로운 Pod(모듈) 전체를 생성할 때: `PodScaffolder`
|
|
||||||
새로운 도메인(예: 결제, HR)을 위한 완전히 독립적인 Spring Boot 모듈을 생성합니다. 폴더 구조, 빌드 스크립트, 각종 프로퍼티 및 도커 설정까지 완벽하게 세팅됩니다.
|
## 주요 URL
|
||||||
|
|
||||||
```bash
|
로컬에서 Gateway를 직접 실행할 때의 기준입니다. Docker Compose를 사용하면 Gateway 호스트 포트는 `8281`입니다.
|
||||||
# 사용법: javac로 컴파일 후 실행
|
|
||||||
javac -encoding UTF-8 dap-common/src/main/java/io/shinhanlife/dap/common/util/PodScaffolder.java
|
| 용도 | 메서드 | URL |
|
||||||
java -cp dap-common/src/main/java io.shinhanlife.dap.lib.util.PodScaffolder [모듈명] [포트번호]
|
|---|---|---|
|
||||||
|
| Tool 목록 | `GET` | `http://localhost:8081/mcp/api/v1/tools/list` |
|
||||||
# 실행 예시 (dap-tool-hr 모듈을 8086 포트로 생성)
|
| Tool 실행 | `POST` | `http://localhost:8081/mcp/api/v1/tools/call` |
|
||||||
java -cp dap-common/src/main/java io.shinhanlife.dap.lib.util.PodScaffolder hr 8086
|
| Tool Markdown 문서 | `GET` | `http://localhost:8081/mcp/api/v1/tools/docs/markdown` |
|
||||||
```
|
| 카테고리별 SSE MCP 연결 | `GET` | `http://localhost:8081/mcp/sse/{categoryKey}` |
|
||||||
|
| 카테고리별 MCP 호출 채널 | `POST` | `http://localhost:8081/mcp/custom/{categoryKey}` |
|
||||||
### 2⃣ 생성된 모듈에 새로운 툴(Function)을 추가할 때: `ToolScaffolder`
|
| Chat 스트리밍 API | `POST` | `http://localhost:8081/api/chat` |
|
||||||
어노테이션(`@McpTool`, `@McpFunction`)이 완벽히 달린 Service와 입출력 DTO 코드를 지정된 모듈 패키지 룰에 맞춰 자동 생성합니다.
|
| Scaffold API | `POST` | `http://localhost:8081/api/v1/scaffold/pod` 또는 `/tool` |
|
||||||
|
|
||||||
```bash
|
`/mcp/sse/{categoryKey}`는 SSE 연결을 여는 전송 경로이고, `/mcp/custom/{categoryKey}`는 같은 카테고리의 MCP 요청을 처리하는 호출 경로입니다. 두 URL은 역할이 다릅니다.
|
||||||
# 사용법: javac로 컴파일 후 실행
|
|
||||||
javac -encoding UTF-8 dap-common/src/main/java/io/shinhanlife/dap/common/util/ToolScaffolder.java
|
## Tool 개발 표준
|
||||||
java -cp dap-common/src/main/java io.shinhanlife.dap.lib.util.ToolScaffolder [Tool이름] [인터페이스ID] "[기능설명]" "[그룹명]" "[통신방식]" "[모듈명]"
|
|
||||||
|
| 구성 요소 | 책임 |
|
||||||
# 실행 예시 (payment 모듈에 결제 승인 기능 추가)
|
|---|---|
|
||||||
java -cp dap-common/src/main/java io.shinhanlife.dap.lib.util.ToolScaffolder PaymentApproval PAY_001 "결제 승인 처리 기능" "COMMON" "HTTP" "dap-tool-payment"
|
| `XxxRequest`, `XxxResponse` | Agent/Tool 관점의 입력·응답 DTO |
|
||||||
```
|
| `XxxUseCase` | Tool 계약과 MCP 메타데이터 선언 |
|
||||||
|
| `XxxUseCaseImpl` | 업무 흐름 조합과 Client 호출 |
|
||||||
---
|
| `XxxConverter` | 업무 DTO와 레거시 인터페이스 DTO 사이 변환 |
|
||||||
|
| `MciXxxClient` | Glow/MCI 또는 EAI 통신 호출 |
|
||||||
| |||||||