본문 바로가기
  • AI 시대에 적응하는 현대인을 위한 지식 공간
  • AI를 위한 데이터를 과학으로 역어본다
AI 활용

n8n HTTP Request노드를 사용한 Google Maps API 호출

by 피크나인 2025. 12. 26.

n8n HTTP Request 노드를 사용한 Google Maps Geocoding API 호출 완벽 가이드

핵심 키워드: n8n Geocoding, Google Maps API, HTTP Request 노드, 환경 변수 설정, 위치 좌표 변환, Queue Mode 설정

 

웹 자동화나 위치 기반 서비스를 구축할 때 주소를 좌표로 변환하는 Geocoding은 필수적인 기능입니다. 이 가이드에서는 n8n의 HTTP Request 노드를 사용하여 Google Maps Geocoding API를 호출하는 방법을 상세하게 설명합니다. 특히 n8n 2.x 버전과 Queue Mode 환경에서의 환경 변수 설정 방법까지 포함하여, 실제 프로덕션 환경에서 바로 적용할 수 있도록 구성했습니다.



1. 사전 준비 사항

Google Cloud Platform 설정  |  Google Maps Geocoding API 사용 설정

Google Maps Geocoding API를 사용하려면 먼저 Google Cloud Platform(GCP)에서 프로젝트를 생성하고 API 키를 발급받아야 합니다. GCP 콘솔(console.cloud.google.com)에 접속하여 새 프로젝트를 생성하거나 기존 프로젝트를 선택합니다. 그 다음 "API 및 서비스" 메뉴에서 "라이브러리"로 이동하여 "Geocoding API"를 검색하고 활성화합니다. API가 활성화되면 "사용자 인증 정보" 메뉴에서 "사용자 인증 정보 만들기" > "API 키"를 선택하여 새로운 API 키를 생성합니다.

단계 작업 위치
1 GCP 프로젝트 생성/선택 console.cloud.google.com
2 Geocoding API 활성화 API 및 서비스 > 라이브러리
3 API 키 생성 사용자 인증 정보 > API 키
4 키 제한 설정 (권장) API 키 편집

Google Cloud Platform에서 사용중인 프로젝트에 'Google Maps Geocoding API'를 추가합니다
Google Cloud Platform에서 사용중인 프로젝트에 'Google Maps Geocoding API'를 추가합니다

API 키 보안 설정 (권장)

생성된 API 키는 보안을 위해 제한 설정을 하는 것이 좋습니다. API 키 편집 화면에서 "애플리케이션 제한사항"에서 IP 주소나 HTTP 리퍼러를 제한할 수 있고, "API 제한사항"에서 Geocoding API만 허용하도록 설정할 수 있습니다. 이렇게 하면 API 키가 노출되더라도 악용 위험을 줄일 수 있습니다.

 

권장 보안 설정:

  • 애플리케이션 제한: n8n 서버 IP 주소로 제한 (테스트 환경에서는 설정하지 않으면, 모든 곳에서 접근 가능합니다)
  • API 제한: Geocoding API만 허용
  • 할당량 설정: 일일 요청 수 제한 설정

2. n8n 환경 변수 설정

n8n에서 API 키와 같은 민감한 정보를 안전하게 관리하려면 환경 변수를 사용하는 것이 좋습니다. 하지만 n8n은 보안상의 이유로 기본적으로 워크플로우에서 환경 변수 접근을 차단하고 있어, 별도의 설정이 필요합니다.

환경 변수 접근 권한 이해

┌─────────────────────────────────────────────────────────────┐
│  .env 파일                                                   │
│  GOOGLE_MAPS_API_KEY=AIzaSyB123...                          │
└─────────────────────┬───────────────────────────────────────┘
                      │ ① Docker Compose가 자동으로 읽음
                      ▼
┌─────────────────────────────────────────────────────────────┐
│  Docker 컨테이너 환경 변수                                      │
│  GOOGLE_MAPS_API_KEY=AIzaSyB123... > 존재함                  │
└─────────────────────┬───────────────────────────────────────┘
                      │ ② 기본 설정에서는 여기서 차단됨!
                      ▼
