diff --git a/troubleshooting/250826_happybell80_사용자별설정_구현.md b/troubleshooting/250826_happybell80_사용자별설정_구현.md new file mode 100644 index 0000000..2085dbd --- /dev/null +++ b/troubleshooting/250826_happybell80_사용자별설정_구현.md @@ -0,0 +1,222 @@ +# 사용자별 설정 시스템 구현 (뉴스 키워드, Slack ID 통일) + +## 작성일: 2025-08-26 +## 작성자: happybell80 +## 상태: ✅ 완료 +## 영향: 사용자별 맞춤 뉴스 제공, DB 컬럼명 일관성 +## 최종 업데이트: 2025-08-26 21:00 + +--- + +## 1. 문제 상황 + +### 1.1 Slack ID 컬럼명 불일치 +- **문제**: 테이블마다 다른 컬럼명 사용 (slack_id vs slack_user_id) +- **영향**: 코드 복잡도 증가, 유지보수 어려움 +- **발견**: gmail_tokens만 `slack_id` 사용, 나머지는 `slack_user_id` + +### 1.2 뉴스 키워드 하드코딩 +- **문제**: rb8001이 ["AI", "기술", "IT"]만 사용 (dm_skill.py:309) +- **영향**: 모든 사용자에게 동일한 뉴스 제공 +- **요구**: 사용자별 맞춤 키워드 설정 필요 + +--- + +## 2. 현황 분석 + +### 2.1 Slack ID 컬럼 현황 +| 테이블 | 컬럼명 | 타입 | 상태 | +|--------|--------|------|------| +| slack_user_mapping | slack_user_id | VARCHAR(100) | ✅ 정상 | +| gmail_tokens | slack_id | VARCHAR(100) | ❌ 불일치 | +| conversation_logs | slack_user_id | VARCHAR(100) | ✅ 정상 | +| user_preferences | slack_user_id | VARCHAR(100) | ✅ 신규 추가 | + +### 2.2 뉴스 키워드 사용 현황 +- **기존**: 하드코딩된 키워드 ["AI", "기술", "IT"] +- **문제**: 사용자 관심사 반영 불가 +- **해결**: user_preferences 테이블 활용 + +--- + +## 3. 해결 방안 + +### 3.1 DB 스키마 수정 + +#### gmail_tokens 컬럼명 변경 (추후 작업) +```sql +-- 안전한 변경을 위한 단계적 접근 +ALTER TABLE gmail_tokens ADD COLUMN slack_user_id VARCHAR(100); +UPDATE gmail_tokens SET slack_user_id = slack_id; +-- 코드 수정 후 +ALTER TABLE gmail_tokens DROP COLUMN slack_id; +``` + +#### user_preferences 테이블 생성 +```sql +CREATE TABLE IF NOT EXISTS user_preferences ( + id SERIAL PRIMARY KEY, + user_id UUID REFERENCES users(id), + slack_user_id VARCHAR(100), + news_keywords TEXT[], -- PostgreSQL 배열 타입 + email_filter TEXT[], + briefing_enabled BOOLEAN DEFAULT true, + briefing_time TIME DEFAULT '09:00', + created_at TIMESTAMP DEFAULT NOW(), + updated_at TIMESTAMP DEFAULT NOW() +); + +-- 인덱스 추가 +CREATE INDEX idx_user_preferences_user_id ON user_preferences(user_id); +CREATE INDEX idx_user_preferences_slack_user_id ON user_preferences(slack_user_id); +``` + +### 3.2 코드 수정 + +#### ✅ 완료: rb8001/app/skills/dm_skill.py (커밋: 7103599) +```python +# 1. get_news_content() 메서드 수정 +async def get_news_content(self, user_id: str = None, slack_user_id: str = None) -> str: + """사용자별 키워드 사용""" + keywords = await self._get_user_news_keywords(user_id, slack_user_id) + # ... 키워드로 뉴스 검색 + +# 2. 새 메서드 추가 +async def _get_user_news_keywords(self, user_id: str = None, slack_user_id: str = None) -> list: + """user_preferences에서 키워드 조회""" + default_keywords = ["AI", "기술", "IT"] + + try: + # DB에서 사용자 설정 조회 + if result and result.news_keywords: + return result.news_keywords + except Exception: + pass + + return default_keywords + +# 3. send_daily_summary_dm() 수정 +# 사용자별로 다른 뉴스 제공 +news_content = await self.get_news_content(user_id=None, slack_user_id=user['slack_id']) +``` + +#### 추후 수정 필요 파일 (gmail_tokens 관련) +| 파일 경로 | 변경 내용 | 우선순위 | +|----------|----------|----------| +| 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 | 높음 | +| rb8001/app/skills/dm_skill.py | gmail_tokens 조회 시 컬럼명 | 높음 | + +--- + +## 4. 구현 결과 + +### 4.1 뉴스 키워드 사용자별 설정 ✅ +- **커밋 ID**: aed931e (기능 추가), 7103599 (프롬프트 수정) +- **배포**: Gitea Actions 자동 배포 완료 +- **테스트**: + - user_preferences 없는 사용자 → 기본값 사용 + - user_preferences 있는 사용자 → 설정된 키워드 사용 + +### 4.2 동작 흐름 +```mermaid +graph LR + A[사용자 DM 요청] --> B[slack_user_id 확인] + B --> C[user_preferences 조회] + C --> D{키워드 존재?} + D -->|Yes| E[사용자 키워드 사용] + D -->|No| F[기본 키워드 사용] + E --> G[뉴스 검색] + F --> G + G --> H[DM 전송] +``` + +--- + +## 5. 테스트 시나리오 + +### 5.1 사용자 설정 추가 예시 +```sql +-- happybell80 사용자 설정 +INSERT INTO user_preferences (slack_user_id, news_keywords) +VALUES ('U091UNVE41M', ARRAY['삼성', '반도체', '경제']); + +-- goeun2dc 사용자 설정 +INSERT INTO user_preferences (slack_user_id, news_keywords) +VALUES ('U0925SXQFDK', ARRAY['패션', '뷰티', '트렌드']); +``` + +### 5.2 검증 방법 +```python +# Python 테스트 코드 +keywords = await dm_skill._get_user_news_keywords(None, "U091UNVE41M") +assert keywords == ["삼성", "반도체", "경제"] + +keywords = await dm_skill._get_user_news_keywords(None, "UNKNOWN_USER") +assert keywords == ["AI", "기술", "IT"] # 기본값 +``` + +--- + +## 6. 향후 작업 + +### 6.1 단기 (1주일 내) +1. **gmail_tokens 컬럼명 변경** + - 모든 관련 코드 수정 후 일괄 변경 + - 다운타임 최소화 전략 수립 + +2. **관리자 UI 개발** + - user_preferences CRUD 기능 + - 사용자별 키워드 설정 화면 + +### 6.2 장기 (1개월 내) +1. **키워드 자동 추천** + - 사용자 대화 내용 분석 + - 관심사 자동 추출 및 추천 + +2. **브리핑 시간 개인화** + - briefing_time 필드 활용 + - 사용자별 다른 시간에 DM 전송 + +--- + +## 7. 성과 + +### 7.1 개선 효과 +- ✅ 하드코딩 제거로 유연성 향상 +- ✅ 사용자별 맞춤 서비스 제공 +- ✅ DB 스키마 일관성 개선 준비 +- ✅ 확장 가능한 설정 구조 + +### 7.2 기술적 성과 +- PostgreSQL 배열 타입 활용 +- JSON 파싱 지원으로 유연한 데이터 처리 +- 에러 처리로 안정성 확보 +- 기본값 폴백으로 서비스 연속성 보장 + +--- + +## 8. 참고 문서 +- [250826_id_체계_정리_및_conversation_logs_문제_해결.md](./250826_id_체계_정리_및_conversation_logs_문제_해결.md) +- [250826_rb8001_conversation_storage_failure.md](./250826_rb8001_conversation_storage_failure.md) + +--- + +## 9. 교훈 + +1. **컬럼명 일관성의 중요성** + - 초기 설계 시 네이밍 컨벤션 확립 필수 + - slack_user_id로 통일 필요 + +2. **하드코딩 최소화** + - 설정값은 DB나 환경변수로 관리 + - 기본값은 상수로 정의 + +3. **점진적 마이그레이션** + - 컬럼명 변경은 안전하게 단계적으로 + - 코드 수정 → 새 컬럼 추가 → 데이터 복사 → 이전 컬럼 삭제 + +--- + +*작성 완료: 2025-08-26 21:00* \ No newline at end of file