DOCS/journey/troubleshooting/250920_user_identification_uuid_implementation.md
happybell80 0252dd1a7f fix: 51123 서버 IP 주소 업데이트 (성수 이전)
192.168.219.45 → 192.168.0.100 일괄 변경

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-21 11:52:26 +09:00

5.0 KiB

사용자 식별 체계 UUID 통합 구현

작성일: 2025-09-20 작성자: Claude 관련 서비스: rb8001, skill-email, skill-rag-file 이슈: 서비스 간 사용자 식별자 불일치 (UUID vs Slack ID)

문제 상황

  • 서비스마다 다른 사용자 식별자 사용 (UUID, Slack ID, Google ID 등)
  • skill-email이 Slack ID만 지원하여 UUID 기반 시스템과 호환 불가
  • ChromaDB 컬렉션 명명 규칙 불일치

현재 시스템 구조 분석

데이터베이스 구조

-- user 테이블 (이미 UUID 사용 중)
- id: UUID (Primary Key)
- oauth_id: VARCHAR (Slack ID, Google ID )
- oauth_provider: VARCHAR (slack, google )
- email: VARCHAR

-- gmail_token, naverworks_token 테이블
- user_id: UUID (user 테이블 참조)
- token_data: JSONB
- is_equipped: BOOLEAN

서비스별 현황

  1. rb8001: UUID 받아서 필요시 Slack ID로 변환
  2. skill-email: Slack ID만 지원 → UUID 지원 추가 필요
  3. skill-rag-file: UUID 지원
  4. ChromaDB: 서비스별 다른 명명 규칙

구현 내용

1. skill-email UUID 지원 추가

DBCredentialsProvider 수정

파일: /home/admin/ivada_project/skill_email/services/db_credentials_provider.py

def get_credentials(self, user_id: str) -> Optional[Credentials]:
    # UUID 형식 검증
    import re
    is_uuid = bool(re.match(r'^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$', user_id.lower()))

    if is_uuid:
        # UUID로 직접 조회
        query = """
            SELECT gt.token_data, gt.oauth_config, gt.scopes, gt.expiry
            FROM gmail_token gt
            WHERE gt.user_id = %s AND gt.is_equipped = true
        """
    else:
        # Slack ID로 조회 (하위 호환성)
        query = """
            SELECT gt.token_data, gt.oauth_config, gt.scopes, gt.expiry
            FROM gmail_token gt
            JOIN "user" u ON gt.user_id = u.id
            WHERE u.oauth_id = %s AND gt.is_equipped = true
        """

NaverWorksProvider (이미 UUID 지원)

파일: /home/admin/ivada_project/skill_email/services/naverworks_provider.py

  • 이미 UUID와 username 모두 지원하도록 구현되어 있음

2. ChromaDB Collection 명명 규칙 통일

표준 명명 규칙: {service}_{identifier}_{type}

rb8001 변경

파일: /home/admin/ivada_project/rb8001/app/memory/manager.py

  • 변경 전: rb8001_{user_id}
  • 변경 후: rb8001_{user_id}_memory

skill-rag-file 변경

파일: /home/admin/ivada_project/skill-rag-file/app/api/upload.py, search.py

  • 변경 전: rb8001_{team_id}_documents
  • 변경 후: skill_rag_file_{team_id}_documents

3. 환경 변수 설정

skill-email 설정

파일: /home/admin/ivada_project/skill_email/.env

TOKEN_PROVIDER=database  # api에서 database로 변경
POSTGRES_CONNECTION_STRING=postgresql://robeings:robeings@192.168.0.100:5432/main_db

테스트 결과

UUID 조회 테스트

# UUID로 이메일 조회
curl "http://localhost:8501/messages?user_id=53529291-5050-4daa-89fb-008b546feb63&limit=1&provider=gmail"
# 결과: 성공 (토큰 만료 시 적절한 에러 메시지)

# Slack ID로 이메일 조회 (하위 호환성)
curl "http://localhost:8501/messages?user_id=100176844464607664427&limit=1&provider=gmail"
# 결과: 성공 (동일하게 작동)

ChromaDB Collection 테스트

# rb8001 컬렉션
collection_name = "rb8001_test_user_12345_memory"  # ✅

# skill-rag-file 컬렉션
collection_name = "skill_rag_file_test_team_123_documents"  # ✅

주의사항

  1. TOKEN_PROVIDER 설정: skill-email에서 database 사용 필수

    • api: robeing-monitor 경유 (UUID 미지원)
    • database: 직접 DB 조회 (UUID 지원)
  2. 토큰 만료 처리: Gmail 토큰이 자주 만료되므로 refresh 로직 필요

  3. 하위 호환성: Slack ID 조회는 계속 지원하여 기존 시스템 영향 최소화

남은 작업

우선순위 높음

  1. ChromaDB 명명 규칙 통일 완료
  2. skill-email UUID 지원 완료
  3. robeing-monitor UUID 지원 추가 (TOKEN_PROVIDER=api 사용 시)

우선순위 중간

  1. 전체 시스템 통합 테스트
  2. 토큰 자동 갱신 메커니즘 구현
  3. 성능 최적화 (UUID 변환 캐싱)

교훈

  1. 설계 단계에서 일관된 식별자 체계 정의 필수

    • 처음부터 UUID를 primary identifier로 설계
    • 외부 ID는 매핑 테이블로 관리
  2. 하위 호환성 유지 전략

    • UUID/Slack ID 자동 감지 로직 구현
    • 점진적 마이그레이션 지원
  3. 환경 변수 활용

    • Provider 선택을 환경 변수로 제어
    • 배포 환경별 유연한 설정 가능

관련 문서