┌─────────────────────────────────────────────────────────────┐
│  n8n 워크플로우 내부                                            │
│  {{ $env.GOOGLE_MAPS_API_KEY }}  > 접근 거부 (기본값)           │
└─────────────────────────────────────────────────────────────┘

단일 컨테이너 환경 설정

n8n을 단일 컨테이너로 실행하는 경우의 설정 방법입니다.

 

.env 파일 설정:

# Google Maps API Key 설정
GOOGLE_MAPS_API_KEY=AIzaSyDdoObZ4w_v0hntf2AezHAjxu6beZNh8-M

# n8n 환경 변수 접근 권한 설정 (필수!)
N8N_BLOCK_ENV_ACCESS_IN_NODE=false

 

docker-compose.yml 설정:

services:
  n8n:
    image: n8nio/n8n:latest
    environment:
      - N8N_BLOCK_ENV_ACCESS_IN_NODE=${N8N_BLOCK_ENV_ACCESS_IN_NODE}
      - GOOGLE_MAPS_API_KEY=${GOOGLE_MAPS_API_KEY}

    # 특정 변수만 허용 (쉼표로 구분)
    # N8N_BLOCK_ENV_ACCESS_IN_NODE=false로 설정된 경우는 굳이 추가로 설정할 필요 없음 
      - N8N_ALLOWED_ENVIRONMENT_VARIABLES=GOOGLE_MAPS_API_KEY,AIRTOP_API_KEY  
    # ... 기타 설정

Queue Mode 환경 설정 (n8n-main, n8n-worker, n8n-webhook)

Queue Mode로 n8n을 운영하는 경우, 모든 n8n 컨테이너에 환경 변수를 설정해야 합니다. 특히 실제 워크플로우 실행은 worker 컨테이너가 담당하므로, worker에 설정이 누락되면 에러가 발생합니다.

 

.env 파일 설정:

# Google Maps API Key 설정
GOOGLE_MAPS_API_KEY=AIzaSyDdoObZ4w_v0hntf2AezHAjxu6beZNh8-M

# n8n 환경 변수 접근 권한 설정
N8N_BLOCK_ENV_ACCESS_IN_NODE=false

 

docker-compose.yml 설정 (Queue Mode):

services:
  n8n-main:
    image: n8nio/n8n:latest
    environment:
      - N8N_BLOCK_ENV_ACCESS_IN_NODE=${N8N_BLOCK_ENV_ACCESS_IN_NODE}
      - GOOGLE_MAPS_API_KEY=${GOOGLE_MAPS_API_KEY}
      # ... 기타 n8n-main 설정

  n8n-worker:
    image: n8nio/n8n:latest
    command: worker
    environment:
      # worker에도 반드시 설정 필요!
      - N8N_BLOCK_ENV_ACCESS_IN_NODE=${N8N_BLOCK_ENV_ACCESS_IN_NODE}
      - GOOGLE_MAPS_API_KEY=${GOOGLE_MAPS_API_KEY}
      # ... 기타 n8n-worker 설정

  n8n-webhook:
    image: n8nio/n8n:latest
    command: webhook
    environment:
      # webhook 컨테이너에도 설정
      - N8N_BLOCK_ENV_ACCESS_IN_NODE=${N8N_BLOCK_ENV_ACCESS_IN_NODE}
      - GOOGLE_MAPS_API_KEY=${GOOGLE_MAPS_API_KEY}
      # ... 기타 n8n-webhook 설정

설정 적용 및 확인

설정 후 컨테이너를 재시작하고 환경 변수가 제대로 적용되었는지 확인합니다.

# 컨테이너 재시작
docker-compose down
docker-compose up -d

# 환경 변수 확인 (모든 n8n 컨테이너에서)
docker exec n8n-main env | grep -E "(GOOGLE_MAPS|N8N_BLOCK)"
docker exec n8n-worker env | grep -E "(GOOGLE_MAPS|N8N_BLOCK)"
docker exec n8n-webhook env | grep -E "(GOOGLE_MAPS|N8N_BLOCK)"

 

예상 출력:

N8N_BLOCK_ENV_ACCESS_IN_NODE=false
GOOGLE_MAPS_API_KEY=AIzaSyDdoObZ4w_v0hntf2AezHAjxu6beZNh8-M

