Skip to content

Commit 968c83e

Browse files
committed
chore: 주문 취소 관련 정보 제거
1 parent 2200fbc commit 968c83e

2 files changed

Lines changed: 117 additions & 51 deletions

File tree

README.md

Lines changed: 117 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ Spring Boot samples using the Agent2Agent (A2A) Protocol
55

66
| 모듈 | 포트 | 설명 |
77
|------|------|------|
8-
| **a2a-server/a2a-order-server** | 8081 | 주문 취소 에이전트 (ORD-* 처리) |
8+
| **a2a-server/a2a-order-server** | 8081 | 주문 취소 가능 여부 확인 에이전트 (ORD-* 처리) |
99
| **a2a-server/a2a-delivery-server** | 8082 | 배송 조회 에이전트 (TRACK-* 처리) |
1010
| **a2a-server/a2a-payment-server** | 8083 | 결제·환불 상태 에이전트 (주문 취소 시 환불 가능 여부 조회) |
1111
| **a2a-client** | 8080 | 진입점 + LLM 의도 분석 → 해당 에이전트 호출 |
@@ -14,37 +14,129 @@ Spring Boot samples using the Agent2Agent (A2A) Protocol
1414

1515
에이전트 간에는 **A2A 프로토콜**로만 통신합니다. 각 에이전트에 `a2a-java-sdk-client`를 넣고, 상대 에이전트의 Agent Card를 resolve한 뒤 `Client.sendMessage()`로 메시지를 보내고, 응답 Task의 artifact 텍스트를 파싱해 사용합니다.
1616

17-
- **주문 취소 시**: Order Agent가 **배송 에이전트****결제 에이전트****병렬**로 호출합니다. `[A2A-INTERNAL] delivery-status TRACK-xxx`로 배송 상태, `[A2A-INTERNAL] payment-status ORD-xxx`로 환불 가능 여부를 조회한 뒤, 배송중/배송완료이거나 환불 불가이면 취소 불가 메시지를 반환합니다.
18-
- **배송 조회 시**: Delivery Agent가 Order Agent에게 `[A2A-INTERNAL] order-info TRACK-xxx` 메시지를 보냅니다. 주문 에이전트는 `orderNumber:...`, `orderDate:...`, `status:...` 등 한 줄씩 응답하고, 배송 에이전트는 이걸 파싱해 조회 결과 아래에 주문 연동 정보를 붙여 반환합니다.
17+
### 주문 취소 가능 여부 확인 시
18+
19+
Order Agent는 다음 두 에이전트를 **병렬 호출**합니다:
20+
21+
- **Delivery Agent**
22+
- `[A2A-INTERNAL] delivery-status TRACK-xxx`
23+
- 배송 상태가 `배송중` 또는 `배송완료`이면 취소 불가
24+
25+
- **Payment Agent**
26+
- `[A2A-INTERNAL] payment-status ORD-xxx`
27+
- 환불 불가 상태이면 취소 불가
28+
29+
두 결과를 종합하여 최종 취소 가능 여부를 판단합니다.
30+
31+
## 배송 조회 시
32+
33+
Delivery Agent는 주문 정보를 함께 보여주기 위해\
34+
Order Agent에 내부 A2A 메시지를 보냅니다.
35+
36+
[A2A-INTERNAL] order-info TRACK-xxx
37+
38+
Order Agent는 운송장번호로 주문을 조회한 뒤, 다음과 같은 구조의 텍스트
39+
응답을 반환합니다:
40+
41+
orderNumber: ORD-1001
42+
orderDate: 2026-02-27
43+
status: PAID
44+
45+
Delivery Agent는 해당 응답을 파싱하여 배송 상태와 함께 주문 정보를
46+
결합해 최종 응답을 생성합니다.
47+
48+
49+
## 실행 방법
1950

2051
## 실행 방법
2152

22-
1. Order Agent 실행: `./gradlew :a2a-server:a2a-order-server:bootRun`
23-
2. Delivery Agent 실행: `./gradlew :a2a-server:a2a-delivery-server:bootRun` (별도 터미널)
24-
3. Payment Agent 실행: `./gradlew :a2a-server:a2a-payment-server:bootRun` (별도 터미널)
25-
4. Client 실행: `./gradlew :a2a-client:bootRun` (별도 터미널)
53+
1. Order Agent 실행:
54+
55+
./gradlew :a2a-server:a2a-order-server:bootRun
56+
57+
2. Delivery Agent 실행:
58+
59+
./gradlew :a2a-server:a2a-delivery-server:bootRun
60+
61+
3. Payment Agent 실행:
62+
63+
./gradlew :a2a-server:a2a-payment-server:bootRun
64+
65+
4. Client 실행:
2666

27-
### 직접 호출 (기존)
28-
- 배송 조회: `http://localhost:8080/api/delivery?trackingNumber=TRACK-1001`
29-
- 주문 취소: `http://localhost:8080/api/order/cancel?orderNumber=ORD-1001`
67+
./gradlew :a2a-client:bootRun
3068

31-
### 자유 문의 (LLM 라우팅)
32-
Client가 **Spring AI(OpenAI 호환)** 로 사용자 문의 의도를 분석한 뒤, 해당 A2A 에이전트를 호출합니다.
69+
## 직접 호출 (기존 방식)
3370

