인공지능 (AI) 따라잡기

[AI야 놀자] <1> 오피넷 유가정보 OPEN API... 전국주유소 평균 가격 조회

MoneyManager 2025. 7. 27. 23:47
728x90

 

안녕하세요. 

 

오늘은 코딩초보자가 오랜만에 chatGPT를 활용해 보겠습니다. 

 

이번에는 한국석유공사의 OPEN API를 활용해 유가정보를 구글시트로 불러오는 작업을 자동화 해볼 예정입니다. 

 

오픈 API를 활용하려면,  우선 회원가입한 후 이용신청을 한 후 KEY를 부여 받아야 합니다. 

 

오피넷 홈페이지 : https://www.opinet.co.kr/user/main/mainView.do

 

유가정보 오픈 API를 이용하려면 아래의 절차를 참고하시면 됩니다.  

 

 

다음은 활용가능한 API  리스트 입니다. 

 

 

 

우선 현재시점의 주유소 전국 평균가격을 대상으로 데이터를 불러오는 코드를 만들어 보겠습니다. 

 

한국석유공사에서 제공하는 오피넷 유가정보 무료API 이용 가이드를 참고했습니다. 

 

가이드를 참고해서 질문할때 상세하게 질문하는 것이 좋습니다. 

 

전국 주유소 평균가격 오픈 API 이용 가이드

 

 

 

1. chatGPT에 요청한 내용

 

오피넷 유가정보의 오픈 API 를 활용해서 구글시트에서 데이터를 불러올 예정이다. 
무료 오픈 API 중 순차적으로 처리할 예정임. 

인증키는  F25062XXXX 이다.  시트명은 '전국평균' 으로 해줘

제시한 인증키와 아래의 정보를 바탕으로 전국주유소 평균 가격을 가져오는 코드를 짜줘.
출력은 반환값 모두 출력해줘. 

1. 기본정보 : https://www.opinet.co.kr/api/avgAllPrice.do
   기본정보 설명 : 현재 오피넷에 게시되고 있는 전국 주유소 평균가격

2. 요청파라미터 
   code :  F25062XXXX  
   out   :  정보 노출 형식을 정의 한다.(xml/json)

3. 반환값
   TRADE_DT 해당일자 
   PRODCD 제품구분코드 
   PRODNM 제품명 
   PRICE 평균가격 
   DIFF 전일대비 등락값   

4. 예시
https://www.opinet.co.kr/api/avgAllPrice.do?out=json&code=F25062XXXX

{"RESULT": {"OIL":[ {"TRADE_DT":"20250727","PRODCD":"B034","PRODNM":"고급휘발유","PRICE":"1916.84", "DIFF":"-0.05" }, {"TRADE_DT":"20250727","PRODCD":"B027","PRODNM":"휘발유","PRICE":"1667.08", "DIFF":"+0.43" }, {"TRADE_DT":"20250727","PRODCD":"D047","PRODNM":"자동차용경유","PRICE":"1532.87", "DIFF":"-0.04" }, {"TRADE_DT":"20250727","PRODCD":"C004","PRODNM":"실내등유","PRICE":"1295.27", "DIFF":"+0.50" }, {"TRADE_DT":"20250727","PRODCD":"K015","PRODNM":"자동차용부탄","PRICE":"1052.54", "DIFF":"-0.12" } ]} }

 

 

ChatGPT의 말:

 