에디터 미리보기 vs 실제 실행

환경 변수를 올바르게 설정했더라도, n8n 에디터에서 Expression을 입력할 때 빨간색으로 표시되고 "[access to env vars denied]" 메시지가 나타날 수 있습니다. 이것은 정상적인 동작입니다.

상황 표시 실제 동작
에디터 미리보기 빨간색 + "access denied" 브라우저에서는 서버 환경 변수 접근 불가 (보안상 정상)
실제 실행 - 정상 작동 

 

n8n 에디터는 브라우저에서 실행되므로, 보안상 서버의 환경 변수를 미리 볼 수 없습니다. 실제 워크플로우 실행 시에는 서버(Worker)에서 환경 변수에 정상적으로 접근하므로 걱정하지 않아도 됩니다.

API 키 관리 방법 비교

방법 사용법 장점 단점
환경 변수 ($env) {{ $env.GOOGLE_MAPS_API_KEY }} 서버 레벨 관리, CI/CD 연동 용이, 보안성 높음 컨테이너 재시작 필요, 에디터 미리보기 불가
Variables ($vars) {{ $vars.GOOGLE_MAPS_API_KEY }} UI에서 관리, 재시작 불필요 Enterprise 기능일 수 있음
직접 입력 AIzaSyB123... 간단함 보안 취약, 공유 시 노출 위험
권장: 프로덕션 환경에서는 환경 변수 방식을 사용하세요.

3. HTTP Request 노드 설정

기본 Geocoding 요청  |  주소 → 위,경도 좌표 변환

주소를 입력받아 위도/경도 좌표로 변환하는 가장 기본적인 설정입니다.

 

노드 설정:

설정 항목값
Method GET
URL https://maps.googleapis.com/maps/api/geocode/json
Authentication None : 주소값의 파라미터로 동작하는게 가장 일반적으로 별도의 인증절차 필요 없음
Send Query Parameters ON

 

Query Parameters:

Name  Value 설명
address {{ $json.searchAddress }} 이전 노드에서 전달받은 주소
key {{ $env.GOOGLE_MAPS_API_KEY }} 환경 변수에서 API 키 로드
language ko 한국어 결과 반환
GOOGLE_MAPS_API_KEY : API키 값을 직접 입력해도 됩니다. 다만 보안상의 이유로 .env와 docker-compose.yml에 환경변수로 등록하고 등록된 환경변수를 사용하는것을 권장합니다.

Google Maps 표준 사용자 인터페이스
Google Maps 표준 사용자 인터페이스

실제 노드 JSON 설정 예시

{
  "parameters": {
    "method": "GET",
    "url": "https://maps.googleapis.com/maps/api/geocode/json",
    "sendQuery": true,
    "queryParameters": {
      "parameters": [
        {
          "name": "address",
          "value": "={{ $json.searchAddress }}"
        },
        {
          "name": "key",
          "value": "={{ $env.GOOGLE_MAPS_API_KEY }}"
        },
        {
          "name": "language",
          "value": "ko"
        }
      ]
    },
    "options": {}
  },
  "name": "Google Maps Geocoding",
  "type": "n8n-nodes-base.httpRequest",
  "typeVersion": 4.2,
  "position": [620, 300]
}

추가 파라미터 옵션

필요에 따라 다음 파라미터를 추가하여 검색 결과를 세밀하게 제어할 수 있습니다.

파라미터 설명 예시 값
region 검색 결과 우선순위 지역 kr (한국)
bounds 검색 범위 제한 (위도,경도) 34.0,125.0|38.0,130.0
components 주소 구성 요소 필터 country:KR

4. API 응답 처리

응답 데이터 구조

Google Maps Geocoding API는 다음과 같은 JSON 구조로 응답합니다:

