구글 API가 작동하지 않았던 이유

2024년 9월 2일 월요일

Today I Learned

날짜

2024년 9월 2일 월요일

내용

이번엔 구글 차례..

진짜 다 되었나 싶어 열심히 테스트를 돌리던 와중 또 하나의 문제를 발견해버렸다. 멀쩡한 스프레드시트를 정기 업데이트할 때 만 못찾는다…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
def search_spreadsheet_by_spreadsheet_id(self, spreadsheet_id: str, max_retry=5):
        """스프레드시트 ID로 스프레드시트를 검색합니다."""
        creds = self.make_google_credentials()
        service = build("drive", "v3", credentials=creds)
        for _ in range(max_retry):
            try:
                result = (
                    service.files()
                    .list(
                        fields="nextPageToken, files(id, name)",
                        q="mimeType='application/vnd.google-apps.spreadsheet' and trashed=false",
                    )
                    .execute()
                )
                arr = result["files"]
                for file in arr:
                    if file["id"] == spreadsheet_id:
                        break
                else:
                    return {"result": False, "detail": "스프레드시트 검색 실패"}
                return {"result": True, "detail": file}
            except Exception as e:
                logging.warning("failed to search_spreadsheet_by_spreadsheet_id: %s", e)
                time.sleep(1)
        return {
            "result": False,
            "detail": "재시도 5회 초과했으나 스프레드시트 검색 실패",
        }

이렇게 해놨는데, spreadsheet가 없다며 404를 뱉는다. 분명 있다. 직접 들어가봐도 있고, ID도 멀쩡하며, 내가 저 함수를 따로 빼서 실행해봐도 잘만 나온다. 근데 유독 정기 업데이트할 때만 없다고 뜬다. 도대체 이게 뭔 일인가…

혹시 오전 7시 30분에 일괄적으로 업데이트하면서 요청이 몰려 실패하나 라는 생각이 들었다. 물론 고작 수십개의 요청가지고 뱉어낼 거라 생각하진 않지만.. 그럴 수 있다고 생각해 5번이나 재시도 하도록 처리해놨다. 근데도 안된다. 하… 진짜 너까지 왜그러냐 ..

라고 써놓고 야근하다가 원인을 찾았다 깔깔 기존에는 어떤 업데이트의 진행이 완료되고 다음 수행할 작업을 대기열에서 찾을때, 같은 광고계정 내의 것만 찾았었다. 따라서 같은 서비스아이디를 사용해도 무방하다. 이 서비스아이디라 함은 아임리포트에서 유저를 구분하는 고유 값이다. 즉 서비스 아이디가 다르다는 것은 다른 유저를 의미하므로, 구글 access_token도 다르다.

다시 본론으로 돌아가면, 이제 업데이트 할 떄 대기열에서 탐색하는 작업이 달라졌다. 다른 광고계정에 있어도 무방하고 같은 네이버 API 키를 사용하는 유저라면 모두 같은 대기열을 공유한다. 즉 대기열에는 전혀 다른 유저의 작업들이 공존할 수 있다는 의미이다. 대기열에 있는 작업을 찾아 호출할 때, 서비스 아이디도 변수로 제공하는데 이 값을 업데이트 하지 않았다. 그 작업이 속해있는 유저의 서비스 아이디를 넣어줘야 했는데 그대로 가지고 있던 서비스 아이디가 들어가고 있었다. 내 구글 드라이브에 있는 스프레드 시트를 탐색하기 위해 전혀 다른 유저의 구글 액세스토큰을 사용하고 있었다는 의미가 된다. 권한이 없으니 당연히 찾을 수 없다!

회고

세 가지 서비스에서 고루고루 할일이 쏟아진다 얏호! 하나씩 차근차근.