diff --git a/troubleshooting/250826_slack_id_column_standardization.md b/troubleshooting/250826_slack_id_column_standardization.md index b91c9b5..c4edd69 100644 --- a/troubleshooting/250826_slack_id_column_standardization.md +++ b/troubleshooting/250826_slack_id_column_standardization.md @@ -1,244 +1,67 @@ -# Slack ID 컬럼명 표준화 작업 +# ID 체계 표준화 및 사용자 설정 시스템 -## 작성일: 2025-08-26 21:30 -## 작성자: 51123 서버 관리자 -## 상태: 🔴 작업 필요 -## 영향: 데이터 일관성, JOIN 쿼리 성능, 코드 유지보수성 -## 관련: 250826_id_체계_정리_및_conversation_logs_문제_해결.md에서 분리 +## 작성일: 2025-08-26 22:00 +## 작성자: 51124 서버 담당 +## 상태: 작업 필요 +## 영향: ID 일관성, 사용자 맞춤화 --- -## 1. 문제 정의 +## 1. Slack ID 컬럼명 불일치 -### 1.1 핵심 문제 -동일한 Slack 사용자 ID가 테이블마다 다른 컬럼명으로 저장되어 있음 +### 현재 상태 +| 테이블 | 컬럼명 | 타입 | +|--------|--------|------| +| slack_user_mapping | slack_user_id | VARCHAR(100) | +| gmail_tokens | **slack_id** ❌ | VARCHAR(100) | +| conversation_logs | slack_user_id | VARCHAR(100) | -### 1.2 현재 상태 -| 테이블 | 컬럼명 | 데이터 예시 | 타입 | -|--------|--------|------------|------| -| slack_user_mapping | **slack_user_id** | U091UNVE41M | VARCHAR(100) | -| gmail_tokens | **slack_id** ❌ | U091UNVE41M | VARCHAR(100) | -| conversation_logs | **slack_user_id** | U091UNVE41M | VARCHAR(100) | - ---- - -## 2. 시스템 영향도 - -### 2.1 데이터 흐름도 -``` -[Slack 사용자: U091UNVE41M] - │ - ├─→ slack_user_mapping.slack_user_id ✅ - │ ↓ (JOIN 시 컬럼명 불일치) - ├─→ gmail_tokens.slack_id ❌ - │ ↓ (JOIN 시 컬럼명 불일치) - └─→ conversation_logs.slack_user_id ✅ -``` - -### 2.2 JOIN 복잡도 증가 +### 해결 방안 ```sql --- 현재: 컬럼명이 달라서 복잡 -SELECT * FROM gmail_tokens g -JOIN slack_user_mapping s ON g.slack_id = s.slack_user_id -JOIN conversation_logs c ON s.slack_user_id = c.slack_user_id - --- 목표: 모든 테이블 동일 컬럼명 -SELECT * FROM gmail_tokens g -JOIN slack_user_mapping s USING (slack_user_id) -JOIN conversation_logs c USING (slack_user_id) -``` - ---- - -## 3. 해결 방안 - -### 3.1 작업 순서 - -#### Phase 1: DB 스키마 변경 (51123 서버) -```sql --- 1. 컬럼 추가 +-- gmail_tokens 컬럼명 변경 ALTER TABLE gmail_tokens ADD COLUMN slack_user_id VARCHAR(100); - --- 2. 데이터 복사 UPDATE gmail_tokens SET slack_user_id = slack_id; - --- 3. 제약조건 이동 ALTER TABLE gmail_tokens DROP COLUMN slack_id; - --- 4. 인덱스 재생성 -CREATE INDEX idx_gmail_tokens_slack_user_id ON gmail_tokens(slack_user_id); ``` -#### Phase 2: 코드 수정 (로컬 개발자) -| 파일 | 수정 내용 | -|------|----------| -| auth-server/models.py | slack_id → slack_user_id | -| robeing-monitor/database.py | slack_id → slack_user_id | -| skill-email/db_client.py | slack_id → slack_user_id | - -#### Phase 3: 배치 매핑 (선택사항) -Slack ID를 가진 사용자를 UUID와 매핑하여 통합 관리 - --- -## 4. 현재 데이터 현황 +## 2. 뉴스 키워드 하드코딩 문제 + +### 현재 상태 +- rb8001이 `["AI", "기술", "IT"]`만 사용 (dm_skill.py:309) +- 매일 같은 뉴스 반복 + +### 해결 방안: user_preferences 테이블 -### 4.1 영향받는 레코드 수 ```sql --- gmail_tokens 테이블 -SELECT COUNT(*) FROM gmail_tokens WHERE slack_id IS NOT NULL; --- 결과: 3건 (U091UNVE41M, U0925SXQFDK, U092F7FQ55L) - --- slack_user_mapping 테이블 -SELECT COUNT(*) FROM slack_user_mapping; --- 결과: 3건 (동일 사용자) -``` - -### 4.2 서비스별 영향 -| 서비스 | 영향도 | 수정 필요 | -|--------|--------|----------| -| auth-server | 높음 | Gmail 토큰 조회 로직 | -| robeing-monitor | 중간 | 토큰 관리 UI | -| skill-email | 높음 | 토큰 검증 로직 | -| rb8001 | 낮음 | 이미 slack_user_id 사용 | - ---- - -## 5. 위험 요소 및 대응 - -### 5.1 위험 요소 -- **서비스 중단**: 컬럼명 변경 중 API 오류 가능 -- **데이터 손실**: ALTER TABLE 실행 중 실수 -- **캐시 문제**: 기존 ORM 캐시가 old 컬럼명 참조 - -### 5.2 대응 방안 -1. **백업 우선**: `pg_dump main_db > backup_20250826.sql` -2. **점진적 마이그레이션**: 새 컬럼 추가 → 이중 운영 → 구 컬럼 제거 -3. **캐시 초기화**: Docker 재시작으로 ORM 캐시 클리어 - ---- - -## 6. 검증 계획 - -### 6.1 변경 전 테스트 -```sql --- 데이터 무결성 확인 -SELECT COUNT(*) FROM gmail_tokens -WHERE slack_id IS NOT NULL AND slack_user_id IS NULL; -``` - -### 6.2 변경 후 검증 -- Gmail 토큰 조회 API 테스트 -- Slack 사용자 매핑 확인 -- JOIN 쿼리 성능 비교 - ---- - -## 7. 예상 효과 - -### 7.1 개발 효율성 -- **Before**: 테이블마다 다른 컬럼명 기억 필요 -- **After**: 모든 곳에서 `slack_user_id` 통일 - -### 7.2 쿼리 성능 -- **Before**: 복잡한 ON 조건 -- **After**: USING 절로 간단한 JOIN - -### 7.3 유지보수성 -- 신규 개발자 학습 곡선 감소 -- 버그 발생 가능성 감소 -- 코드 일관성 향상 - ---- - -## 8. 작업 체크리스트 - -- [ ] PostgreSQL 백업 수행 -- [ ] gmail_tokens 테이블 스키마 변경 -- [ ] 로컬 개발자에게 코드 수정 지시 -- [ ] 테스트 환경에서 검증 -- [ ] 프로덕션 배포 -- [ ] 모니터링 및 롤백 준비 - ---- - -## 9. 관련 문서 -- 원본: `/home/admin/DOCS/troubleshooting/250826_id_체계_정리_및_conversation_logs_문제_해결.md` -- 이 문서는 Slack ID 컬럼명 표준화 부분만 분리하여 작성됨 - ---- - -## 10. 뉴스 스킬 키워드 문제 분석 - -### 10.1 발견된 문제 -**매일 같은 AI 뉴스만 반복되는 현상** - -#### 원인 -- rb8001의 dm_skill.py:309에 `["AI", "기술", "IT"]` 하드코딩 -- 환경변수 NEWS_KEYWORDS 미사용 -- 중복 방지로 인해 같은 뉴스 반복 표시 - -### 10.2 해결 방안: 사용자별 키워드 설정 - -#### DB 스키마 -```sql --- 사용자 선호도 테이블 (프론트엔드 설정 UI와 연동) CREATE TABLE user_preferences ( id SERIAL PRIMARY KEY, user_id UUID REFERENCES users(id), slack_user_id VARCHAR(100), - news_keywords TEXT[], -- 뉴스 관심 키워드 - email_filter TEXT[], -- 이메일 필터 키워드 + news_keywords TEXT[], -- 뉴스 키워드 + email_filter TEXT[], -- 이메일 필터 briefing_enabled BOOLEAN DEFAULT true, briefing_time TIME DEFAULT '09:00', - created_at TIMESTAMP DEFAULT NOW(), updated_at TIMESTAMP DEFAULT NOW() ); ``` -#### rb8001 수정 필요 코드 ```python -# dm_skill.py 수정 +# rb8001/dm_skill.py 수정 async def get_user_keywords(slack_user_id: str) -> List[str]: - """사용자 설정에서 키워드 조회""" db = SessionLocal() result = db.execute( text("SELECT news_keywords FROM user_preferences WHERE slack_user_id = :sid"), {"sid": slack_user_id} ).fetchone() - - if result and result[0]: - return result[0] - return ["AI", "기술", "IT"] # 기본값 + return result[0] if result else ["AI", "기술", "IT"] ``` -### 10.3 프론트엔드 연동 - -#### 기존 UI 활용 (250825 문서 참조) -- **위치**: frontend-customer의 ActivityPanel 설정 섹션 -- **기능**: 관심 키워드 입력/수정 -- **저장**: user_preferences 테이블로 직접 저장 - -#### API 엔드포인트 -```python -# Gateway 또는 auth-server에 추가 -@router.post("/api/users/preferences") -async def update_preferences( - keywords: List[str], - user_id: str = Depends(get_current_user) -): - # user_preferences 업데이트 - pass - -@router.get("/api/users/preferences") -async def get_preferences( - user_id: str = Depends(get_current_user) -): - # user_preferences 조회 - pass -``` +### 프론트엔드 연동 +- ActivityPanel 설정 UI 활용 (250825 문서 참조) +- Gateway API로 user_preferences CRUD 구현 --- -*작성 완료: 2025-08-26 21:30* -*뉴스 스킬 분석 추가: 2025-08-26 21:45* \ No newline at end of file +*작성: 2025-08-26 22:00* \ No newline at end of file