DOCS/journey/troubleshooting/250828_gmail_token_auto_refresh_RESOLVED.md
Claude-51124 22557e7132 docs: 오래된 트러블슈팅 아카이브 및 구조 정리
- 7-8월 초기 구축 문서 12개를 _archive/troubleshooting/2025_07-08_initial_setup/로 이동
- book/300_architecture/390_human_in_the_loop_intent_learning.md를 journey/research/intent_classification/로 이동 (개발 여정 문서)
- 빈 폴더 제거 (journey/assets/*)
2025-11-17 14:06:05 +09:00

2.0 KiB

[RESOLVED] Gmail 토큰 자동갱신 미작동 문제 해결

작성일: 2025-08-28

작성자: Claude

상태: 해결 완료


1. 문제 상황

  • 매일 아침 9시 데일리 브리핑 시 Gmail 토큰 자동갱신이 작동하지 않음
  • U091UNVE41M, U092F7FQ55L 사용자들의 토큰이 만료되어도 갱신 안 됨
  • 결과: 이메일 없는 브리핑만 전송됨

2. 원인 분석

2.1 skill-email 자동갱신 구현 상태

  • 구현 완료: services/gmail_service.py:95-108에 자동갱신 로직 존재
  • 토큰 만료 시 creds.refresh(Request()) 호출
  • 401 에러 시 재시도 로직도 구현됨 (176-192줄)

2.2 실제 문제점

# rb8001/app/skills/dm_skill.py:143-160
async def get_primary_emails(self, slack_id: str, limit: int = 5):
    try:
        response = await client.get("http://localhost:8501/messages", ...)
        if response.status_code == 200:
            return data.get('emails', [])
    except Exception as e:
        logger.error(f"Error: {e}")
    return []  # 에러 무시하고 빈 리스트 반환

핵심 문제: rb8001이 200 OK가 아니면 모든 에러를 무시

3. 동작 흐름

  1. 매일 9시 크론 작업 → rb8001의 send_daily_summary_dm() 실행
  2. rb8001이 skill-email의 /messages API 호출
  3. skill-email이 토큰 만료 감지 → 갱신 시도
  4. 갱신 중 시간 소요 or 에러 → 500 응답
  5. rb8001이 500 에러 무시 → 빈 이메일 리스트로 브리핑 전송

4. 해결 방안

  • rb8001의 get_primary_emails()에 재시도 로직 추가 완료
  • 500 에러 시 3초 대기 후 재시도 (최대 2회)
  • 타임아웃 시간 증가 (10초 → 20초)
  • get_latest_email()에도 동일한 로직 적용
  • 2025-08-28 02:32 배포 완료 (commit: 18daa55)

5. 교훈

  • API 클라이언트는 에러를 무시하지 말고 적절히 처리해야 함
  • 특히 인증 관련 작업은 재시도 로직이 필수
  • 자동갱신이 구현되어 있어도 클라이언트가 협조해야 작동함