Google Maps APIs 웹 서비스에 대한 사용 제한

이 페이지는 이전 Maps APIs for Work 또는 Maps API for Business 라이선스가 있는 고객만을 위한 것입니다. 이 페이지는 2016년 1월에 출시된 새 Google Maps API 프리미엄 플랜가 있는 고객에게는 적용되지 않습니다.

2011년 12월

Google Maps APIs 웹 서비스를 사용하면 요청이 24시간당 특정 개수로 제한됩니다. 이러한 한도를 초과하여 전송된 요청은 오류 메시지를 받습니다.

사용 제한은 이전 라이선스의 Google Maps APIs for Work FAQ에 설명되어 있습니다.

이 글은 웹 서비스 사용 제한에 도달하여 웹 서비스를 훨씬 효율적으로 사용할 수 있도록 애플리케이션을 최적화해야 하는 Google Maps APIs for Work 고객을 대상으로 합니다.

기본 사항

Google Maps는 애플리케이션 내에서 사용할 Google 지도 데이터를 요청하는 인터페이스로 웹 서비스를 제공합니다. 이 서비스는 Google 지도와 함께 사용해야 합니다. Google 지도에서 표시하지 않고 이러한 서비스의 데이터를 사용하는 것은 허용되지 않습니다. 자세한 내용은 Google Maps APIs 서비스 라이선스 제한 약관을 참조하세요.

Google Maps APIs Web Services의 사용을 제한하는 할당량 유형은 장기간(하루당 할당량) 및 단기간(요청 속도 할당량)의 두 가지가 있습니다. 사용 제한을 초과했거나 서비스를 남용한 경우, 웹 서비스에서 특정한 오류 메시지를 반환합니다. 제한을 계속 초과할 경우, 웹 서비스에 대한 액세스 권한이 차단될 수 있습니다. 또한, 403 Forbidden 응답을 받을 수도 있습니다.

참고: 클라이언트측 API에 다른 제한이 적용될 수 있습니다. Maps JavaScript API는 지도 세션별로 속도가 제한되므로, 요청이 사용자들 간에 분산됩니다. 이 경우 사용자 수가 증가함에 따라 브라우저 기반 사용량을 확장할 수 있습니다. 서버측 웹 서비스와 클라이언트측 웹 서비스 중에서 선택하는 방법에 대한 자세한 내용은 지오코딩 전략 문서를 참조하세요.

문제

다음의 경우 Google Maps APIs 웹 서비스의 사용 제한을 초과할 수 있습니다.

  • 하루당 너무 많은 요청을 전송하는 경우.
  • 너무 빨리 즉, 초당 너무 많은 요청을 전송하는 경우.
  • 너무 오랫동안 너무 빨리 요청을 전송하거나 웹 서비스를 남용하는 경우.
  • 다른 사용 제한을 초과하는 경우(예: Google Maps Elevation API에서 요청당 지점).

사용 제한 초과됨

사용 제한을 초과하면 OVER_QUERY_LIMIT 상태 코드가 응답으로 나타납니다.

즉, 웹 서비스는 정상적인 응답 제공을 중단하고, 더 많은 사용량이 다시 허용될 때까지 상태 코드 OVER_QUERY_LIMIT만을 반환합니다. 이 상황은 다음과 같은 경우에 발생할 수 있습니다.

  • 애플리케이션이 초당 너무 많은 요청을 전송하여 오류가 수신되고 몇 초 이내의 경우.
  • 애플리케이션이 하루당 너무 많은 요청을 전송하여 오류가 수신되고 향후 24시간 이내의 경우. 일일 할당량은 태평양 시간으로 자정에 재설정됩니다.

이 스크린캐스트는 적절한 요청 차단과 오류 처리 방법을 단계별로 설명하며, 이는 모든 웹 서비스에 적용됩니다.

OVER_QUERY_LIMIT 상태 코드를 응답으로 받은 후 애플리케이션은 어느 사용 제한이 초과되었는지 알아내야 합니다. 2초간 정지했다가 동일한 요청을 전송하면 알 수 있습니다. 상태 코드가 여전히 OVER_QUERY_LIMIT라면 애플리케이션이 하루에 전송할 수 있는 요청 수를 초과한 것입니다. 그렇지 않을 경우 애플리케이션이 1초에 너무 많은 요청을 보낸다는 뜻입니다.

다음은 Phython으로 구현한 예시입니다.

url = "MAPS_API_WEBSERVICE_URL"
attempts = 0
success = False

while success != True and attempts < 3:
  raw_result = urllib.urlopen(url).read()
  attempts += 1
  # The GetStatus function parses the answer and returns the status code
  # This function is out of the scope of this example (you can use a SDK).
  status = GetStatus(raw_result)
  if status == "OVER_QUERY_LIMIT":
    time.sleep(2)
    # retry
    continue
  success = True