다음은 오피넷 유가정보 오픈 API(https://www.opinet.co.kr/api/avgAllPrice.do)를 활용하여 구글시트에서 전국 평균 유가 정보를 가져오는 Google Apps Script 코드입니다.

✅ 사용법 요약:

  1. 구글시트 메뉴에서 확장 프로그램 > Apps Script 열기
  2. 아래 코드를 붙여넣기
  3. 저장 후 함수 getAvgAllPrice 실행
  4. 시트에 '전국평균'이라는 이름의 시트가 없으면 자동 생성됨

✅ Google Apps Script 코드

function getAvgAllPrice() {
  const sheetName = '전국평균';
  const apiKey = 'F25062XXXX';
  const url = `https://www.opinet.co.kr/api/avgAllPrice.do?out=json&code=${apiKey}`;

  // 시트가 없으면 생성
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  let sheet = ss.getSheetByName(sheetName);
  if (!sheet) {
    sheet = ss.insertSheet(sheetName);
  } else {
    sheet.clear();  // 기존 데이터 초기화
  }

  // API 호출
  const response = UrlFetchApp.fetch(url);
  const json = JSON.parse(response.getContentText());

  const data = json.RESULT.OIL;

  // 헤더 작성
  const headers = ['TRADE_DT', 'PRODCD', 'PRODNM', 'PRICE', 'DIFF'];
  sheet.appendRow(headers);

  // 데이터 작성
  data.forEach(oil => {
    sheet.appendRow([
      oil.TRADE_DT,
      oil.PRODCD,
      oil.PRODNM,
      parseFloat(oil.PRICE),
      oil.DIFF
    ]);
  });

  // 자동 너비 조정
  sheet.autoResizeColumns(1, headers.length);
}

 

 

✅ 실행 예시 (시트에 입력될 값)

 

TRADE_DT PRODCD PRODNM PRICE DIFF
20250727 B034 고급휘발유 1916.84 -0.05
20250727 B027 휘발유 1667.08 +0.43
20250727 D047 자동차용경유 1532.87 -0.04
20250727 C004 실내등유 1295.27 +0.50
20250727 K015 자동차용부탄 1052.54 -0.12

 

2 chatGPT에 요청한 내용

실행후 칼럼이 좁아져서 불편해 원래 칼럼 크기를 유지해 줘. 그리고 헤더는 한글로만 나오게 해줘

 

 

ChatGPT의 말:

 

좋습니다. 업로드된 두 이미지를 기준으로 실행 전후를 비교해보면 아래와 같은 변화가 있습니다:


✅ 문제 요약

  • 실행 전: 칼럼 너비가 넉넉하게 설정되어 있으며, 제품코드, 제품명, 평균가격, 전일대비 등락 항목이 각각의 열에 나뉘어 있음.
  • 실행 후: 제품코드~평균가격 값이 하나의 셀에 합쳐지고, 칼럼 폭이 좁아져서 가독성이 떨어짐.
  • 또한: 헤더가 한글 + 영어 혼용 상태에서 한글만 유지되길 원함.

🔧 개선 방향

  1. 칼럼 너비 고정 유지
    • 매크로 실행 후 Columns("A:F").AutoFit 같은 명령이 있다면 제거.
    • 혹은 ColumnWidth를 강제로 지정하는 방식 도입.
  2. 헤더 수정
    • “제품코 제품명 평균가격 전일대비 등락” ← 이렇게 한글만 나오도록 코드 수정.

✅ 예시 VBA 코드 수정안

 

원하는 동작이 “세로로 정렬된 상태를 유지하고, 각 열이 따로 표시되며 너비가 고정된 상태로 유지되는 것”이라면 위처럼 ColumnWidth를 지정하고, 기존 열을 병합하지 않는 방식이 좋습니다.

 

실제 사용 중인 VBA 코드를 올려주시면 더 정확하게 수정해드릴 수 있어요. 필요하시면 다시 공유해 주세요!

 

3 chatGPT에 요청 응답으로 기존 코드 제시함. 

function getAvgAllPrice() {
  const sheetName = '전국평균';
  const apiKey = 'F25062XXXX';
  const url = https://www.opinet.co.kr/api/avgAllPrice.do?out=json&code=${apiKey};

  const ss = SpreadsheetApp.getActiveSpreadsheet();
  let sheet = ss.getSheetByName(sheetName);
  if (!sheet) {
    sheet = ss.insertSheet(sheetName);
  } else {
    sheet.clear();  // 기존 데이터 초기화
  }

  const response = UrlFetchApp.fetch(url);
  const json = JSON.parse(response.getContentText());

  const data = json.RESULT.OIL;

  // 헤더 작성 (설명 포함)
  const headers = [
    '해당일자',
    '제품코드',
    '제품명',
    '평균가격',
    '전일대비 등락'
  ];
  sheet.appendRow(headers);

  // 데이터 입력
  data.forEach(oil => {
    sheet.appendRow([
      oil.TRADE_DT,
      oil.PRODCD,
      oil.PRODNM,
      parseFloat(oil.PRICE),
      oil.DIFF
    ]);
  });

  'sheet.autoResizeColumns(1, headers.length);
}

 

chatGPT 답변

감사합니다! 올려주신 GAS(Google Apps Script) 코드에서는 다음 두 가지 문제를 확인할 수 있습니다:


🔍 1. 칼럼 너비가 자동으로 줄어드는 문제

현재 코드 마지막 줄:

js
복사편집
'sheet.autoResizeColumns(1, headers.length);
  • 문제점: 주석 처리되어 있지만, 활성화하면 autoResizeColumns()가 칼럼을 자동 폭 조정해서 좁아질 수 있음.
  • 해결 방법: 자동 너비 조정을 없애고, 원하는 고정 너비를 수동 설정하면 됩니다.

🔍 2. 헤더가 한글만 나오도록 처리됨 (OK)

  • 현재 헤더는 전부 한글로 "해당일자", "제품코드", ..." 설정되어 있고, 이는 요청대로 잘 구현되어 있습니다.

✅ 수정된 최종 코드 제안

function getAvgAllPrice() {
  const sheetName = '전국평균';
  const apiKey = 'F25062XXXX';
  const url = `https://www.opinet.co.kr/api/avgAllPrice.do?out=json&code=${apiKey}`;

  const ss = SpreadsheetApp.getActiveSpreadsheet();
  let sheet = ss.getSheetByName(sheetName);
  if (!sheet) {
    sheet = ss.insertSheet(sheetName);
  } else {
    sheet.clear();  // 기존 데이터 초기화
  }

  const response = UrlFetchApp.fetch(url);
  const json = JSON.parse(response.getContentText());
  const data = json.RESULT.OIL;

  // 헤더 작성 (한글만)
  const headers = ['해당일자', '제품코드', '제품명', '평균가격', '전일대비 등락'];
  sheet.appendRow(headers);

  // 데이터 입력
  data.forEach(oil => {
    sheet.appendRow([
      oil.TRADE_DT,
      oil.PRODCD,
      oil.PRODNM,
      parseFloat(oil.PRICE),
      oil.DIFF
    ]);
  });

  // 칼럼 폭 고정 설정
  const widths = [12, 10, 20, 12, 14]; // 원하는 폭으로 조정
  for (let i = 0; i < widths.length; i++) {
    sheet.setColumnWidth(i + 1, widths[i] * 7); // 약간 넓게 보기 좋게
  }

  // 그 외 서식 (중앙 정렬 등) 적용 가능
  sheet.getRange(1, 1, sheet.getLastRow(), headers.length).setHorizontalAlignment("center");
}

 

📝 보충 설명

  • setColumnWidth(col, px)는 픽셀 단위이므로 폭 * 7 정도가 일반적인 문자 너비로 적당합니다.
  • 정렬이나 서식도 필요하시면 추가 가능해요 (예: 가격에 천단위 쉼표 등).

필요 시 버튼과 연동하거나, 자동화 시간트리거도 함께 안내해드릴 수 있습니다.

 

4 chatGPT에 요청

자동화 시간트리거도 함께 안내해
 
 

ChatGPT의 말:

좋습니다! GAS(Google Apps Script)에서 자동화 시간 트리거를 설정하면 getAvgAllPrice() 함수를 매일 자동으로 실행해 전국 평균 유가 데이터를 시트에 갱신할 수 있습니다.


✅ 1. 시간 기반 트리거 설정 방법

① 스크립트 편집기 열기

  • 구글시트에서 확장 프로그램 → Apps Script 클릭

② 트리거 메뉴 열기

  • 상단 메뉴에서 시계 아이콘 🕒 클릭 (또는 좌측 메뉴 > 트리거 클릭)

③ 새 트리거 추가

  • 오른쪽 아래의 + 버튼 (트리거 추가) 클릭

④ 트리거 설정

항목설정 값
실행할 함수 선택 getAvgAllPrice
실행할 이벤트 소스 시간 기반 트리거
시간 기반 트리거 유형 일별 타이머
시간 선택 오전 6시~7시 사이 등 적절한 시간 선택
 

✅ 2. 시간 트리거 예시 코드로 추가 (프로그래밍 방식)

다음 코드를 한 번 실행하면 트리거가 자동으로 등록됩니다:

javascript
복사편집
function createTimeTrigger() { ScriptApp.newTrigger("getAvgAllPrice") .timeBased() .everyDays(1) // 매일 실행 .atHour(6) // 오전 6시 (한국시간) .create(); }
  • everyDays(1) → 매일 실행
  • atHour(6) → 오전 6시 실행 (0~23 기준)

✅ 3. 등록된 트리거 확인 및 삭제

등록된 트리거 보기

  • Apps Script 에서 왼쪽 메뉴 "트리거" 클릭

트리거 삭제 코드 예시

javascript
복사편집
function deleteAllTriggers() { const triggers = ScriptApp.getProjectTriggers(); for (let i = 0; i < triggers.length; i++) { ScriptApp.deleteTrigger(triggers[i]); } }

✅ 팁: 실패 대비 이메일 알림

트리거 실행 중 오류가 발생하면 연결된 구글 계정 이메일로 자동 알림이 가니 안심하세요.


필요하시면 매일 정해진 셀에 최종 업데이트 시간 기록하는 기능도 추가해드릴 수 있습니다.

 

5 chatGPT에 요청

필요하시면 매일 정해진 셀에 최종 업데이트 시간 기록하는 기능도 추가해
 

ChatGPT의 말:

좋습니다! getAvgAllPrice() 함수가 실행될 때마다 지정한 셀에 최종 업데이트 시간을 기록하도록 기능을 추가해드리겠습니다.


✅ 목표

  • 예: '전국평균' 시트의 G1 셀에 "최종 업데이트: 2025-07-27 06:01" 형식으로 기록
function getAvgAllPrice() {
  const sheetName = '전국평균';
  const apiKey = 'F25062XXXX';
  const url = `https://www.opinet.co.kr/api/avgAllPrice.do?out=json&code=${apiKey}`;

  const ss = SpreadsheetApp.getActiveSpreadsheet();
  let sheet = ss.getSheetByName(sheetName);
  if (!sheet) {
    sheet = ss.insertSheet(sheetName);
  } else {
    sheet.clear();  // 기존 데이터 초기화
  }

  const response = UrlFetchApp.fetch(url);
  const json = JSON.parse(response.getContentText());
  const data = json.RESULT.OIL;

  // 헤더 작성 (한글)
  const headers = ['해당일자', '제품코드', '제품명', '평균가격', '전일대비 등락'];
  sheet.appendRow(headers);

  // 데이터 입력
  data.forEach(oil => {
    sheet.appendRow([
      oil.TRADE_DT,
      oil.PRODCD,
      oil.PRODNM,
      parseFloat(oil.PRICE),
      oil.DIFF
    ]);
  });

  // 칼럼 폭 고정 설정
  const widths = [12, 10, 20, 12, 14];
  for (let i = 0; i < widths.length; i++) {
    sheet.setColumnWidth(i + 1, widths[i] * 7);
  }

  // 가운데 정렬
  sheet.getRange(1, 1, sheet.getLastRow(), headers.length).setHorizontalAlignment("center");

  // ✅ 최종 업데이트 시간 기록
  const now = new Date();
  const formatted = Utilities.formatDate(now, "Asia/Seoul", "yyyy-MM-dd HH:mm");
  sheet.getRange("G1").setValue("최종 업데이트: " + formatted);
}

 

📝 결과

  • G1 셀에는 실행 시마다 "최종 업데이트: 2025-07-27 06:03" 같은 텍스트가 갱신됩니다.
  • 타임존은 Asia/Seoul (KST) 기준으로 설정되어 한국 시간에 맞게 기록됩니다.

최종 작성된 코드를 구글시트 확장프로그램에서 Apps Script 메뉴에서 코드를 저장하신 다음 도형 버튼에 할당하면 됩니다. 

 

 

 

다음은 구글시트에 적용한 모습입니다. 

버튼을 누를때마다 데이터를 가져오고 업데이트 일시를 기록합니다. 

 

 

 

 

728x90