공공데이터 API 호출을 위해 우회 서버(Proxy server) 구축 사례

소개

  • 지난 "공공데이터로 만든 '의약품 정보 도우미 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하면 자동으로 배포됨 > 무설정 배포 가능

    • 서버리스 함수 지원

    • 자동 도메인 제공

    • 무료 플랜

  • 오호... 먼 말인지 잘 몰겠고, 말하자면 다양한 '용도'에 무엇보다도 '특징'이 무료 라는 거구나??? 이거다!!!

    한국어 문자 메시지의 스크린 샷

  • 준비 사항

    한국 MP3 플레이어 - 스크린 샷

  • 1단계. 로컬 컴퓨터에 Node.js 설치

    • Node.js : 로컬에서 Vercel에 올릴 코드를 테스트하거나 디버깅할 수 있게 해줌

    • 그래서 만들지 않아도 된다고 했으나, Vercel에 올리기 전에 로컬 테스트를 진행해 볼 수가 있다고 해서 그냥 설치함

    • 'window키 + r' 단축키 > cmd 입력 > 프롬프트 화면 열기

      한국어 텍스트가있는 창
      Microsoft Windows XP 설정 화면의 스크린 샷
  • 프로젝트 폴더 만들기 (아래 코드 입력)

    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단계.

    1. Git 초기화 (로컬 컴퓨터 프롬프트 창에서 실행)

      cd C:\Users\lyon_kim\drug-proxy-api
      
      git init
      git add .
      git commit -m "Initial commit: drug-proxy-api"
    2. GitHub에서 새 저장소 만들기

      1. GitHub 접속

      2. 오른쪽 상단 +New repository (이름은 : drug-proxy-api - 내 맘대로)

      3. "Private" or "Public" 선택 (아무거나 OK)

      4. "Create repository" 클릭

      5. 생성 후 보이는 "…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 main
      6. GitHub 저장소에 api/drug-info.js 파일 생성 확인되면 성공!

  • 4단계.

    1. Vercel 접속 및 로그인

      1. 👉 https://vercel.com 접속

      2. 우측 상단 "Log in" 클릭

      3. GitHub 계정으로 로그인

    2. 새 프로젝트 생성 (Deploy Project)

      1. 로그인 후 대시보드로 이동

      2. 좌측 메뉴 또는 메인 화면의 “Add New” → “Project” 클릭

      3. GitHub 저장소 목록에서 drug-proxy-api 선택

      4. 클릭 후 → 기본 설정 그대로 두고 "Deploy" 버튼 클릭!

    3. 잠시 기다리면... 배포 완료!

      1. 수 초 ~ 수 분 내로 배포 완료

      2. 완료되면 아래처럼 주소가 나옴

        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와 티키타카를 하다보면 답이 나오는 경우가 있더라라는 점!!!

    ChatGP라고 말하는 표지판을 들고있는 만화 사자

    [이전 사례]

  • 💊 공공데이터로 만든 '의약품 정보 도우미 GPT' 만들기

  • https://www.gpters.org/chatbot/post/creatingpharmaceutical-information-gpt-made-FwSYqZfwJZwR6lk

1
1개의 답글

👉 이 게시글도 읽어보세요