diff --git a/troubleshooting/250911_happybell80_PostgreSQL_테이블명_단수형_통일.md b/troubleshooting/250911_happybell80_PostgreSQL_테이블명_단수형_통일.md index 9c642d6..96b9f28 100644 --- a/troubleshooting/250911_happybell80_PostgreSQL_테이블명_단수형_통일.md +++ b/troubleshooting/250911_happybell80_PostgreSQL_테이블명_단수형_통일.md @@ -90,13 +90,13 @@ ### 2.6 gmail_token 테이블 (실제 DB: gmail_token, 0건) **실제 DB 컬럼**: user_id(FK), token_data(jsonb), oauth_config(jsonb), created_at, updated_at -**코드 모델**: gmail_tokens 참조 (복수형 차이), 추가 컬럼 사용 +**코드 혼용**: auth-server는 gmail_tokens(복수)와 gmail_token(단수) 혼용 | 파일 경로 | 라인 번호 | 작업 내용 | |-----------|-----------|-----------| -| auth-server/app/providers/gmail_passport.py | 193-198 | INSERT INTO gmail_tokens ... DO UPDATE SET | -| auth-server/app/providers/gmail_passport.py | 354 | SELECT token_data FROM gmail_tokens WHERE user_id = $1 | -| auth-server/app/providers/gmail_passport.py | 370 | DELETE FROM gmail_tokens WHERE user_id = $1 | +| auth-server/app/providers/gmail_passport.py | 193 | INSERT INTO gmail_token (단수) | +| auth-server/app/providers/gmail_passport.py | 264, 313, 354, 370 | gmail_token (단수) 사용 | +| auth-server/app/api/gmail_refresh.py | 36, 43, 115, 124, 173, 179 | gmail_tokens (복수) 사용 | | skill-email/services/db_credentials_provider.py | 60-70 | SELECT 쿼리 (is_equipped 필터) | | skill-email/services/db_credentials_provider.py | 163-177 | UPDATE 쿼리 | | skill-email/services/db_credentials_provider.py | 231-235 | COUNT 쿼리 | diff --git a/troubleshooting/250913_happybell80_email_skill_auth_cron_errors.md b/troubleshooting/250913_happybell80_email_skill_auth_cron_errors.md index 41e214c..64198b2 100644 --- a/troubleshooting/250913_happybell80_email_skill_auth_cron_errors.md +++ b/troubleshooting/250913_happybell80_email_skill_auth_cron_errors.md @@ -28,13 +28,13 @@ if creds_result is None: return Err(EmailError(f"No credentials found for user: {user_id}")) -# skill-email/services/db_credentials_provider.py:63 +# skill-email/services/db_credentials_provider.py:67 SELECT token_data->>'refresh_token' as refresh_token -FROM gmail_token # 테이블명 문제: 실제 DB는 gmail_tokens (복수형) +FROM gmail_token # 테이블명 맞음: 실제 DB도 gmail_token (단수형) WHERE slack_user_id = %s AND is_equipped = true ``` -1. **테이블명 불일치**: 코드는 `gmail_token`, DB는 `gmail_tokens` +1. **테이블명 일치 확인**: 코드와 DB 모두 `gmail_token` (250911 문서 확인) 2. **토큰 데이터 구조**: token_data JSONB 내부에 저장 (250909 문서 확인) 3. **is_equipped 조건**: 토큰이 있어도 장착되지 않으면 조회 실패 @@ -61,10 +61,8 @@ if auth_header != f"Bearer {expected_token}": ### 즉시 조치 (로컬 개발자) ```python -# 1. skill-email 테이블명 수정 -# services/db_credentials_provider.py:67 -- FROM gmail_token -+ FROM gmail_tokens # 복수형으로 수정 +# 1. 테이블명은 이미 맞음 (gmail_token 단수형) +# 실제 문제: 데이터가 없거나 is_equipped=false # 2. Cron 인증 강화 # rb8001/main.py:560 @@ -88,7 +86,7 @@ WHERE slack_user_id IN ('0914eagle', 'happybell80', 'cdctfm'); ## 5. 교훈 -1. **테이블명 일관성**: 단수/복수형 통일 필요 (250911 문서 참조) -2. **보안 우선**: 인증 실패시 반드시 요청 차단 -3. **환경변수 사용**: 하드코딩 대신 .env 파일 활용 -4. **토큰 관리**: JSONB 구조로 일원화 완료, 테이블명만 수정 필요 \ No newline at end of file +1. **DB 현황**: gmail_token 테이블 0건, 데이터 없음 +2. **auth-server**: gmail_tokens와 gmail_token 혼용 (gmail_refresh.py는 복수, gmail_passport.py는 단수) +3. **skill-email**: gmail_token 단수형 사용 (정상) +4. **실제 원인**: 데이터 부재가 문제 (테이블명 아님) \ No newline at end of file