공공데이터포털에서 아파트 매매 동향 확인하고 google sheet 에 저장하기 (사례1)

소개

공공데이터에서 아파트 매매실거래가 를 API 로 불러와서 google sheet 에 저장을 합니다.

API 는 "월(시간)" & "구(위치)" 단위로만 데이터를 가져올 수 있으므로, 여러번 반복하여 누적 데이터를 만드는 것이 목표 입니다.

세가지 단계로 진행합니다.

  1. 공공데이터 포털에서 데이터 가져오기 설정하기

  2. N8N 워크플로우 작성하여 아파트 매매실거래가 데이터를 google sheet 에 저장하기

  3. 서울 구 별로 데이터 불러와서 google sheet 에 누적하기


단계 1 : 공공데이터 포털에서 데이터 검색 및 사용 허가 받기

데이터를 검색할 때, "오픈 API" 형태의 데이터를 사용하도록 합니다.

데이터를 선택하여 "활용신청" 을 누릅니다. 바로 사용 허가를 받을 수 있습니다.

상세 페이지에서 아래와 같은 API 상세 설명 hwp 파일을 받을 수 있습니다.

Call Back URL 이 접속할 주소 입니다.

데이터에 따라 아래와 같이 API 테스트 기능을 제공하는데, 매뉴얼을 참조하여 테스트 값을 넣어 보고 정상적으로 데이터를 불러 올 수 있는지 확인합니다.

이때, 인증키는 데이터 신청 시 내 페이지에 개별적으로 제공한 값 입니다.
Response 에서 XML 형태의 데이터 출력을 확인 하였다면, N8N 워크플로우 꾸미기로 넘어 갑니다.


단계 2. N8N 워크플로우 꾸미기

간단하게 3개의 노드로 구성할 수 있습니다.

공공데이터의 API 를 호출 할 "HTTP Request", 불필요한 데이터를 삭제 할 "Code", goole Sheets 저장 노드 입니다.

위의 공공데이터 테스트 과정 그림 처럼 똑같이 "HTTP Request" 를 설정합니다.

Method = GET,

Query Parameters 에 LAWD_CD, DEAL_YMD, serviceKey 를 추가하고 테스트 값을 입력 합니다.
그리고 "Test" 버튼을 눌러 정상적으로 데이터 가져 옴을 확인합니다.

두번째는 코드 블럭 작성인데, 아래와 같인 ChatGPT 4o 로 물어봐서 코드를 작성 합니다.
(첫번째 그림: 프롬프트 작성 내용, 두번째 그림: 입력 데이터에서 추출값 정보 확인 방법)

CSS 코드 편집기의 스크린샷

GPT 가 추천하는 코드를 copy 하여 코드 노드에 붙여 넣은 후, 동작을 확인합니다.

셋째, Google sheet 에 Credential 를 생성해야 하는데, 생성 시 아래와 같은 문구가 나오면 권한 설정에 성공한 것입니다. 아래 문구가 나오지 않는다면, google cloud console 에서 redirect 관련 추가 설정을 해야 할 수 있습니다 (매뉴얼 참고...)

만약 코드 노드에서 출력되는 데이터가 아래 처럼 리스트 타입으로 item 형태가 모두 동일하다면 (코드 노드에서 잘 잘라내면 아래와 같은 형태를 만들 수 있음) google sheet 의 특별한 설정 없이 자동으로 테이블 생성이 될 수 있습니다.

브라우저의 CSS 파일 스크린샷

아래는 google sheet 설정 값 입니다. 위와 같은 데이터 형태라면 "Map Automatically" 를 선택하여도 제대로 저장 될 수 있습니다.

Google 스프레드시트 설정 페이지의 스크린샷

데이터 저장 나쁜 사례:

숫자 수를 보여주는 스프레드시트의 스크린샷

데이터 저장 좋은 사례:


단계 3. 여러 지역의 매매가 를 하나의 sheet 에 누적하기

공공 데이터 매뉴얼에 지역 코드를 www.code.go.kr 에서 참조라고 하였는데, 사이트 접속 할 필요 없이 아래와 같이 ChatGPT 에게 물어보면 쉽게 확인 할 수 있습니다.

반복 실행 시, 코드 블록을 활용하여 지역 코드를 "HTTP Reqeust" 노드에 입력 해야 하는데 아래와 같이 ChatGPT 에게 물어봐서 코드 작성을 요청 합니다.

아래 코드를 활용하면 됩니다.

const districtCodes = [
  { name: "종로구", code: "11110" },
  { name: "중구", code: "11140" },
  { name: "용산구", code: "11170" },
  { name: "성동구", code: "11200" },
  { name: "광진구", code: "11215" },
  { name: "동대문구", code: "11230" },
  { name: "중랑구", code: "11260" },
  { name: "성북구", code: "11290" },
  { name: "강북구", code: "11305" },
  { name: "도봉구", code: "11320" },
  { name: "노원구", code: "11350" },
  { name: "은평구", code: "11380" },
  { name: "서대문구", code: "11410" },
  { name: "마포구", code: "11440" },
  { name: "양천구", code: "11470" },
  { name: "강서구", code: "11500" },
  { name: "구로구", code: "11530" },
  { name: "금천구", code: "11545" },
  { name: "영등포구", code: "11560" },
  { name: "동작구", code: "11590" },
  { name: "관악구", code: "11620" },
  { name: "서초구", code: "11650" },
  { name: "강남구", code: "11680" },
  { name: "송파구", code: "11710" },
  { name: "강동구", code: "11740" },
];

// 각각의 항목을 개별 아이템으로 변환
return districtCodes.map(district => ({
  json: district
}));

핵심은 items 를 복수개로 만들어 두고, Loop 노드로 하나씩 실행하여 "HTTP Request" 를 발생 시키는 것입니다. Loop 노드는 Batch Size =1 로 설정하고, HTTP Reuqeust 의 LAWD_CD = "code" 가 되도록 합니다.

여러 지역 매매가가 저장됨을 확인할 수 있습니다.

한국어 이름과 숫자가 나열된 테이블

고려 사항: 생성된 Item (거래가 1건) 마다 Google Sheet 의 rows 1 개를 생성할 경우, Problem in node ‘Google Sheets1‘ The service is receiving too many requests from you 라는 에러가 발생함. 다른 대안이 필요함

1

👉 이 게시글도 읽어보세요