- 7-8월 초기 구축 문서 12개를 _archive/troubleshooting/2025_07-08_initial_setup/로 이동 - book/300_architecture/390_human_in_the_loop_intent_learning.md를 journey/research/intent_classification/로 이동 (개발 여정 문서) - 빈 폴더 제거 (journey/assets/*)
4.7 KiB
4.7 KiB
Gmail 아이템 연동 문제 해결
작성일: 2025-08-20
작성자: happybell80
관련 서비스: rb10508_micro, robeing-monitor, skill-email
오전 10시 40분
Gmail 아이템 확인 실패 문제
문제 상황
- rb10508_micro에서 Gmail 아이템 장착 여부를 확인할 수 없음
- "Gmail을 먼저 연결해주세요!" 메시지만 반복 출력
- 실제로는 Gmail 아이템이 정상적으로 장착된 상태
원인 분석
- 포트 불일치
- rb10508_micro의 growth.py:
http://localhost:8090호출 - robeing-monitor 실제 포트: 9024
- 연결 실패로 인해 아이템 미장착으로 판단
- rb10508_micro의 growth.py:
해결 방법
- growth.py에서 포트 수정 (8090 → 9024)
- 환경변수로 관리하도록 개선
# app/config.py에 추가
MONITOR_SERVICE_URL: str = "http://localhost:9024"
# growth.py 수정
response = await client.get(
f"{settings.MONITOR_SERVICE_URL}/api/items/{item_type}",
params={"user_id": user_id}
)
- docker-compose.yml에 환경변수 추가
- MONITOR_SERVICE_URL=http://localhost:9024
오전 11시 00분
robeing-monitor API 인증 방식 불일치
문제 상황
- 포트 수정 후에도 401 에러 발생
- "User ID required" 에러 메시지
원인 분석
-
API 인증 방식 차이
- rb10508_micro: user_id를 쿼리 파라미터로 전송
- robeing-monitor: X-User-Id 헤더 요구
-
테스트 결과
# 실패 (쿼리 파라미터)
curl "http://localhost:9024/api/items/gmail?user_id=xxx"
→ {"detail":"User ID required"}
# 성공 (헤더)
curl -H "X-User-Id: xxx" "http://localhost:9024/api/items/gmail"
→ {"equipped":{...}, "available":[]}
해결 방법
- growth.py의 API 호출 방식 변경
# 기존 (쿼리 파라미터)
response = await client.get(
f"{settings.MONITOR_SERVICE_URL}/api/items/{item_type}",
params={"user_id": user_id}
)
# 수정 (헤더 사용)
response = await client.get(
f"{settings.MONITOR_SERVICE_URL}/api/items/{item_type}",
headers={"X-User-Id": user_id}
)
- 응답 형식 변경에 따른 파싱 로직 수정
# 기존 (배열 형식 가정)
items = response.json()
equipped = any(item.get('is_equipped') for item in items)
# 수정 (객체 형식 처리)
data = response.json()
equipped_item = data.get('equipped')
equipped = equipped_item is not None and equipped_item.get('is_equipped', False)
- capabilities 처리 로직 개선
# capabilities가 딕셔너리인 경우 처리
capabilities = equipped_item.get('capabilities', {})
if isinstance(capabilities, dict):
capabilities_list = [k for k, v in capabilities.items() if v]
else:
capabilities_list = capabilities
최종 결과
✅ 완료된 작업
-
robeing-monitor 포트 수정
- 8090 → 9024로 변경
- 환경변수 MONITOR_SERVICE_URL 추가
-
API 인증 방식 통일
- 쿼리 파라미터 → X-User-Id 헤더
- check_item_equipped, get_item_capabilities 함수 수정
-
응답 파싱 로직 개선
- items 배열 → {equipped, available} 구조
- capabilities 딕셔너리 처리 추가
📊 테스트 결과
- Gmail 아이템 장착 확인: ✅ 성공
- 권한 인식 (send, read, modify): ✅ 성공
- skill-email 서비스 호출: ✅ 성공
- 응답 메시지 변화:
- 이전: "Gmail을 먼저 연결해주세요!"
- 현재: "이메일 처리를 완료했습니다."
🔄 시스템 흐름
사용자 요청
↓
rb10508_micro
↓
growth.py: check_item_equipped()
↓ (X-User-Id 헤더)
robeing-monitor (포트 9024)
↓
Gmail 아이템 확인
↓
skill-email 호출 (포트 8501)
↓
이메일 처리 완료
교훈
1. API 통신 시 인증 방식 확인 필수
- 쿼리 파라미터 vs 헤더 방식 차이
- API 문서나 실제 구현 코드 확인 필요
- curl 테스트로 사전 검증
2. 포트 설정은 환경변수로 관리
- 하드코딩 방지
- 환경별 유연한 설정 가능
- docker-compose.yml과 config.py 동기화
3. API 응답 형식 변경 대응
- 배열 vs 객체 구조 차이 주의
- 타입 체크를 통한 안전한 처리
- 로그를 통한 디버깅 활용
4. 서비스 간 통신 흐름 파악
- 포트 매핑 문서화 필요
- 인증 방식 표준화
- 응답 형식 일관성 유지
5. 단계별 테스트의 중요성
- curl로 직접 API 테스트
- 로그 확인으로 문제 지점 파악
- 점진적 문제 해결
관련 커밋
- rb10508_micro:
d1d9b2c- robeing-monitor 포트 수정 및 환경변수화 - rb10508_micro:
d1ff710- API 인증 방식 변경 (쿼리 파라미터 → 헤더)
문서 끝