구글 지도 Places opening_hours.open_now 대신 isOpen() 함수 쓰기

구글 지도 API에서 장소정보중에 open_now라고 해당 스팟이 영업중인지 확인하는 데이터가 있었는데 디프리케이티드 되어 2020년 11월부터는 중단된다는 메시지가 콘솔에 나타났다.

js?key=APIKEY&libraries=places&callback=UIPrototypeMap:57 open_now is deprecated as of November 2019 and will be turned off in November 2020. Use the isOpen() function from a PlacesService.getDetails() result instead. See https://goo.gle/js-open-now

쓰는 방식이 좀 달라서 시간 작업 소요가 좀 있던터라 기록을 남겨둔다.

PlaceResult가 받아온 오브젝트라면 PlaceResult.opening_hours.open_now만으로도 Boolean 타입으로 값을 받아올 수 있어서 영업중인지 아닌지 영업정보가 없는지를 바로 판별할 수가 있었는데 콘솔창에 안내되어 있는 것만 얼핏보고 PlaceResult.opening_hours.isOpen()과 같이 해서는 모두 undefined 값만 받아보게 된다.

new google.maps.places.PlacesService(attrContainer).getDetails({
  placeId: '...',
  fields: ['opening_hours','utc_offset_minutes'],
  }, function (place, status) {
    if (status !== 'OK') return; // something went wrong
    const isOpenAtTime = place.opening_hours.isOpen(new Date('December 17, 2020 03:24:00'));
    if (isOpenAtTime) {
        // We know it's open.
    }

    const isOpenNow = place.opening_hours.isOpen();
    if (isOpenNow) {
        // We know it's open.
    }
});

출처 : https://developers.google.com/maps/documentation/javascript/place_field_js_migration

위 예제가 더 정확한데 저렇게 별도로 영업시간 체크를 해줘야한다. 게다가 비동기로 결과를 받기 때문에 체크하는 방식을 변경해줄 수 밖에 없었다.

// service는 다른 곳에서 new google.maps.places.PlacesService(attrContainer) 선언함
function placeIsOpen(id) {
  if (!service) {
    return undefined;
  }

  service.getDetails({
    placeId: id,
    fields: ['opening_hours', 'utc_offset_minutes']
  }, function(place, status) {
    if (status !== 'OK') {
      return undefined;
    }

    return place.opening_hours.isOpen();
  });

  return undefined;
}

같이 만들어놓고 바로바로 open_now 쓰던 것처럼 넣었더니 한번에 넣는 값이 8개가 넘으면 OVER QUERY LIMIT 오류를 뱉고, 어차피 비동기로 처리되기 때문에 제 시점에 영업 여부를 넣을 수가 없었다.

그래서 ① 담아 놓고 넣거나, ②. 8개 이하로 끊어서 넣거나, ③ 필요할 시점에 넣어야 했는데 다행히 스팟 정보는 스와이퍼 형태로 제공하는 화면이어서 활성화된 스팟 지점인 경우에만 영업 여부 체크하여 넣는 것으로 변경했다.