# Gmail 아이템 연동 문제 해결

## 작성일: 2025-08-20
## 작성자: happybell80
## 관련 서비스: rb10508_micro, robeing-monitor, skill-email

---

## 오전 10시 40분

### Gmail 아이템 확인 실패 문제

#### 문제 상황
- rb10508_micro에서 Gmail 아이템 장착 여부를 확인할 수 없음
- "Gmail을 먼저 연결해주세요!" 메시지만 반복 출력
- 실제로는 Gmail 아이템이 정상적으로 장착된 상태

#### 원인 분석
1. **포트 불일치**
   - rb10508_micro의 growth.py: `http://localhost:8090` 호출
   - robeing-monitor 실제 포트: 9024
   - 연결 실패로 인해 아이템 미장착으로 판단

#### 해결 방법
1. growth.py에서 포트 수정 (8090 → 9024)
2. 환경변수로 관리하도록 개선

```python
# 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}
)
```

3. docker-compose.yml에 환경변수 추가
```yaml
- MONITOR_SERVICE_URL=http://localhost:9024
```

---

## 오전 11시 00분

### robeing-monitor API 인증 방식 불일치

#### 문제 상황
- 포트 수정 후에도 401 에러 발생
- "User ID required" 에러 메시지

#### 원인 분석
1. **API 인증 방식 차이**
   - rb10508_micro: user_id를 쿼리 파라미터로 전송
   - robeing-monitor: X-User-Id 헤더 요구

2. **테스트 결과**
```bash
# 실패 (쿼리 파라미터)
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":[]}
```

#### 해결 방법
1. growth.py의 API 호출 방식 변경

```python
# 기존 (쿼리 파라미터)
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}
)
```

2. 응답 형식 변경에 따른 파싱 로직 수정

```python
# 기존 (배열 형식 가정)
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)
```

3. capabilities 처리 로직 개선

```python
# 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
```

---

## 최종 결과

### ✅ 완료된 작업
1. **robeing-monitor 포트 수정**
   - 8090 → 9024로 변경
   - 환경변수 MONITOR_SERVICE_URL 추가

2. **API 인증 방식 통일**
   - 쿼리 파라미터 → X-User-Id 헤더
   - check_item_equipped, get_item_capabilities 함수 수정

3. **응답 파싱 로직 개선**
   - 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 인증 방식 변경 (쿼리 파라미터 → 헤더)

---

**문서 끝**