docs: 뉴스 키워드 문서 간소화 및 프론트엔드 연동 방안 수정

- 불필요한 코드와 우선순위 섹션 제거
- 사용자별 키워드 설정 방안으로 통합
- 프론트엔드 기존 UI 활용 방안 추가 (250825 문서 참조)
- user_preferences 테이블로 통합 관리
This commit is contained in:
Claude-51124 2025-08-26 22:12:03 +09:00
parent dba82ab596
commit aff9ab1c0e

View File

@ -173,208 +173,71 @@ WHERE slack_id IS NOT NULL AND slack_user_id IS NULL;
### 10.1 발견된 문제 ### 10.1 발견된 문제
**매일 같은 AI 뉴스만 반복되는 현상** **매일 같은 AI 뉴스만 반복되는 현상**
#### 원인 분석 #### 원인
1. **하드코딩된 키워드** - rb8001의 dm_skill.py:309에 `["AI", "기술", "IT"]` 하드코딩
- 위치: `/home/admin/ivada_project/rb8001/app/skills/dm_skill.py:309` - 환경변수 NEWS_KEYWORDS 미사용
- 코드: `["AI", "기술", "IT"]`로 고정 - 중복 방지로 인해 같은 뉴스 반복 표시
- 문제: 매일 동일한 키워드로만 검색
2. **환경변수 미활용** ### 10.2 해결 방안: 사용자별 키워드 설정
- 설정: `NEWS_KEYWORDS=keyword1,keyword2`
- 실제: 사용되지 않음
3. **중복 방지 로직의 부작용** #### DB 스키마
- 이미 수집된 뉴스는 건너뜀
- 새 뉴스 없으면 최근 저장된 뉴스 5개 반복 표시
- 결과: 매일 같은 뉴스 표시
### 10.2 개선 방안
#### 방안 1: 동적 키워드 시스템
```python
# dm_skill.py 수정 예시
import random
from datetime import datetime
def get_daily_keywords():
"""날짜별로 다른 키워드 세트 반환"""
keyword_sets = [
["AI", "인공지능", "ChatGPT"],
["반도체", "삼성", "SK하이닉스"],
["전기차", "테슬라", "현대차"],
["빅테크", "구글", "애플"],
["스타트업", "유니콘", "투자"],
["바이오", "제약", "헬스케어"],
["핀테크", "블록체인", "가상자산"]
]
# 요일별로 다른 키워드 세트 사용
day_of_week = datetime.now().weekday()
return keyword_sets[day_of_week]
# 사용
keywords = get_daily_keywords() # ["AI", "기술", "IT"] 대신
```
#### 방안 2: DB 기반 키워드 관리
```sql ```sql
-- 키워드 설정 테이블 생성 -- 사용자 선호도 테이블 (프론트엔드 설정 UI와 연동)
CREATE TABLE news_keywords ( CREATE TABLE user_preferences (
id SERIAL PRIMARY KEY, id SERIAL PRIMARY KEY,
user_id UUID REFERENCES users(id), user_id UUID REFERENCES users(id),
slack_user_id VARCHAR(100), slack_user_id VARCHAR(100),
keywords TEXT[], -- PostgreSQL 배열 타입 news_keywords TEXT[], -- 뉴스 관심 키워드
priority INTEGER DEFAULT 0, email_filter TEXT[], -- 이메일 필터 키워드
active BOOLEAN DEFAULT true, briefing_enabled BOOLEAN DEFAULT true,
briefing_time TIME DEFAULT '09:00',
created_at TIMESTAMP DEFAULT NOW(), created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW() updated_at TIMESTAMP DEFAULT NOW()
); );
-- 기본 키워드 설정
INSERT INTO news_keywords (slack_user_id, keywords, priority) VALUES
('U091UNVE41M', ARRAY['AI', '스타트업', '투자'], 1),
('U0925SXQFDK', ARRAY['반도체', '삼성', 'IT'], 1),
('U092F7FQ55L', ARRAY['전기차', '배터리', '에너지'], 1);
``` ```
#### 방안 3: 사용자별 맞춤 키워 #### rb8001 수정 필요 코드
```python ```python
# dm_skill.py 수정
async def get_user_keywords(slack_user_id: str) -> List[str]: async def get_user_keywords(slack_user_id: str) -> List[str]:
"""사용자별 맞춤 키워드 조회""" """사용자 설정에서 키워드 조회"""
try: db = SessionLocal()
db = SessionLocal() result = db.execute(
result = db.execute( text("SELECT news_keywords FROM user_preferences WHERE slack_user_id = :sid"),
text("SELECT keywords FROM news_keywords WHERE slack_user_id = :sid"), {"sid": slack_user_id}
{"sid": slack_user_id} ).fetchone()
).fetchone()
if result and result[0]: if result and result[0]:
return result[0] # PostgreSQL 배열 반환 return result[0]
else: return ["AI", "기술", "IT"] # 기본값
# 기본값 또는 랜덤 키워드
return get_daily_keywords()
finally:
db.close()
``` ```
### 10.3 환경변수 DB 저장 방식 ### 10.3 프론트엔드 연동
#### 설정 테이블 구조 #### 기존 UI 활용 (250825 문서 참조)
```sql - **위치**: frontend-customer의 ActivityPanel 설정 섹션
-- 시스템 설정 테이블 - **기능**: 관심 키워드 입력/수정
CREATE TABLE system_config ( - **저장**: user_preferences 테이블로 직접 저장
id SERIAL PRIMARY KEY,
service_name VARCHAR(50) NOT NULL,
key VARCHAR(100) NOT NULL,
value TEXT,
description TEXT,
updated_at TIMESTAMP DEFAULT NOW(),
updated_by VARCHAR(100),
UNIQUE(service_name, key)
);
-- 예시 데이터 #### API 엔드포인트
INSERT INTO system_config (service_name, key, value, description) VALUES
('news_skill', 'default_keywords', '["AI", "기술", "IT"]', '기본 뉴스 검색 키워드'),
('news_skill', 'max_items', '5', '최대 뉴스 개수'),
('news_skill', 'search_days', '7', '검색 기간 (일)'),
('rb8001', 'morning_briefing_time', '09:00', '모닝 브리핑 시간');
```
#### Python에서 DB 설정 읽기
```python ```python
from typing import Optional, Any # Gateway 또는 auth-server에 추가
import json @router.post("/api/users/preferences")
async def update_preferences(
keywords: List[str],
user_id: str = Depends(get_current_user)
):
# user_preferences 업데이트
pass
class ConfigManager: @router.get("/api/users/preferences")
"""DB 기반 설정 관리자""" async def get_preferences(
user_id: str = Depends(get_current_user)
def __init__(self, service_name: str): ):
self.service_name = service_name # user_preferences 조회
self._cache = {} pass
def get(self, key: str, default: Any = None) -> Any:
"""설정값 조회"""
# 캐시 확인
if key in self._cache:
return self._cache[key]
try:
db = SessionLocal()
result = db.execute(
text("""
SELECT value FROM system_config
WHERE service_name = :service AND key = :key
"""),
{"service": self.service_name, "key": key}
).fetchone()
if result:
# JSON 파싱 시도
try:
value = json.loads(result[0])
except:
value = result[0]
self._cache[key] = value
return value
return default
finally:
db.close()
def set(self, key: str, value: Any, description: str = None):
"""설정값 저장"""
try:
db = SessionLocal()
# JSON 직렬화 가능한 경우
if isinstance(value, (list, dict)):
value = json.dumps(value, ensure_ascii=False)
else:
value = str(value)
db.execute(
text("""
INSERT INTO system_config (service_name, key, value, description)
VALUES (:service, :key, :value, :desc)
ON CONFLICT (service_name, key)
DO UPDATE SET value = :value, updated_at = NOW()
"""),
{
"service": self.service_name,
"key": key,
"value": value,
"desc": description
}
)
db.commit()
# 캐시 업데이트
self._cache[key] = value
finally:
db.close()
# 사용 예시
config = ConfigManager("news_skill")
keywords = config.get("default_keywords", ["AI", "IT"])
max_items = config.get("max_items", 5)
``` ```
### 10.4 구현 우선순위
1. **즉시 적용 가능**: 요일별 키워드 로테이션
2. **중기 목표**: DB 기반 키워드 관리
3. **장기 목표**: 사용자별 맞춤 키워드 + AI 추천
### 10.5 효과
- **다양성**: 매일 다른 뉴스 제공
- **맞춤화**: 사용자별 관심사 반영
- **유연성**: DB에서 키워드 실시간 변경 가능
- **확장성**: 새로운 키워드 세트 쉽게 추가
--- ---
*작성 완료: 2025-08-26 21:30* *작성 완료: 2025-08-26 21:30*