{
  "results": [
    {
      "address_components": [
        {
          "long_name": "152",
          "short_name": "152",
          "types": ["street_number"]
        },
        {
          "long_name": "테헤란로",
          "short_name": "테헤란로",
          "types": ["route"]
        },
        {
          "long_name": "강남구",
          "short_name": "강남구",
          "types": ["sublocality_level_1", "political"]
        },
        {
          "long_name": "서울특별시",
          "short_name": "서울특별시",
          "types": ["locality", "political"]
        },
        {
          "long_name": "대한민국",
          "short_name": "KR",
          "types": ["country", "political"]
        }
      ],
      "formatted_address": "대한민국 서울특별시 강남구 테헤란로 152",
      "geometry": {
        "location": {
          "lat": 37.5000123,
          "lng": 127.0360456
        },
        "location_type": "ROOFTOP",
        "viewport": {
          "northeast": { "lat": 37.5013612, "lng": 127.0373945 },
          "southwest": { "lat": 37.4986632, "lng": 127.0346966 }
        }
      },
      "place_id": "ChIJ...",
      "types": ["street_address"]
    }
  ],
  "status": "OK"
}

HTTP Request 노드를 활용한 Google Maps Geocoding API를 활용하여 위치정보를 확인합니다
HTTP Request 노드를 활용한 Google Maps Geocoding API를 활용하여 위치정보를 확인합니다

좌표 추출을 위한 Set/Edit Fields 노드

HTTP Request 다음에 Set 노드를 추가하여 필요한 데이터만 추출합니다:

 

Set 노드 설정:

필드 이름 값 (Expression) 타입
latitude {{ $json.results[0].geometry.location.lat }} Number
longitude {{ $json.results[0].geometry.location.lng }} Number
formattedAddress {{ $json.results[0].formatted_address }} String
placeId {{ $json.results[0].place_id }} String

Code 노드를 활용한 고급 데이터 처리

더 복잡한 처리가 필요한 경우 Code 노드를 사용합니다:

// Google Maps Geocoding 응답 처리
const response = $input.first().json;

// 응답 상태 확인
if (response.status !== 'OK') {
  throw new Error(`Geocoding failed: ${response.status}`);
}

// 결과가 없는 경우 처리
if (!response.results || response.results.length === 0) {
  return {
    json: {
      success: false,
      error: 'No results found'
    }
  };
}

// 첫 번째 결과 추출
const result = response.results[0];

// 주소 구성 요소에서 특정 정보 찾는 헬퍼 함수
const findAddressComponent = (types) => {
  const component = result.address_components.find(c => 
    types.some(type => c.types.includes(type))
  );
  return component ? component.long_name : null;
};

return {
  json: {
    success: true,
    latitude: result.geometry.location.lat,
    longitude: result.geometry.location.lng,
    formattedAddress: result.formatted_address,
    placeId: result.place_id,
    locationType: result.geometry.location_type,
    // 주소 구성 요소 파싱
    addressComponents: {
      country: findAddressComponent(['country']),
      city: findAddressComponent(['locality', 'administrative_area_level_1']),
      district: findAddressComponent(['sublocality_level_1', 'sublocality']),
      street: findAddressComponent(['route']),
      streetNumber: findAddressComponent(['street_number']),
      postalCode: findAddressComponent(['postal_code'])
    },
    // 뷰포트 정보 (지도 표시 시 유용)
    viewport: result.geometry.viewport
  }
};

5. 역 지오코딩 (좌표 → 주소 변환)

HTTP Request 노드 설정

좌표를 주소로 변환하는 역 지오코딩도 동일한 API를 사용합니다. 하나의 HTTP Request안에 'address'와 'latlng'를 모두 정의하고, 둘 중의 하나값만 채워 넣어서 사용하실 수 도 있습니다. 우리가 필요로 하는 대부분의 결과값은 'results[0]'안에 모두 있습니다. Edit Filelds(Set)노드를 이용해 필요한 필드값만 정리해서 사용하시면 됩니다.

 

Query Parameters:

Name Value 설명
latlng {{ $json.latitude }},{{ $json.longitude }} 위도,경도 형식
key {{ $env.GOOGLE_MAPS_API_KEY }} API 키
language ko 한국어 결과
result_type street_address 선택적 - 결과 유형 필터

 

URL 예시:

https://maps.googleapis.com/maps/api/geocode/json?latlng=37.5665,126.9780&key=YOUR_API_KEY&language=ko

