192.168.219.45 → 192.168.0.100 일괄 변경 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
5.0 KiB
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
서비스별 현황
- rb8001: UUID 받아서 필요시 Slack ID로 변환
- skill-email: Slack ID만 지원 → UUID 지원 추가 필요
- skill-rag-file: UUID 지원
- 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" # ✅
주의사항
-
TOKEN_PROVIDER 설정: skill-email에서
database사용 필수api: robeing-monitor 경유 (UUID 미지원)database: 직접 DB 조회 (UUID 지원)
-
토큰 만료 처리: Gmail 토큰이 자주 만료되므로 refresh 로직 필요
-
하위 호환성: Slack ID 조회는 계속 지원하여 기존 시스템 영향 최소화
남은 작업
우선순위 높음
- ✅ ChromaDB 명명 규칙 통일 완료
- ✅ skill-email UUID 지원 완료
- ⏳ robeing-monitor UUID 지원 추가 (TOKEN_PROVIDER=api 사용 시)
우선순위 중간
- 전체 시스템 통합 테스트
- 토큰 자동 갱신 메커니즘 구현
- 성능 최적화 (UUID 변환 캐싱)
교훈
-
설계 단계에서 일관된 식별자 체계 정의 필수
- 처음부터 UUID를 primary identifier로 설계
- 외부 ID는 매핑 테이블로 관리
-
하위 호환성 유지 전략
- UUID/Slack ID 자동 감지 로직 구현
- 점진적 마이그레이션 지원
-
환경 변수 활용
- Provider 선택을 환경 변수로 제어
- 배포 환경별 유연한 설정 가능