34-
**필수 환경 변수 (Client 실행 전):**
35-
- `OPENAI_API_KEY`: OpenAI API 키 (또는 OpenAI 호환 서비스 키)
36-
- Ollama 등 로컬 서버 사용 시: `OPENAI_BASE_URL=http://localhost:11434/v1` 등으로 설정
71+
- 배송 조회:
3772

38-
**요청 예:**
39-
```bash
40-
curl -X POST http://localhost:8080/api/chat \
41-
-H "Content-Type: application/json" \
42-
-d '{"message": "ORD-1001 주문 취소해줘"}'
73+
http://localhost:8080/api/delivery?trackingNumber=TRACK-1001
74+
75+
- 주문 취소 가능 여부 확인:
76+
77+
http://localhost:8080/api/order/cancel/check?orderNumber=ORD-1001
78+
79+
## 자유 문의 (LLM 라우팅)
80+
81+
Client는 Spring AI + Gemini를 사용하여\
82+
사용자 문의의 의도(intent)와 식별자를 분석한 뒤, 해당 A2A 에이전트를
83+
호출합니다.
84+
85+
### 분석 가능한 의도
86+
87+
- `order_cancellability_check`
88+
- `delivery_track`
89+
- `both`
90+
- `unclear`
91+
92+
## 필수 환경 변수 (Client 실행 전)
93+
94+
- `GEMINI_API_KEY`: Google Gemini API 키
95+
96+
### application.yml 예시
97+
98+
``` yaml
99+
spring:
100+
ai:
101+
gemini:
102+
api-key: ${GEMINI_API_KEY}
103+
chat:
104+
options:
105+
model: gemini-1.5-pro
106+
temperature: 0.0
43107
```
44-
```bash
45-
curl -X POST http://localhost:8080/api/chat \
46-
-H "Content-Type: application/json" \
47-
-d '{"message": "TRACK-1001 배송 어디쯤이야?"}'
108+
109+
## 요청 예
110+
111+
### 주문 취소 가능 여부 확인
112+
113+
``` bash
114+
curl -X POST http://localhost:8080/api/chat -H "Content-Type: application/json" -d '{"message": "ORD-1001 취소 가능해?"}'
48115
```
49116
50-
**흐름:** 사용자 문의 → LLM 의도/엔티티 분석 → Order/Delivery 에이전트 A2A 호출 → 결과 반환
117+
### 배송 조회
118+
119+
``` bash
120+
curl -X POST http://localhost:8080/api/chat -H "Content-Type: application/json" -d '{"message": "TRACK-1001 배송 어디쯤이야?"}'
121+
```
122+
123+
## 전체 흐름
124+
125+
사용자 문의
126+
127+
Gemini (의도 + 식별자 추출)
128+
129+
A2A Client 라우팅
130+
131+
Order / Delivery Agent 호출
132+
133+
필요 시 내부 A2A 병렬 호출
134+
135+
최종 응답 반환
136+
137+
## 특징
138+
139+
- LLM은 실제 취소를 실행하지 않음
140+
- Order Agent가 취소 가능 여부만 판단
141+
- 에이전트 간 통신은 HTTP 직접 호출이 아닌 **A2A 프로토콜**
142+
- 내부 병렬 호출을 통한 마이크로 에이전트 협력 구조

a2a-server/a2a-order-server/src/main/java/com/github/cokelee777/orderagentserver/db/OrderDatabase.java

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -15,32 +15,6 @@ public class OrderDatabase {
1515
"2026-02-25 07:00", "TRACK-3003")
1616
));
1717

18-
public static String cancel(String orderNumber) {
19-
OrderInfo info = ORDERS.get(orderNumber);
20-
if (info == null) {
21-
return "[취소 실패] 주문번호 '" + orderNumber + "'에 해당하는 주문을 찾을 수 없습니다.";
22-
}
23-
24-
if ("배송중".equals(info.status()) || "배송완료".equals(info.status())) {
25-
return String.format(
26-
"[취소 불가]\n주문번호: %s\n상품명: %s\n현재상태: %s\n사유: %s 상태에서는 주문을 취소할 수 없습니다. 고객센터에 문의해주세요.",
27-
info.orderNumber(), info.productName(), info.status(), info.status()
28-
);
29-
}
30-
31-
OrderInfo cancelled = new OrderInfo(
32-
info.orderNumber(), "취소완료", info.productName(),
33-
info.price(), info.orderDate(), info.trackingNumber()
34-
);
35-
ORDERS.put(orderNumber, cancelled);
36-
37-
return String.format(
38-
"[주문 취소 완료]\n주문번호: %s\n상품명: %s\n결제금액: %,d원\n주문일시: %s\n환불 예정: 영업일 기준 3~5일 내 환불됩니다.",
39-
cancelled.orderNumber(), cancelled.productName(),
40-
cancelled.price(), cancelled.orderDate()
41-
);
42-
}
43-
4418
public static Optional<OrderInfo> findByOrderNumber(String orderNumber) {
4519
return Optional.ofNullable(ORDERS.get(orderNumber));
4620
}

0 commit comments

Comments
 (0)