result_type 옵션

역 지오코딩 시 특정 유형의 결과만 받고 싶을 때 사용합니다. 별도로 지정하지 않는 경우 'results[0] ~ results[10]'까지 다양한 형태의 주소값을 반환합니다.

result_type 설명
street_address 정확한 도로명 주소
route 도로명
intersection 교차로
political 행정 구역
country 국가
administrative_area_level_1 시/도
administrative_area_level_2 시/군/구
locality 도시
sublocality 동/읍/면
postal_code 우편번호

6. 실전 워크플로우 예시

Airbnb 위치 검색 통합 워크플로우

Airtop과 연동하여 특정 위치 주변의 숙소를 검색하는 워크플로우입니다.

[Form Trigger]
사용자가 "에펠탑 주변 2km" 입력
    ↓
[Set Node - 검색 조건 설정]
searchAddress: "에펠탑, 파리, 프랑스"
searchRadius: 2000 (미터)
    ↓
[HTTP Request - Geocoding]
GET https://maps.googleapis.com/maps/api/geocode/json
  ?address={{ $json.searchAddress }}
  &key={{ $env.GOOGLE_MAPS_API_KEY }}
  &language=ko
    ↓
[IF Node - 상태 확인]
{{ $json.status }} === "OK" ?
    ↓ (Yes)
[Set Node - 좌표 추출]
lat: {{ $json.results[0].geometry.location.lat }}
lng: {{ $json.results[0].geometry.location.lng }}
address: {{ $json.results[0].formatted_address }}
    ↓
[Airtop - Create Session]
    ↓
[Airtop - Load URL]
Airbnb 검색 페이지 로드
    ↓
[Airtop - Query Page]
숙소 정보 추출
    ↓
[Google Sheets - 결과 저장]
    ↓
[Airtop - Terminate Session]

전체 워크플로우 JSON

{
  "nodes": [
    {
      "parameters": {
        "formTitle": "숙소 위치 검색",
        "formDescription": "검색할 위치와 반경을 입력하세요",
        "formFields": {
          "values": [
            {
              "fieldLabel": "검색 위치",
              "fieldType": "text",
              "requiredField": true,
              "placeholder": "예: 에펠탑, 파리"
            },
            {
              "fieldLabel": "반경 (km)",
              "fieldType": "number",
              "requiredField": true,
              "placeholder": "2"
            }
          ]
        }
      },
      "name": "Form Trigger",
      "type": "n8n-nodes-base.formTrigger",
      "position": [240, 300]
    },
    {
      "parameters": {
        "method": "GET",
        "url": "https://maps.googleapis.com/maps/api/geocode/json",
        "sendQuery": true,
        "queryParameters": {
          "parameters": [
            {
              "name": "address",
              "value": "={{ $json['검색 위치'] }}"
            },
            {
              "name": "key",
              "value": "={{ $env.GOOGLE_MAPS_API_KEY }}"
            },
            {
              "name": "language",
              "value": "ko"
            }
          ]
        },
        "options": {
          "timeout": 10000
        }
      },
      "name": "Geocoding API",
      "type": "n8n-nodes-base.httpRequest",
      "position": [460, 300]
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict"
          },
          "conditions": [
            {
              "leftValue": "={{ $json.status }}",
              "rightValue": "OK",
              "operator": {
                "type": "string",
                "operation": "equals"
              }
            }
          ],
          "combinator": "and"
        }
      },
      "name": "Check Status",
      "type": "n8n-nodes-base.if",
      "position": [680, 300]
    },
    {
      "parameters": {
        "mode": "manual",
        "assignments": {
          "assignments": [
            {
              "id": "lat",
              "name": "latitude",
              "value": "={{ $json.results[0].geometry.location.lat }}",
              "type": "number"
            },
            {
              "id": "lng",
              "name": "longitude",
              "value": "={{ $json.results[0].geometry.location.lng }}",
              "type": "number"
            },
            {
              "id": "addr",
              "name": "formattedAddress",
              "value": "={{ $json.results[0].formatted_address }}",
              "type": "string"
            },
            {
              "id": "place",
              "name": "placeId",
              "value": "={{ $json.results[0].place_id }}",
              "type": "string"
            }
          ]
        }
      },
      "name": "Extract Coordinates",
      "type": "n8n-nodes-base.set",
      "position": [900, 280]
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "error",
              "name": "error",
              "value": "Geocoding failed - location not found",
              "type": "string"
            }
          ]
        }
      },
      "name": "Handle Error",
      "type": "n8n-nodes-base.set",
      "position": [900, 480]
    }
  ],
  "connections": {
    "Form Trigger": {
      "main": [[{ "node": "Geocoding API", "type": "main", "index": 0 }]]
    },
    "Geocoding API": {
      "main": [[{ "node": "Check Status", "type": "main", "index": 0 }]]
    },
    "Check Status": {
      "main": [
        [{ "node": "Extract Coordinates", "type": "main", "index": 0 }],
        [{ "node": "Handle Error", "type": "main", "index": 0 }]
      ]
    }
  }
}