if attempts == 3:
  # send an alert as this means that the daily limit has been reached
  print "Daily limit has been reached"

참고: OVER_QUERY_LIMIT 오류가 나타날 수도 있습니다.

애플리케이션은 요청을 보내기 전에 이러한 제한을 초과하지 않는지 확인해야 합니다.

HTTP 403 응답

웹 서비스에 대한 요청은 HTTP 403(Forbidden) 오류를 반환할 수도 있습니다. 대부분의 경우, 잘못된 URL 서명이 원인입니다. 이를 확인하려면 clientsignature 매개변수를 삭제하고 다시 시도해보세요.

  • 응답 HTTP 200(OK)라면 서명이 문제입니다.
    이 문제는 사용 제한과 관계가 없으므로 자세한 내용은 Google Maps APIs for Work의 웹 서비스 장에서 승인 문제 해결을 참조하세요.
  • 응답이 여전히 HTTP 403(Forbidden) 오류라면 서명이 아니라 사용 제한과 관련된 문제일 수 있습니다.
    일반적으로 애플리케이션이 너무 오랫동안 사용 제한을 초과하거나 웹 서비스를 악용하였다는 이유로 웹 서비스에 대한 액세스가 차단되었기 때문입니다. 이 문제가 발생하면 Google Cloud Support Portal에 액세스하세요. 연락처 정보는 지원 및 리소스 페이지에서도 참조할 수 있습니다.

모든 웹 서비스에 대한 요청은 URL 서명이 필요합니다. client 매개변수를 포함하였지만 signature 매개변수가 누락되었거나 그 반대의 경우, HTTP 403(Forbidden) 오류가 나타나면서 요청이 거절됩니다.

해결 방법

위와 같은 문제는 두 가지 방식을 함께 사용하여 해결할 수 있습니다.

  1. 애플리케이션이 웹 서비스를 더욱 효율적으로 사용하도록 최적화하여 사용량을 낮춥니다.
  2. Google Maps APIs for Work 라이선스에 대해 추가 한도를 구매하여 가능하면 사용 제한을 높입니다.

이 문서는 웹 서비스를 더욱 효율적으로 사용하도록 애플리케이션을 최적화하는 방법에 초점을 맞춥니다.

온전성 검사

웹 서비스를 더욱 효율적으로 사용하는 방법을 설명하기 전에 잠시 적절한 서비스와 라이선스를 사용하고 있는지 확인해보겠습니다.

사용 사례 검증

Google Maps APIs 웹 서비스는 최종 사용자의 실시간 입력이 없거나 웹 브라우저를 사용할 수 없는 애플리케이션에 사용하는 것이 가장 좋습니다. 일반적으로 사용자 입력과 관계없는 데이터세트를 얻는 경우에 해당합니다. 예를 들어, 부동산 웹사이트에서 매매로 나온 부동산이나 매장 위치 집합처럼 지오코딩이 필요한 고정된 주소 집합이 포함된 데이터베이스가 있는 경우입니다.

Google Maps APIs 웹 서비스를 사용할 때는 모든 요청이 클라이언트 ID의 (일일 및 초당) 할당량에 대해 카운트됩니다. 이 할당량은 요청을 전송하는 IP 주소 개수와 관계없이 각 클라이언트 ID에 대해 전체적으로 적용됩니다.

브라우저에서 클라이언트측 Maps JavaScript API 서비스를 사용할 때는 지도 세션당 속도 제한이 적용됩니다. 요청이 모든 사용자 전체에 분배되고 사용자 수가 증가하면서 함께 증가합니다. 따라서 가능하면 언제나 클라이언트측 API를 우선적으로 사용합니다. 사용자 자택 주소 주변의 매장을 검색하는 등과 같이 실시간으로 지오코딩이 필요한 사용자에게서 주소를 수집할 경우 가장 적합합니다.

이 주제에 대한 자세한 내용은 지오코딩 전략 문서를 참조하세요. 지오코딩을 예로 들었지만, 이 문서에서 서버측 웹 서비스를 사용해야 하는 경우와 클라이언트측 웹 서비스를 사용해야 하는 경우를 설명하는 권장 사항은 모든 웹 서비스에 적용됩니다.

Google Maps APIs for Work 라이선스 사용

Google Maps APIs for Work 라이선스가 있다면 요청에 클라이언트 ID를 정확히 포함해야 합니다.

Google Maps APIs for Work 고객은 무료 API 사용자보다 Google Maps APIs 웹 서비스 사용 제한이 더 높습니다. 이를 활용하기 위해 애플리케이션에서 이 가이드의 웹 서비스 장에서 설명한 바와 같이 client 매개변수를 정확히 설정해야 합니다.

Google Maps APIs for Work 클라이언트 ID를 올바르게 사용하지 못한 애플리케이션은 사업체로 간주되지 않고, 비즈니스 전용 기능과 한도를 사용할 수 없습니다. Google Maps APIs for Work SLA에서 보증을 받을 수 없기 때문에 기술 지원을 받지 못하고 일반 Google Maps APIs 서비스 라이선스 제한 약관의 적용을 받습니다.

