소개
지난 "공공데이터로 만든 '의약품 정보 도우미 GPT"를 만듦 (바로가기)
스키마 작업 후, API 연동 성공 메시지 이후에 계속해서 "ClientResponseError" 지속 발생
다양한 디버깅 노력
Claude 등을 활용하여 다양한 스키마 수정을 진행했으나, 에러 계속 발생
Endpoint URL 점검 : 브라우저에서 직접 호출해서 응답이 오는지 확인하는 것
https://apis.data.go.kr/1471000/DrbEasyDrugInfoService/getDrbEasyDrugList?serviceKey=발급받은키&type=json&itemName=타이레놀위와 같이 '발급받은키'에 공공데이터 인증키를 넣고, 크롬 브라우저 주소창에 입력
정상적인 호출이면 '타이레놀' 정보값을 브라우저에 결과로 반환함
확인 결과는 정상!!! 즉, 인증키도 정상이고 API 호출도 정상적으로 이루어지고 있는 상황
그렇다면 문제의 원인은 둘 중에 하나라는 생각이 들게 됨
해당 공공데이터 서버가 OpenAI의 요청을 거부하고 있거나,
해당 공공데이터 서버가 OpenAI의 요청에 응답을 해서 정보를 잘 전달해주고 있지만, OpenAI가 이 데이터를 받아서 제대로 핸들링하지(파싱하지) 못하고 있다는 상황???인 걸까? 라는 느낌적인 느낌이 퐈악!!!
느낌적인 느낌을 무시하다!
그럼에도 불구하고 먼가 스키마만 수정하면 될 수도 있을거야! 라는 막연한 기대에
계속해서 ChatGPT와 Claude에게 디버깅 노가다 질문 남발!
4시간 정도를 진행했더니 ChatGPT도 지쳤는지 평소에 안 하던 단정적 답변을 투척!
'이제 고마해라~ 마이 묵었다아이가~~~!!' 시전그리고 GPT가 제안한 방법이 아래와 같이 우회 서버(Proxy 서버)를 구축해 봐라!!!
그러면서 이젠 압박까지 시도하는 ChatGPT! > '구성해줄게~~~' 하면서 달래기도 시전!
아! 나 비개발자 출신인데, 이걸 어찌하라고!!!
Best 발표는 하기로 했고, 선정해주신 스터디원분들의 응원도 있는데, 작동은 그래도 기본적으로 되어야하는 거잖아!!!
디버깅으로 4시간이란 시간을 더 소비한 뒤에야, 결국 울면서 우회 서버 구축을 하기로 맘을 먹고 ChatGPT에게 질문 시작
진행 방법
우회 서버를 구축해서, 데이터 진행이 공공데이터 > 우회 서버 > OpenAI 의 과정으로 재구축 진행
우회 서버는 ChatGPT가 위에서 'Vercel'을 가장 처음으로 제안해 서 github, vercel을 활용해서 구축
Vercel : 풀스택 웹 애플리케이션을 손쉽게 배포할 수 있는 클라우드 플랫폼.
용도
정적 사이트 (Next.js, React 등)
간단한 API 서버 (예: 프록시, 검색 엔진, 백엔드 라우터)
포트폴리오, 블로그, 챗봇, GPT Plugin 서버 등
특징
GitHub에 코드를 push하면 자동으로 배포됨 > 무설정 배포 가능
서버리스 함수 지원
자동 도메인 제공
무료 플랜
오호... 먼 말인지 잘 몰겠고, 말하자면 다양한 '용도'에 무엇보다도 '특징'이 무료 라는 거구나??? 이거다!!!
준비 사항
1단계. 로컬 컴퓨터에 Node.js 설치
Node.js : 로컬에서 Vercel에 올릴 코드를 테스트하거나 디버깅할 수 있게 해줌
그래서 만들지 않아도 된다고 했으나, Vercel에 올리기 전에 로컬 테스트를 진행해 볼 수가 있다고 해서 그냥 설치함
'window키 + r' 단축키 > cmd 입력 > 프롬프트 화면 열기
프로젝트 폴더 만들기 (아래 코드 입력)
mkdir drug-proxy-api cd drug-proxy-api npm init -y npm install express axios xml2js아래 내용 그대로 메모장에서 작성해서, 위 /api/drug-info.js 로 저장
(중요한 사항: '여기에_인코딩된_서비스키' 에 인증키 삽입!!!)// Vercel에서 자동 인식되는 함수형 구조 const axios = require('axios'); const xml2js = require('xml2js'); module.exports = async (req, res) => { const { entpName, itemName } = req.query; const serviceKey = encodeURIComponent('여기에_인코딩된_서비스키'); // URL 인코딩된 키 const url = `https://apis.data.go.kr/1471000/DrbEasyDrugInfoService/getDrbEasyDrugList?serviceKey=${serviceKey}&type=xml&pageNo=1&numOfRows=1${ entpName ? `&entpName=${encodeURIComponent(entpName)}` : '' }${itemName ? `&itemName=${encodeURIComponent(itemName)}` : ''}`; try { const response = await axios.get(url); const xml = response.data; xml2js.parseString(xml, { explicitArray: false }, (err, result) => { if (err) return res.status(500).json({ error: 'XML parsing failed' }); res.status(200).json(result); }); } catch (error) { res.status(500).json({ error: error.message }); } };2단계. GitHub 가입하고, 동일한 ID로 Vercel에도 가입해서 상호 연동
3단계.
Git 초기화 (로컬 컴퓨터 프롬프트 창에서 실행)
cd C:\Users\lyon_kim\drug-proxy-api git init git add . git commit -m "Initial commit: drug-proxy-api"GitHub에서 새 저장소 만들기
오른쪽 상단
+→New repository (이름은 :drug-proxy-api - 내 맘대로)"Private" or "Public" 선택 (아무거나 OK)
"Create repository" 클릭
생성 후 보이는 "…or push an existing repository from the command line" 아래 명령어 복사해서 로컬 컴퓨터 프롬프트 창에서 실행
git remote add origin https://github.com/yourusername/drug-proxy-api.git git branch -M main git push -u origin mainGitHub 저장소에 api/drug-info.js 파일 생성 확인되면 성공!
4단계.
Vercel 접속 및 로그인
👉 https://vercel.com 접속
우측 상단 "Log in" 클릭
GitHub 계정으로 로그인
새 프로젝트 생성 (Deploy Project)
로그인 후 대시보드로 이동
좌측 메뉴 또는 메인 화면의 “Add New” → “Project” 클릭
GitHub 저장소 목록에서 drug-proxy-api 선택
클릭 후 → 기본 설정 그대로 두고 "Deploy" 버튼 클릭!
잠시 기다리면... 배포 완료!
수 초 ~ 수 분 내로 배포 완료
완료되면 아래처럼 주소가 나옴
https://drug-proxy-api.vercel.app
5단계. 테스트
아래 URL을 브라우저에 입력
https://drug-proxy-api.vercel.app/api/drug-info?itemName=아세트아미노펜아세트아미노펜에 대한 정보가 결과값으로 반환되면 성공!!!
6단계. OpenAPI 스키마 작성해서 Actions 입력하기
{ "openapi": "3.1.0", "info": { "title": "Drug Info Proxy", "version": "1.0.0", "description": "Vercel 프록시를 통해 의약품 정보를 JSON 형식으로 반환하는 API" }, "servers": [ { "url": "https://drug-proxy-api.vercel.app" } ], "paths": { "/api/drug-info": { "get": { "operationId": "getDrugInfo", "summary": "제품명을 기준으로 의약품 정보를 조회합니다.", "parameters": [ { "name": "itemName", "in": "query", "required": true, "schema": { "type": "string" }, "description": "제품명 (예: 아세트아미노펜)" } ], "responses": { "200": { "description": "약 정보 JSON 응답", "content": { "application/json": { "schema": { "type": "object", "properties": { "OpenAPI_ServiceResponse": { "type": "object", "properties": { "cmmMsgHeader": { "type": "object", "properties": { "errMsg": { "type": "string" }, "returnAuthMsg": { "type": "string" }, "returnReasonCode": { "type": "string" } } }, "body": { "type": "object", "properties": { "items": { "type": "array", "items": { "type": "object", "properties": { "itemName": { "type": "string", "description": "제품명" }, "entpName": { "type": "string", "description": "업체명" }, "efcyQesitm": { "type": "string", "description": "효능" }, "useMethodQesitm": { "type": "string", "description": "복용 방법" }, "atpnQesitm": { "type": "string", "description": "주의사항" }, "seQesitm": { "type": "string", "description": "부작용" }, "depositMethodQesitm": { "type": "string", "description": "보관법" } } } } } } } } } } } } } } } } } }최종 결과는 성공!!! 아~~ 행복하고 뿌듯해!!! (디버깅까지 6시간 걸렸다... 내 주말!)
결과와 배운 점
API 호출에 문제가 생겼는데, 만들어 놓은 스키마(json, yaml 등)에 아무런 이상이 없는 경우
서버 간의 통신 문제일 경우를 고려해서, 이와 같이 우회 서버(Proxy 서버)를 간단하게 구축해서 해결해 볼 수 있을 듯 함.
공공데이터가 제공하는 다른 데이터들의 API도 OpenAI 서버와 연동이 되지 않는 것이 많은 듯 해서, 이러한 방법이 해결책의 하나가 될 수 있을 듯 함.
GPTs와 공공데이터 API 연결에 도움이 되길 바라면서 케이스 종료!
그리고, 무엇보다도 ChatGPT와 티키타카를 하다보면 답이 나오는 경우가 있더라라는 점!!!
[이전 사례]
💊 공공데이터로 만든 '의약품 정보 도우미 GPT' 만들기
https://www.gpters.org/chatbot/post/creatingpharmaceutical-information-gpt-made-FwSYqZfwJZwR6lk