# Gmail Token 조회 실패 - slack_user_id 컬럼 없음

## 현재 문제 (2025-09-18)
- **증상**: Gmail 토큰 갱신 실패 → HTTP 500 에러
- **영향**: 3개 계정 (0914eagle@gmail.com, goeun2dc@gmail.com, cdctfm@gmail.com)
- **원인**: 코드가 존재하지 않는 `slack_user_id` 컬럼 사용

## 실제 상태

### 코드 문제
```python
# 현재 코드 (잘못됨)
cur.execute("""
    SELECT ... FROM gmail_token
    WHERE slack_user_id = %s  # 존재하지 않는 컬럼
""", (user_id,))

# 올바른 방법
cur.execute("""
    SELECT gt.* FROM gmail_token gt
    JOIN user u ON gt.user_id = u.id
    WHERE u.oauth_id = %s AND gt.is_equipped = true
""", (slack_id,))
```

### DB 스키마 (실제)
```sql
CREATE TABLE gmail_token (
    id UUID PRIMARY KEY,
    user_id UUID NOT NULL,  -- user 테이블 FK
    token_data JSONB,  -- access_token, refresh_token 포함
    equipped_to VARCHAR(50),  -- Gmail 계정
    is_equipped BOOLEAN DEFAULT false
);
-- user.oauth_id에 Slack ID 저장됨
```

## 토큰 자동 갱신 (정상 작동)
```python
if creds and creds.expired and creds.refresh_token:
    creds.refresh(Request())
    self.creds_provider.save_credentials(user_id, creds)
```

## 트러블슈팅

### 토큰 조회 실패
- `slack_user_id` 컬럼 없음 → JOIN 사용 필요
- `is_equipped = true` 확인

### 자동 갱신 실패
- `refresh_token` 존재 여부
- Google OAuth 설정 확인

## 해결 방법

### 수정 필요 파일
`/home/admin/ivada_project/skill_email/services/db_credentials_provider.py`
- 68번 줄: get_credentials()
- 170번 줄: save_credentials()
- 234번 줄: has_equipped_token()

### 수정 내용
```python
# 기존 (잘못됨)
WHERE slack_user_id = %s

# 수정 (JOIN 사용)
FROM gmail_token gt
JOIN user u ON gt.user_id = u.id
WHERE u.oauth_id = %s
```

## 관련 문서
- [250831_skill-email_UUID_inconsistency_URGENT.md](./250831_happybell80_skill-email_UUID_inconsistency_URGENT.md)