최적화 방법

웹 서비스를 더욱 효율적으로 사용하는 방법은 크게 두 가지로 요약할 수 있습니다. 정말 필요할 때만 요청을 전송하여 사용량을 낮추고 제한을 초과하지 않도록 사용량을 균등하게 분배합니다.

결과 캐싱

Google Maps APIs 서비스 약관의 섹션 10.5.d에서는 (Google이 사용량을 정확히 추적하지 못하도록 막기 위한 것이 아니라) 네트워크 지연으로 인한 Google Maps APIs 구현의 성능을 개선하기 위한 목적로만 콘텐츠를 제한적으로 저장할 수 있으며, 이러한 저장은 일시적이고(어떤 경우에도 30일을 초과하지 않아야 함), 안전하고, 콘텐츠나 서비스의 어떤 부분도 조작하거나 집계해서는 안 되며, 어떤 방식으로든 출처를 수정해서는 안 된다라고 규정하고 있습니다.

단기적으로 중복 요청을 전송하지 못하게 할 경우에는 일시적으로 웹 서비스 응답을 캐시할 수 있다는 뜻입니다. 웹 서비스의 응답에는 언제나 결과를 캐시할 수 있는 시간을 나타내는 Cache-Control HTTP 헤더가 포함되어 있습니다. 현재는 24시간입니다.

Cache-Control: public, max-age=86400

이 헤더는 항상 준수해야 합니다. 캐싱은 웹 프록시를 사용하여 구현할 수 있으며, 규격을 벗어나거나 자체 구현을 사용하여 수행해서는 안 됩니다. 일부 HTTP 클라이언트 라이브러리도 HTTP 응답을 캐시한다는 것을 알아두면 좋습니다.

캐시 적중률을 높이기 위해 LatLng 좌표는 6자리로 반올림하여 정규화해야 합니다. 이렇게 하면 적도 주변으로 약 11cm까지 정확도를 제공합니다. 웹 서비스의 결과는 더 많은 자리를 추가하더라도 달라지지 않지만 캐시 적중률은 감소합니다.

요청 차단

애플리케이션은 사용 제한을 초과하지 않도록 요청을 차단해야 합니다. 요청을 전송하는 IP 주소와 관계없이 각 클라이언트 ID에 적용해야 합니다.

요청을 전송할 때 추적하는 큐에 넣어서 요청을 조절할 수 있습니다. 속도 제한이 10 QPS(초당 쿼리)일 경우 애플리케이션은 11번째 요청을 전송할 때 첫 번째 요청의 타임스탬프를 확인하고 1초가 지날 때까지 기다려야 합니다. 일일 제한에도 같은 방법을 적용합니다.

차단을 올바르게 구현했더라도 애플리케이션은 상태 코드 OVER_QUERY_LIMIT가 포함된 응답에 유의해야 합니다. 이러한 응답을 받을 경우, 위의 사용 제한 초과 섹션에서 설명한 정지 후 재시도 메커니즘을 사용하여 어느 제한이 초과되었는지 확인하십시오.

백로그 처리

차단 기능을 올바르게 구현하면, 웹 서비스에 대한 요청이 사용 제한을 초과하여 전송되지 않습니다. 그러나 애플리케이션이 웹 서비스 사용 제한에서 허용하는 것보다 더 많은 양 또는 더욱 빠른 속도로 입력을 받을 수 있습니다. 따라서 차단 큐가 크게 증가하여 대기 중인 요청의 백로그가 생성될 수 있습니다.

애플리케이션이 대량의 백로그를 처리하는 도중 일일 사용 제한에 도달할 수도 있습니다. 일일 제한에 대해 차단 기능이 올바르게 구현되었다면 애플리케이션이 요청 전송을 중단할 것입니다. 그렇지 않을 경우 추가 요청을 보내면 상태 코드 OVER_QUERY_LIMIT가 포함된 응답을 받습니다. 두 경우 모두 백로그가 감소하지 않습니다.

하루 또는 주중의 평균 요청 수가 사용 제한 이하라면 입력 흐름이 낮을 때 애플리케이션이 백로그를 처리할 수 있어야 합니다. 그렇지 않다면 Google Maps APIs for Work 라이선스의 일일 한도를 높여야 할 수도 있습니다(다음 섹션 참조).

최적화로 부족할 경우

위의 최적화 방법을 모두 구현하였는데 매일 또는 하루 중 모든 시간에 요청의 백로그가 꾸준히 증가할 경우, Google Maps APIs for Work 라이선스의 일일 또는 초당 사용 제한을 높여야 할 수도 있습니다. 이 경우, Google Maps APIs for Work 계정 관리자에게 문의하여 이용 가능한 옵션을 상의하세요.