๋ณธ ์ ์ฅ์๋ Google Cloud์ GECX (CX Agent Studio) ํ๋ซํผ ์์์ ์ ์๊ธฐ์ ์ค๋งํธ ๊ฐ์ ๋ ํ ์๊ธ ๋ถ์ ์์ฑํ AI ์์ด์ ํธ๋ฅผ ๊ตฌ์ฑํ๊ณ ๋ฐฐํฌํ๊ธฐ ์ํ ๋ ๋ฆฝ ์คํํ ํจํค์ง์ด์ ๋ฐฐํฌ ์ค๋ช ์์ ๋๋ค.
์ด ํจํค์ง๋ ํ๋ซํผ ์ด๊ด์ ํ์์ ์ธ ํต์ฌ ํ์ด์ฌ ์ปค์คํ ๋๊ตฌ ๋ฐ ํ๋กฌํํธ ์ธ์คํธ๋ญ์ , ๋ชจ์ ์๊ธ API ์๋ฒ ์์ค ์ฝ๋๋ฅผ ํฌํจํ๊ณ ์์ผ๋ฉฐ, ๋๊ตฌ๋ ์ง ๋ณต์ (Clone)ํ์ฌ ์์ฝ๊ฒ ์ฝ์ ๊ตฌ์ถ ํ ์คํธ๋ฅผ ์ํํ ์ ์๋๋ก ์์ ํ ์๋์ ์ธ ๊ตฌ์กฐ๋ก ์ค๊ณ๋์์ต๋๋ค.
- ์๊ธ ๋ถ์ ์๋๋ฆฌ์ค ํ๋ฆ๋ (FLOW_DIAGRAM.md): ๊ณ ๊ฐ์ด ์๊ธ์ ์ง๋ฌธํ์ ๋ ์์ด์ ํธ ๊ฐ์ ์ ํ ๋์ ๋ฐ ๋ฐฑ์๋ API์์ ์ํ์ค๋ฅผ ๋์ํํ ์ํคํ ์ฒ ํ๋ฆ๋์ ๋๋ค.
- ํ์ค ๊ฐ์ด๋ ์ค์ ๋ณด๊ณ ์ (BEST_PRACTICES.md): Google Cloud ๊ณต์ GECX ์์ด์ ํธ ์ค๊ณ ๋ฐ ๋๊ตฌ ์ ์ ๋ชจ๋ฒ ์ฌ๋ก(Best Practices & Patterns)์ ๋ง์ถ ์ค๊ณ ์ค์ ๋ด์ญ ํด์ค์์ ๋๋ค.
- tools/: GECX ์ปค์คํ
ํ์ด์ฌ ํ๊ฒฝ์ ๊ทธ๋๋ก ์ฃผ์
ํ ๋จ์ผ ํ์ผ ํํ์ ํ์ด์ฌ ๋น์ฆ๋์ค ๋ก์ง(6๊ฐ)
- lookup_customer.py: ๊ณ ๊ฐ ์ ๋ณด ์กฐํ
- list_invoices.py: ์ฒญ๊ตฌ์ ๋ชฉ๋ก ์กฐํ
- get_invoice_breakdown.py: ๊ธฐ๊ธฐ๋ณ/๊ณ์ ์๊ธ ์ธ๋ถ ๋ด์ญ ์กฐํ
- compare_invoices.py: ์ ์ ๋๋น ์๊ธ ๋ณ๋ ์์ธ ๋น๊ต๋ถ์
- update_language.py: ๋ค๊ตญ์ด ์ธ์ ๋ณ์(English/Korean) ์ ํ
- set_session_state.py: ์ธ์ ์ํ ๋ณ์ ๊ฐ์ ์ค์ (์๋ด์ฌ ์ฐ๊ฒฐ์ฉ)
- agent_configs/: ๋ฉ์ธ ์๋ด ์์ด์ ํธ(
root_agent) ๋ฐ ์๊ธ ์ ๋ฌธ ์์ด์ ํธ(billing_agent)์ ํ๋กฌํํธ ์ง์นจ์- root_agent_instruction.txt: ๋ฉ์ธ ์๋ด์ ์ง์นจ์
- billing_agent_instruction.txt: ์๊ธ ์ ๋ฌธ ์๋ด์ ์ง์นจ์
- toolsets/: OpenAPI ์คํค๋ง ์ ์
- open_api_schema.yaml: ์ ์๊ธฐ ๋ชจ์ API ์ฐ๋ ๊ท๊ฒฉ ์คํค๋ง
- mock-billing-api/: GCP Cloud Run์ ๋ฐฐํฌํ ๋ชจ์ API ์๋ฒ ์์ค ์ฝ๋ (Python FastAPI)
- mock_data/: ์๋ฎฌ๋ ์ดํฐ ๊ฒ์ฆ ์๋๋ฆฌ์ค์ ํ์ฉ๋๋ 2026๋
2์ ๋ฐ 3์๋ถ JSON ๋ชจ์ ๊ณ ์ง์ ์๋ณธ ๋ฐ ์ง๊ณํ
- Bill-Feb-2026.json: 2026๋ 2์๋ถ ๊ณ ์ง์ ์๋ณธ
- Bill-Mar-2026.json: 2026๋ 3์๋ถ ๊ณ ์ง์ ์๋ณธ
- BILL_DATA_SUMMARY.md: ์ํ ๊ณ ์ง์ ์ฃผ์ ์์น ์์ฝ์ง
- Google Cloud Platform (GCP) ๊ณ์ : Cloud Run ์๋น์ค ๋ฐฐํฌ ๊ถํ์ด ํฌํจ๋ GCP ํ๋ก์ ํธ ID๊ฐ ํ์ํฉ๋๋ค.
- GECX Agent Studio ์ฝ์ ์ ๊ทผ ๊ถํ: GECX ์ ํ๋ฆฌ์ผ์ด์ ๋ฐ ์์ด์ ํธ๋ฅผ ์์ฑํ ๊ถํ์ด ์ฃผ์ด์ ธ์ผ ํฉ๋๋ค.
- Google Cloud SDK (
gcloudCLI): ๋ก์ปฌ ํฐ๋ฏธ๋์ ์ค์น๋์ด ์๊ณ ๊ถํ ์ธ์ฆ์ด ์๋ฃ๋์ด ์์ด์ผ ํฉ๋๋ค. (๋ก์ปฌ ์ค์น ์์ด GCP ์น ์ฝ์ ๋ด์ Cloud Shell์ ํ์ฉํ๋ ๊ฒ๋ ๊ฐ๋ฅํฉ๋๋ค.)
์์ด์ ํธ๊ฐ ํธ์ถํ ๋ฐฑ์๋ ๋ชจ์ API๋ฅผ GCP์ ์ปจํ ์ด๋ ํํ๋ก ๋ฐฐํฌํฉ๋๋ค.
- ๋ก์ปฌ ํฐ๋ฏธ๋์ ์ด๊ณ ๋ณธ ํจํค์ง์ ๋ชจ์ API ํด๋๋ก ์ด๋ํฉ๋๋ค.
cd mock-billing-api - gcloud CLI๊ฐ ๋์ GCP ํ๋ก์ ํธ๋ก ์ค์ ๋์ด ์๋์ง ํ์ธํ๊ณ ๋ก๊ทธ์ธํฉ๋๋ค.
gcloud auth login gcloud config set project [GCP_PROJECT_ID] - Cloud Run์ ์๋น์ค๋ฅผ ๋น๋ ๋ฐ ๋ฐฐํฌํฉ๋๋ค. (์ธ์ฆ ์์ด ํธ์ถ ๊ฐ๋ฅํ๋๋ก ์ค์ )
gcloud run deploy purifier-bill-mock \ --source . \ --region us-central1 \ --allow-unauthenticated - ๋ฐฐํฌ๊ฐ ์๋ฃ๋๋ฉด ์ถ๋ ฅ๋๋ Service URL์ ๋ณต์ฌํด ๋ก๋๋ค.
- GCP Cloud Run ์ฝ์์ ์ ์ ํ
์๋น์ค ๋ง๋ค๊ธฐ (Create Service)ํด๋ฆญ. ์์ค ์ ์ฅ์์์ ๋ฐฐํฌ (Deploy from a source repository)์ ํ ํํด๋ผ์ฐ๋ ๋น๋ ์ค์ ํด๋ฆญ.- GitHub ๊ณ์ ์ ์ฐ๋ํ๊ณ ๋ณธ ์ ์๊ธฐ Repository๋ฅผ ์ ํํฉ๋๋ค.
- ๋น๋ ์ค์ (Build Configuration) ๋จ๊ณ:
- Branch:
main - Build Type:
Dockerfile์ ํ - Source directory:
/mock-billing-api - Dockerfile path:
Dockerfile
- Branch:
- ์ธ์ฆ(Authentication) ์์
๋ฏธ์ธ์ฆ ํธ์ถ ํ์ฉ์ ์ ํํ๊ณ๋ง๋ค๊ธฐ (Create)๋ฅผ ๋๋ฆ ๋๋ค.
- toolsets/open_api_schema.yaml ํ์ผ์ ์ฝ๋๋ค.
servers.url๋ถ๋ถ์ ์ฃผ์๋ฅผ 1๋จ๊ณ์์ ํ๋ํ Cloud Run ์๋น์ค URL๋ก ๋์ฒดํ๊ณ ์ ์ฅํฉ๋๋ค.servers: - url: https://purifier-bill-mock-xxxxxxxx-uc.a.run.app # ์ฌ๊ธฐ์ ๋ถ์ฌ๋ฃ๊ธฐ
- GECX Agent Studio ์ฝ์ ๋ฉ์ธ ํ๋ฉด์์ Create App์ ํด๋ฆญํฉ๋๋ค.
- ์ค์ ์ ๊ธฐ์
ํฉ๋๋ค:
- App Name:
purifier-gecx-agent - Language controls:
English (US)๋ก ์ ์งํฉ๋๋ค. (GECX UI์ ํ๊ธ ์ง์ ํ๊ณ๋ก ์ธํด ์์ด ๊ธฐ๋ณธ ์ธ์ ์ํ์์ ํ๋กฌํํธ ๊ฐ์ ๋ฅผ ํตํด ํ๊ธ์ ๊ตฌํํฉ๋๋ค.)
- App Name:
- ์ข์ธก ๋ฉ๋ด Toolsets โ Create Toolset ํด๋ฆญ.
- ์ค์ ์ ๊ธฐ์
ํฉ๋๋ค:
- Toolset Name:
purifier_billing - Description:
์ ์๊ธฐ ๊ณ ๊ฐ ๋ ํ ์ฒญ๊ตฌ์ ์กฐํ API - Schema: open_api_schema.yaml ๋ด์ฉ ์ ๋ฌธ ๋ณต์ฌ ํ ๋ถ์ฌ๋ฃ๊ธฐ.
- Authentication (์ธ์ฆ): ํ๋จ์ Authentication ์น์
์์ Service Agent ID Token์ ์ ํํฉ๋๋ค.
(์ฐธ๊ณ : 1๋จ๊ณ์์ ๋ชจ์ API๋ฅผ
--allow-unauthenticated๋ก ๋ฐฐํฌํ๊ธฐ ๋๋ฌธ์ ์ธ์ฆ ์์ด๋ ํธ์ถ๋๋, GECX ํ๋ซํผ์ ํ์ค ๋ณด์ ์ฐ๋ ๊ท๊ฒฉ์ ๋ฐ๋ฅด๊ธฐ ์ํด ID Token ์ฃผ์ ์ ํ์ฑํํฉ๋๋ค. ํฅํ Cloud Run์ ๋น๊ณต๊ฐ ์ก์ธ์ค ๊ถํ์ ๊ฐํํ ๊ฒฝ์ฐ ์ด ํ ํฐ์ด ํ์ฉ๋ฉ๋๋ค.)
- Toolset Name:
- Save๋ฅผ ํด๋ฆญํ์ฌ ์ ์ฅํฉ๋๋ค.
์ข์ธก ๋ฉ๋ด์ Tools โ Create Tool์ ๋๋ฅธ ๋ค, ๊ฐ ํด ์ด๋ฆ๊ณผ ์ค๋ช ์ ์ ๊ณ ์ง์ ๋ ํ์ด์ฌ ํ์ผ์ ๋ด์ฉ ์ ์ฒด๋ฅผ ๋ณต์ฌํ์ฌ ์๋ํฐ์ ๋ถ์ฌ๋ฃ์ต๋๋ค. (๋๊ตฌ ์ด๋ฆ์ Python ํจ์๋ช ๊ณผ ๋์๋ฌธ์๊น์ง ์์ ํ ์ผ์นํด์ผ ํฉ๋๋ค.)
| ๋๊ตฌ ์ด๋ฆ (Tool Name) | ์ค๋ช (Description) | ์์ค์ฝ๋ ํ์ผ ์์น (๋ณต์ฌ ๋์) |
|---|---|---|
lookup_customer |
Looks up customer rental account details. | lookup_customer.py |
list_invoices |
Lists available rental invoices. | list_invoices.py |
get_invoice_breakdown |
Breaks an invoice into charge categories. | get_invoice_breakdown.py |
compare_invoices |
Compares two invoices and explains difference. | compare_invoices.py |
update_language |
Sets active language explicitly. | update_language.py |
set_session_state |
Writes trigger variables to session state. | set_session_state.py |
Warning
ํ์ด์ฌ ๋๊ตฌ ๋ด๋ถ์๋ ์ปดํ์ผ ์ค๋ฅ ๋ฐ ๋ฌธ์ ๊นจ์ง ๋ฐฉ์ง๋ฅผ ์ํด ํ๊ธ ์ฃผ์์ด ๋ฐฐ์ ๋๊ณ ์ ๋์ฝ๋ ์ด์ค์ผ์ดํ ๊ธฐ๋ฒ์ด ์ ์ฉ๋์ด ์์ผ๋, ๋ฐ๋์ ์ง์ ๋ .py ํ์ผ์ ํ
์คํธ๋ฅผ ๊ทธ๋๋ก ๋ณต์ฌํ์ฌ ์
๋ ฅํด ์ฃผ์ญ์์ค.
์ข์ธก ๋ฉ๋ด Agents โ Create Agent๋ฅผ ๊ฐ๊ฐ ์คํํ์ฌ ๋ค์ ๋ ๊ฐ์ ์์ด์ ํธ๋ฅผ ์ค์ ํฉ๋๋ค.
(์ฐธ๊ณ : ์ฐ๊ฒฐํด์ผ ํ๋ ๋๊ตฌ ์ค end_session์ GECX๊ฐ ๊ธฐ๋ณธ ์ ๊ณตํ๋ ์์คํ
๋ด์ฅ ๋๊ตฌ(System Tool)์ด๋ฏ๋ก, ๋ฐ๋ก ์ปค์คํ
์์ฑํ ํ์ ์์ด ์ฒดํฌ๋ฐ์ค๋ง ์ ํํ๋ฉด ๋ฉ๋๋ค.)
- Agent Name:
billing_agent - Instructions: billing_agent_instruction.txt ๋ด์ฉ ์ ์ฒด ๋ณต์ฌ-๋ถ์ฌ๋ฃ๊ธฐ
- Linked Tools:
set_session_state,lookup_customer,list_invoices,get_invoice_breakdown,compare_invoices,update_language,end_session์ฒดํฌ - Linked Toolsets:
purifier_billing(ํธ์ถ ๊ฐ๋ฅ ์คํผ๋ ์ด์ getInvoices์ฒดํฌ)
- Agent Name:
root_agent - Instructions: root_agent_instruction.txt ๋ด์ฉ ์ ์ฒด ๋ณต์ฌ-๋ถ์ฌ๋ฃ๊ธฐ
- Linked Tools:
set_session_state,lookup_customer,update_language,end_session์ฒดํฌ - Child Agents:
billing_agent์ฐ๊ฒฐ ์ฒดํฌ
- ์ฐ์ธก ์๋จ์ Settings (์ค์ โ๏ธ) ์์ด์ฝ ํด๋ฆญ.
- Behavior: Allow user interruptions ํ์ฑํ (On)
- Logging: Enable Cloud Logging ํ์ฑํ (On)
- Tools: Execution mode๋ฅผ
Parallel(๋ณ๋ ฌ ํธ์ถ)๋ก ์ค์ - Global instructions: ์๋ ํ๊ธ ๋ํ ์ฐํ ๊ฐ์ ์ง์นจ์ ๊ทธ๋๋ก ๋ณต์ฌํ์ฌ ์
๋ ฅ:
Always reply to the user in the same language they used for their query. If the user speaks in Korean, you must output your response in Korean. If the user speaks in English, output in English. Never translate the user's conversation language to English unless explicitly requested. - ํ๋จ์ Save ํด๋ฆญํ์ฌ ์ ์ฅ.
- ๋์๋ณด๋๋ก ๋์์ ๋ฉ์ธ ๋ฃจํธ ์์ด์ ํธ ํญ๋ชฉ์
root_agent๊ฐ ์ง์ ๋์ด ์๋์ง ์ฌํ์ธํฉ๋๋ค.
GECX ์ฝ์ ์ฐ์ธก ์๋จ์ Test agent ์๋ฎฌ๋ ์ดํฐ๋ฅผ ์ผญ๋๋ค. ๋ํ๋ฅผ ์์ํ๊ธฐ ์ ์, ์๋ฎฌ๋ ์ดํฐ ํจ๋ ์ฐ์ธก ์๋จ์ ํฑ๋๋ฐํด ์ Parameters ๋ฒํผ์ ๋๋ฅด๊ณ ์๋ ์ธ์ ํ๋ผ๋ฏธํฐ๋ฅผ ํค-๊ฐ(Key-Value) ์์ผ๋ก ์๋ ๋ฑ๋ก(Add Parameter)ํ ๋ค ํ ์คํธ๋ฅผ ์์ํด์ผ ๋ก๊ทธ์ธ ๋ฐ ์ธ์ ์ด ํ์ฑํ๋ฉ๋๋ค.
- ์ฃผ์
ํ ์ธ์
ํ๋ผ๋ฏธํฐ (Session Parameters):
auth_status=authenticatedcustomer_name=ํ๊ธธ๋account_id=urn:purifier:rental:product:ban:115720204active_language=Korean
- ์์ ์ธ์ฌ:
- ์์ด์ ํธ: "์๋ ํ์ธ์, ํ๊ธธ๋ ๊ณ ๊ฐ๋. ์ ์๊ธฐ ๋ํ ๊ณ ๊ฐ์ผํฐ ์๋ด์์ ๋๋ค. ์ค๋ ์ด๋ค ๋์์ด ํ์ํ์ ๊ฐ์?"
- ๋ ํ ์๊ธ ์์ธ ์กฐํ ์์ฒญ:
- ์ฌ์ฉ์: "์ด๋ฒ ๋ฌ ๊ณ ์ง์ ์๊ธ ๋ช ์ธ ์ข ๋ณด์ฌ์ค"
- (์์ด์ ํธ๊ฐ
billing_agent๋ก ์ธ์ ์ด๋ ํget_invoice_breakdown(month="latest")์คํ) - ์์ด์ ํธ:
ํ๊ธธ๋ ๊ณ ๊ฐ๋์ 2026๋ 3์ ์ด ์ฒญ๊ตฌ ๊ธ์ก์ 5,370์์ ๋๋ค.
[์๊ธ ์ธ๋ถ ๋ด์ญ]
- ๊ธฐ๋ณธ ๋ ํ๋ฃ: 167,837์
- ๋ฐฉ๋ฌธ ์ผ์ด ์๋น์ค๋ฃ: 6,689์
- ์๋ชจํ ๋ฐ ํํฐ ์ถ๊ฐ ๊ตฌ๋งค ๋น์ฉ: 3,008์
- ์ ํด์นด๋ ๋ฐ ํจํค์ง ๊ฒฐํฉ ํ ์ธ์ก: -173,025์ (์ฐจ๊ฐ ์๋ฃ)
์ ํ๋ณ ์ธ๋ถ ์๊ธ ๋ช ์ธ๋ ์๋ดํด ๋๋ฆด๊น์?
- ์ง๋๋ฌ ๋๋น ๋น๊ต๋ถ์ ์์ฒญ:
- ์ฌ์ฉ์: "์ด๋ฒ ๋ฌ ์๊ธ์ด ์ ์ง๋๋ฌ๋ณด๋ค ๋ ๋์์ด?"
- (์์ด์ ํธ๊ฐ
compare_invoices(month="latest", compare_to="previous")์คํ) - ์์ด์ ํธ:
2026๋ 3์ ์๊ธ์ ์ง๋๋ฌ(2์: -1,790์) ๋๋น ์ด 7,160์ ์ธ์๋์์ต๋๋ค.
[์ฃผ์ ๋ณ๋ ์์ธ]
- ์๋ชจํ ๋ฐ ํํฐ ์ถ๊ฐ ๊ตฌ๋งค ๋น์ฉ (๊ธฐํ ์์๋ฃ): +3,580์ ๋ฐ์
- ๊ธฐ๋ณธ ๋ ํ๋ฃ: ๋น๋ฐ(๋ฃฐ๋ฃจ) ์ ํ์ ์ผ๋ถ ๊ฒฐํฉ ํ ์ธ ํํ ์ข ๋ฃ๋ก ์ธํด +3,001์ ์ธ์
์ถ๊ฐ์ ์ผ๋ก ๊ถ๊ธํ์ ์ ์ด ์์ผ์ ๊ฐ์?
- ๋ค๊ตญ์ด ์์ด ์ ํ ํ
์คํธ:
- ์ฌ์ฉ์: "Can you explain that in English?"
- (์์ด์ ํธ๊ฐ
update_language(new_language="English")์คํ ํ ์ฆ์ ์ ํ) - ์์ด์ ํธ:
Sure, I can explain that in English.
Your March bill is 5,370 KRW, which is 7,160 KRW higher than your February bill (-1,790 KRW).
[Key Drivers]
- Other Fees: +3,580 KRW
- Rental Fees: +3,001 KRW (due to partial discount expiration on your bidet)
Python ํด์ด ์ค์ ๋ฐฑ์๋ Mock API๋ฅผ ์กฐํํ๋ ๋ ์ฐจ๋ก์ REST API ํธ์ถ ๊ฒฝ๋ก(getInvoices)๊ฐ ์ ๋๋ก ์ฐ๋๋์๋์ง GECX ์น ์ฝ์์์ ์ง์ ํ์ธํ๋ ๋ฐฉ๋ฒ์
๋๋ค.
- ์๋ฎฌ๋ ์ดํฐ ์ถ์ ์ฐฝ ํ์ฑํ:
- Test Agent ์๋ฎฌ๋ ์ดํฐ ์ฐ์ธก ํจ๋์์ ๋ํ๋ฅผ ์
๋ ฅํ ํ, ํ๋จ์
Trace(์ถ์ ) ํญ์ ์ฝ๋๋ค.
- Test Agent ์๋ฎฌ๋ ์ดํฐ ์ฐ์ธก ํจ๋์์ ๋ํ๋ฅผ ์
๋ ฅํ ํ, ํ๋จ์
- ๋๊ตฌ ํ๋ผ๋ฏธํฐ ๋ก๊น
ํ์ธ:
- ๋๊ตฌ ํธ์ถ์ด ๋ฐ์ํ ๋ํ ํด์ ๋ก๊ทธ ํธ๋ฆฌ์์
get_invoice_breakdown๋๋compare_invoices๋ ธ๋๋ฅผ ํผ์นฉ๋๋ค. Input(์ ๋ ฅ) ํ๋์month: "latest"๋๋compare_to: "previous"๋งค๊ฐ๋ณ์๊ฐ LLM์ ์ํด ์ ์ ์ถ์ถ๋์ด ์ ๋ ฅ๋์๋์ง ๊ฒ์ฌํฉ๋๋ค.
- ๋๊ตฌ ํธ์ถ์ด ๋ฐ์ํ ๋ํ ํด์ ๋ก๊ทธ ํธ๋ฆฌ์์
- HTTP API ์์ฒญ/์๋ต ํ์ด๋ก๋ ์ถ์ (์ฝ์ ์ง์ ๊ฒ์ฆ):
- ๋๊ตฌ ๋ก๊ทธ ๋ด๋ถ์ OpenAPI ์ฐ๋ ์คํผ๋ ์ด์
(
purifier_billing_getInvoices) ๋ก๊ทธ ๋ ธ๋๋ฅผ ํด๋ฆญํฉ๋๋ค. - ์ฌ๊ธฐ์ ์ค์ HTTP Request URL์ด Cloud Run ์ฃผ์(
https://purifier-bill-mock-xxxxxxxx-uc.a.run.app/getInvoices?...)๋ก ์ ์ ์ ์ก๋์๋์ง ์กฐํํ ์ ์์ต๋๋ค. Response(์ถ๋ ฅ) JSON ๋ฐ๋๋ฅผ ์ด์ด TMF678 ๊ท๊ฒฉ ๊ณ ์ง์ ์๋ณธ ๋ฐ์ดํฐ({"id": "...", "amountDue": {"value": 5370.0}})๊ฐ Mock API ์๋ฒ๋ก๋ถํฐ ์ฌ๋ฐ๋ฅด๊ฒ ๋ฐํ๋์๋์ง ์ค์๊ฐ์ผ๋ก ๋ค์ฌ๋ค๋ณผ ์ ์์ต๋๋ค.
- ๋๊ตฌ ๋ก๊ทธ ๋ด๋ถ์ OpenAPI ์ฐ๋ ์คํผ๋ ์ด์
(
- ์๋ฌ ์ ํ ๋ถ์:
Method not found: 2๋จ๊ณ์์open_api_schema.yaml๋ดservers.url์ Cloud Run ์ฃผ์๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๋ฐ์ํ๋์ง ์ ๊ฒํ์ญ์์ค.401 Unauthorized๋๋403 Forbidden: GECX ํด์ ์ ์ธ์ฆ ์ค์ ์์Service Agent ID Token์ ์ฌ๋ฐ๋ฅด๊ฒ ์ธํ ํ๋์ง ํ์ธํ์ญ์์ค.
๋ณธ ํคํธ์๋ GECX ์๋๋ฐ์ค์ ์ ๋ก๋ํ๊ธฐ ์ ์, ํ์ด์ฌ ์ฝ๋ ๋ด๋ถ์ ์๊ธ ๋ถ์ ๊ณ์ฐ ๋ฐ ๋ ์ง ์ฒ๋ฆฌ ๋ก์ง์ด ์ ๋๋ก ์๋ํ๋์ง ๊ฒ์ฆํ ์ ์๋ ๋จ์ ํ ์คํธ๊ฐ ๋๋ด๋์ด ์์ต๋๋ค.
- ํจํค์ง ๋ฃจํธ ๋๋ ํ ๋ฆฌ์์ Python ๊ฐ์ ํ๊ฒฝ์ ํ์ฑํํ๊ณ ํ์ํ ์ข
์์ฑ ํจํค์ง๋ฅผ ์ค์นํฉ๋๋ค.
python3 -m venv venv source venv/bin/activate pip install pytest pytest๋ช ๋ น์ด๋ฅผ ์คํํ์ฌ ํดํท ๋น์ฆ๋์ค ๋ก์ง๊ณผ API ๋ชจํน(Mocking) ํ ์คํธ๋ฅผ ํต๊ณผํ๋์ง ๊ฒ์ฌํฉ๋๋ค.pytest