DOCS/troubleshooting/251016_naverworks_briefing_system_uuid_error.md
Claude-51124 3fb2deff22 docs: 콜드메일 플로우 분석 및 3가지 문제 문서화
- 251016_grpc_uvloop_blocking_error: gRPC + uvloop 리소스 경합 문제
- 251016_naverworks_briefing_system_uuid_error: 시스템 사용자 UUID 검증 오류
- 251014_claude_coldmail_filter_tokenization_issue: 파인티처 메일 누락 사례 추가

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-16 13:32:38 +09:00

2.9 KiB

NaverWorks Briefing 'system' 사용자 UUID 오류

날짜: 2025-10-16 작성자: Claude 관련 파일: rb8001/app/skills/naverworks_briefing.py, rb8001/app/state/database.py


문제 상황

발생 시점

  • NaverWorks Daily Briefing 실행 시 (매일 09:00)
  • 감정 분석 결과 DB 저장 시도 중 (09:00:03.277)

에러 로그

{"time":"2025-10-16 09:00:03,277","level":"ERROR","module":"app.state.database"}
Failed to save emotion reading: invalid input for query argument $1: 'system'
(invalid UUID 'system': length must be between 32..36 characters, got 6)

{"time":"2025-10-16 09:00:03,277","level":"WARNING","module":"app.llm.emotion_llm"}
Failed to save emotion reading for user system

영향

  • emotion_reading 테이블 저장 실패
  • NaverWorks Briefing 자체는 정상 완료

원인 분석

1. 'system' 문자열 전달

위치: naverworks_briefing.py:177 (추정)

감정 분석 호출 시 user_id로 'system' 문자열 전달:

emotions = await emotion_classifier.classify_emotion(summary_text, user_id="system")

2. DB 저장 시 UUID 검증

위치: app/state/database.py

emotion_reading 테이블의 user_id 컬럼은 UUID 타입:

user_id UUID NOT NULL REFERENCES users(id)

3. UUID 변환 실패

asyncpg는 'system' 문자열을 UUID로 변환 불가 (길이 6자 < 32자)


해결 방안

1. user_id를 nullable로 변경 (DB)

51123 서버에서 실행:

ALTER TABLE emotion_reading ALTER COLUMN user_id DROP NOT NULL;

2. 시스템 사용자 처리 로직 추가

위치: app/state/database.py:save_emotion_reading

변경:

async def save_emotion_reading(user_id: str, emotions: List[str], ...):
    if user_id == "system":
        user_id = None  # nullable로 저장
    await conn.execute("INSERT INTO emotion_reading ...")

3. 전용 시스템 UUID 생성 (권장)

51123 서버에서 실행:

-- 전용 시스템 사용자 생성
INSERT INTO users (id, username, email) VALUES
('00000000-0000-0000-0000-000000000000', 'system', 'system@robeing.internal');

위치: naverworks_briefing.py

변경: SYSTEM_USER_UUID 환경변수 사용


구현 완료

미구현 (감정 저장 실패만, 브리핑 기능 정상)


교훈

UUID 타입 검증 누락

  • 함수 시그니처에서 user_id: str 허용하지만 실제는 UUID 필요
  • 교훈: 타입 힌트와 실제 검증 불일치 방지

시스템 사용자 처리 미정의

  • 사용자가 아닌 시스템 작업의 user_id 처리 정책 부재
  • 교훈: 시스템 사용자는 전용 UUID 또는 nullable 정책 수립

DB 제약조건과 코드 불일치

  • DB는 NOT NULL이지만 코드는 'system' 문자열 전달
  • 교훈: DB 스키마와 코드 로직 동기화 검증 필요

참고 문서

  • 250826_id_체계_정리_및_conversation_logs_문제_해결.md: UUID vs Slack ID 문제