배치 처리  |  여러 주소 한 번에 변환

여러 주소를 한 번에 처리해야 할 때는 Loop를 활용합니다:

[Google Sheets - 주소 목록 읽기]
    ↓
[Loop Over Items]
    ↓
[HTTP Request - Geocoding]
    ↓
[Wait - 200ms] (Rate Limit 대응)
    ↓
[Loop 종료]
    ↓
[Google Sheets - 결과 저장]

 

Wait 노드 설정:

Google Maps API는 초당 요청 수 제한이 있으므로, 각 요청 사이에 적절한 딜레이를 추가합니다:

{
  "parameters": {
    "amount": 200,
    "unit": "milliseconds"
  },
  "name": "Wait",
  "type": "n8n-nodes-base.wait"
}

7. 에러 처리 및 모범 사례

상태 코드별 처리

Status 의미 처리방법
OK 성공 정상 처리 진행
ZERO_RESULTS 결과 없음 사용자에게 재입력 요청
OVER_QUERY_LIMIT 할당량 초과 대기 후 재시도 또는 관리자 알림
REQUEST_DENIED API 키 문제 API 키 확인 및 재설정 필요
INVALID_REQUEST 잘못된 요청 입력값 검증
UNKNOWN_ERROR 서버 오류 재시도

Code 노드를 활용한 에러 처리

const response = $input.first().json;

const statusHandlers = {
  'OK': () => ({
    success: true,
    data: response.results[0]
  }),
  'ZERO_RESULTS': () => ({
    success: false,
    error: '해당 주소를 찾을 수 없습니다. 주소를 확인해 주세요.',
    code: 'NOT_FOUND'
  }),
  'OVER_QUERY_LIMIT': () => ({
    success: false,
    error: 'API 요청 한도를 초과했습니다. 잠시 후 다시 시도해 주세요.',
    code: 'RATE_LIMITED'
  }),
  'REQUEST_DENIED': () => ({
    success: false,
    error: 'API 키가 유효하지 않거나 권한이 없습니다.',
    code: 'AUTH_ERROR'
  }),
  'INVALID_REQUEST': () => ({
    success: false,
    error: '잘못된 요청입니다. 주소 형식을 확인해 주세요.',
    code: 'INVALID_INPUT'
  })
};

const handler = statusHandlers[response.status] || (() => ({
  success: false,
  error: `알 수 없는 오류: ${response.status}`,
  code: 'UNKNOWN'
}));

return { json: handler() };

재시도 로직 구현

HTTP Request 노드의 Settings에서 재시도 옵션을 설정합니다:

설정 권장값 설명
Retry On Fail ON 실패 시 재시도 활성화
Max Tries 3 최대 재시도 횟수
Wait Between Tries 1000ms 재시도 간 대기 시간

Rate Limiting 대응

Google Maps API는 초당/일일 요청 수 제한이 있습니다. 대량 처리 시 다음을 고려하세요:

// 지수 백오프 방식의 재시도 로직 예시
const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms));

