DOCS/troubleshooting/250826_happybell80_사용자별설정_구현.md
happybell80 484885431a docs: 사용자별 설정 시스템 구현 문서 추가
- Slack ID 컬럼명 불일치 문제 분석
- 뉴스 키워드 하드코딩 해결 과정
- user_preferences 테이블 설계 및 구현
- rb8001 코드 수정 내역 (커밋: aed931e, 7103599)

주요 성과:
- 사용자별 맞춤 뉴스 키워드 설정 가능
- 하드코딩 제거로 유연성 향상
- DB 스키마 일관성 개선 준비
2025-08-26 23:57:33 +09:00

6.6 KiB

사용자별 설정 시스템 구현 (뉴스 키워드, 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 컬럼명 변경 (추후 작업)

-- 안전한 변경을 위한 단계적 접근
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 테이블 생성

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)

# 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 동작 흐름

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 사용자 설정 추가 예시

-- 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 테스트 코드
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. 참고 문서


9. 교훈

  1. 컬럼명 일관성의 중요성

    • 초기 설계 시 네이밍 컨벤션 확립 필수
    • slack_user_id로 통일 필요
  2. 하드코딩 최소화

    • 설정값은 DB나 환경변수로 관리
    • 기본값은 상수로 정의
  3. 점진적 마이그레이션

    • 컬럼명 변경은 안전하게 단계적으로
    • 코드 수정 → 새 컬럼 추가 → 데이터 복사 → 이전 컬럼 삭제

작성 완료: 2025-08-26 21:00