제가 프로젝트에서 맡은 작업은 변경된 일정을 알려주는 기능입니다.
그것을 처음이라서 폴링으로 구현하였는데, 계속 일정이 변경되었는지를 체크해야하니까 서버에도 부담이 되었고, 비효율적이라고 느꼈습니다.
그래서 구글에 검색을 해보니, Microsoft Grap Webhooks 가 있었습니다.
이는 변경 감지를 원하는 리소스에 구독을 해놓고, 리소스에 변경이 감지되면 알림을 보내주는 기능입니다.
그런데 조사를 하다보니, Webhook을 사용하려면 알림을 받을 서버 URL이 존재해야 하더군요.
지금 현재 프로젝트는 로컬 호스트에서 진행되고 있기 때문에 따로 알림을 받을 수 가 없습니다.
클라우드에 서버가 올라가면 그 때 쓸 수 있겠네요.
일단 작성했었던 코드는 올려놓겠습니다. 이것도 하나의 시행착오이니까요.
import requests
import app_config
import cache
token = cache._get_token_from_cache(app_config.SCOPE)
url = "https://graph.microsoft.com/v1.0/subscriptions"
headers = {
"Content-Type": "application/json",
"Authorization": "Bearer " + token['access_token']
}
data = {
"changeType": "created,updated",
"notificationUrl": "https://your-webhook-url.com/notifications",
"resource": "me/events",
"expirationDateTime": "2023-01-01T11:23:00.000Z",
"clientState": "secretClientValue"
}
response = requests.post(url, headers=headers, json=data)
createdDateTime과 lastModifiedDateTime을 비교해서 일정 변동 사항을 감지하였더니 시간 기준이라 애로사항이 있었다.
너무 시간을 길게 잡으면 그 안에 사용자가 수정했는데도 불구하고 처음 생긴 일정이라고 판단할 수 있습니다.
너무 시간을 짧게 잡으면 때로는 서버와 클라이언트 시간 차이로 가끔 둘의 차이가 생겨서 변동된 일정으로 감지합니다.
이런 버그도 있었습니다.
아래는 처음 만든 일정인데도 불구하고 생성날짜와 수정날짜가 16초 차이가 나더군요.

그래서 Microsoft graph api에서는 json 파일에 보면 changeKey라는 것이 존재 한다.

이것은 만약에 변동 사항이 있다면 changeKey가 바뀌게 된다.
그래서 이전 changeKey와 비교하여 실제로 이 일정이 변동되었는지를 알 수 있는 것이다.
이것이 가장 판단 기준이 명확한 것 같다.
다만, api 호출로만은 힘들고 처음 일정이 만들어졌을 때의 changeKey를 어딘가에 보관을 해야한다.