DOCS/troubleshooting/250929_happybell80_naverworks_briefing_weekend_email.md

3.5 KiB

date, author, tags
date author tags
2025-09-29 happybell80
naverworks
briefing
timezone
langgraph

NaverWorks 브리핑 주말 이메일 누락 문제

문제 상황

월요일 오전 9시 NaverWorks 일일 브리핑에서 주말(토,일) 이메일이 누락됨

  • 현재: 24시간만 조회 → 월요일 9시 기준 일요일 9시 이후 메일만 포함
  • 필요: 월요일은 72시간(금 9시월 9시), 화금은 24시간 조회

원인 분석

현재 코드 문제점

  • rb8001/app/skills/naverworks_briefing.py:78: now = datetime.now() KST 없음
  • rb8001/app/skills/naverworks_briefing.py:79: yesterday = now - timedelta(hours=24) 고정값
  • rb8001/app/skills/naverworks_briefing.py:109-110,142: receivedTime 필드 사용
  • rb8001/app/skills/naverworks_briefing.py:130,161: from 딕셔너리로만 처리
  • rb8001/app/skills/naverworks_briefing.py:209: Slack 날짜 표시도 KST 없음

수정 필요 사항

FastAPI 구조 원칙: 비즈니스 로직(skills/)만 수정, 스케줄링(scheduler/jobs/)과 설정(settings.py)은 유지

1. 시간대 및 조회 기간 (app/skills/naverworks_briefing.py)

  • 78번 라인: ZoneInfo("Asia/Seoul") 적용
  • 79번 라인: 월요일(weekday()==0) 72시간, 화~금 24시간
  • 85-86번 라인: startSearchDate, endSearchDate는 ISO 형식 유지

2. 필드명 및 타입 처리

  • skill-email 응답: emails[].date 필드 사용 (receivedTime은 응답에 없음, 내부 필터링용)
  • from 필드 형태:
    • NaverWorks: 딕셔너리 {'name': 'Figma', 'email': 'support@figma.com'}
    • Gmail: 문자열 'sender@gmail.com'
    • 타입 체크 필수 (isinstance 사용)

3. 현재 환경 정보

51123 서버 (인증/DB)

  • NaverWorks 토큰 정상 작동
  • OAuth 토큰 자동 갱신 기능 있음
  • PostgreSQL naverworks_token 테이블 정상

51124 서버 (실행)

  • 실행: rb8001 컨테이너에서 매일 오전 9:10 (외부 크론)
  • 내부 APScheduler: rb8001/app/main.py:49에 있으나 env로 기본 비활성
  • DB 연결: PostgreSQL (DATABASE_URL 환경변수)
  • API 인증: skill-email은 X-API-Key 불필요, skill-slack은 X-API-Key 필수

LangGraph 적용 방안

현재 상태: LangGraph 미도입 (requirements.txt, 코드에 없음)

구현 계획 (향후 적용 시)

  1. StateGraph 구조

    • 노드: get_uuid → fetch_emails → filter_important → generate_summary → format_message → send_slack
    • 상태 키: user_uuid, emails, important_emails, summary, slack_message
    • 체크포인터: SqliteSaver('/mnt/hdd/logs/langgraph.db')
  2. 필요 패키지 및 호환성

    • rb8001/requirements.txt에 추가: langgraph, langgraph-checkpoint-sqlite
    • 주의: SQLAlchemy 2.0.35 사용 중, SQLAlchemyJobStore 호환성 검증 필요
    • Python 3.11 내장 zoneinfo 사용 가능
  3. 주요 개선점

    • skill-email API 타임아웃 시 fetch_emails 노드만 재실행
    • Slack 전송 실패 시 send_slack 노드만 재시도
    • thread_id='naverworks_daily_YYYYMMDD'로 일별 추적
  4. 파일 구조 변경

    • 기존 process_briefing 메서드를 StateGraph.compile()로 교체
    • 각 단계를 개별 노드 함수로 분리
    • graph.invoke({"email": "info@company-x.partners"}, config={"configurable": {"thread_id": thread_id}})

교훈

  • 타임존 명시: naive datetime 대신 KST 명시적 사용
  • 요일별 조회 기간: 월요일은 주말 포함 72시간 필요
  • API 응답 필드: 실제 응답 필드명 확인 필수
  • 타입 안전성: 문자열/객체 혼재 가능성 고려