const geocodeWithRetry = async (address, maxRetries = 3) => {
  for (let i = 0; i < maxRetries; i++) {
    try {
      const result = await geocode(address);
      if (result.status === 'OVER_QUERY_LIMIT') {
        // 지수 백오프: 1초, 2초, 4초...
        await delay(Math.pow(2, i) * 1000);
        continue;
      }
      return result;
    } catch (error) {
      if (i === maxRetries - 1) throw error;
      await delay(Math.pow(2, i) * 1000);
    }
  }
};

8. 비용 및 할당량 관리

Google Maps Platform 가격 정책

Google Maps Geocoding API는 월 200달러 상당의 무료 크레딧을 제공합니다. 이는 대략 월 40,000건의 Geocoding 요청에 해당합니다.

사용량 가격(1,000건당)
0 ~ 40,000건/월 무료 (월 $200 크레딧)
40,001건 이상 $5.00

할당량 모니터링

GCP 콘솔에서 API 사용량을 모니터링하고 알림을 설정할 수 있습니다:

  1. APIs & Services > Credentials 에서 API 키 사용량 확인
  2. APIs & Services > Quotas 에서 할당량 설정
  3. Billing > Budgets & Alerts 에서 예산 알림 설정

요청 최적화 팁

방법 설명 절감 효과
캐싱 동일 주소 결과를 DB에 저장하고 재사용 50~80%
배치 처리 유사 위치 요청을 그룹화 20~30%
결과 필터링 필요한 result_type만 요청 응답 속도 향상
입력 검증 유효하지 않은 주소 사전 필터링 불필요한 요청 제거

9. 트러블슈팅

자주 발생하는 문제와 해결 방법

문제 1  |  "access to env vars denied" 에러

원인: n8n 환경 변수 접근 권한이 설정되지 않음

해결 : n8n '.env'와 'docker-compose.yml'에 환경관련 변수의 접근권한 관련 설정을 추가

# .env 파일에 추가
N8N_BLOCK_ENV_ACCESS_IN_NODE=false
# docker-compose.yml의 모든 n8n 컨테이너에 추가
environment:
  - N8N_BLOCK_ENV_ACCESS_IN_NODE=${N8N_BLOCK_ENV_ACCESS_IN_NODE}

문제 2  |  Queue Mode에서만 에러 발생

원인: worker 컨테이너에 환경 변수가 설정되지 않음

해결: n8n-main, n8n-worker, n8n-webhook 모든 컨테이너에 동일한 환경 변수 설정

# 확인 명령어
docker exec n8n-worker env | grep N8N_BLOCK

문제 3  |  에디터에서 빨간색으로 표시됨

원인: 정상 동작 - 브라우저에서는 서버 환경 변수에 접근 불가

해결: 무시해도 됨. 실제 실행 시에는 정상 작동

문제 4  |  REQUEST_DENIED 에러

원인: API 키 문제

해결 체크리스트:

  • [ ] Geocoding API가 활성화되어 있는지 확인
  • [ ] API 키가 올바른지 확인
  • [ ] API 키 제한 설정이 현재 서버 IP를 허용하는지 확인
  • [ ] 결제 계정이 연결되어 있는지 확인

문제 5  |  OVER_QUERY_LIMIT 에러

원인: API 요청 한도 초과

해결:

  • 요청 간 딜레이 추가 (최소 200ms 권장)
  • 일일 할당량 확인 및 필요시 증가 요청
  • 캐싱 구현으로 중복 요청 제거

디버깅 체크리스트

# 1. 환경 변수 확인
docker exec n8n-main env | grep -E "(GOOGLE_MAPS|N8N_BLOCK)"

# 2. API 키 유효성 테스트 (터미널에서)
curl "https://maps.googleapis.com/maps/api/geocode/json?address=Seoul&key=YOUR_API_KEY"

# 3. n8n 로그 확인
docker-compose logs -f n8n-main
docker-compose logs -f n8n-worker

# 4. 컨테이너 재시작
docker-compose down && docker-compose up -d

이 가이드에서는 n8n HTTP Request 노드를 사용하여 Google Maps Geocoding API를 호출하는 방법을 상세히 다루었습니다. 특히 n8n 2.x 버전과 Queue Mode 환경에서의 환경 변수 설정은 많은 사용자가 겪는 어려움이므로, 이 부분을 충분히 이해하고 적용하시기 바랍니다.


참고 자료