diff --git a/troubleshooting/250828_gmail_token_auto_refresh_RESOLVED.md b/troubleshooting/250828_gmail_token_auto_refresh_RESOLVED.md new file mode 100644 index 0000000..a19e4ea --- /dev/null +++ b/troubleshooting/250828_gmail_token_auto_refresh_RESOLVED.md @@ -0,0 +1,53 @@ +# [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 실제 문제점 +```python +# 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 클라이언트는 에러를 무시하지 말고 적절히 처리해야 함 +- 특히 인증 관련 작업은 재시도 로직이 필수 +- 자동갱신이 구현되어 있어도 클라이언트가 협조해야 작동함 \ No newline at end of file