diff --git a/journey/troubleshooting/251122_calendar_event_registration_failure_tdd.md b/journey/troubleshooting/251122_calendar_event_registration_failure_tdd.md index 705d8bf..6d45a43 100644 --- a/journey/troubleshooting/251122_calendar_event_registration_failure_tdd.md +++ b/journey/troubleshooting/251122_calendar_event_registration_failure_tdd.md @@ -222,10 +222,39 @@ docker exec -it rb8001 python3 tests/test_calendar_natural_language_parsing.py --- -## 8. 다음 단계 +## 8. 해결 완료 (2025-11-22) -1. ✅ TDD 테스트 작성 완료 (`test_calendar_natural_language_parsing.py`) -2. ⏳ skill-calendar 토큰 갱신 로직 추가 -3. ⏳ 테스트 실행 및 검증 -4. ⏳ 배포 및 E2E 테스트 +### 8.1 구현 완료 +1. ✅ rb8001 자연어 시간 범위 파싱 개선 (`extract_time_range_generic`) +2. ✅ rb8001 제목 추출 로직 개선 (원본 메시지에서 직접 추출) +3. ✅ skill-calendar 토큰 자동 갱신 로직 추가 (`get_credentials()`) +4. ✅ skill-calendar `_save_credentials_to_db()` 메서드 구현 +5. ✅ skill-calendar `invalid_grant` 에러를 401로 전파 +6. ✅ rb8001 401 에러 감지 및 재인증 안내 메시지 + +### 8.2 검증 완료 (2025-11-22 11:52) +``` +사용자: "11월 24일 월요일 오후 1시부터 4시까지 컴퍼니엑스 세미나" +로빙: "네, 다음 주 월요일 11월 24일 오후 1시부터 4시까지 컴퍼니엑스 세미나 일정을 등록해 드릴게요. 구글 캘린더에 등록해드릴까요?" +사용자: "ㅇㅇ" +로빙: "✅ 구글 캘린더에 일정을 등록했습니다! + 제목: 컴퍼니엑스 세미나 + 일시: 2025-11-24 13:00 ~ 16:00 + 장소: N/A + 캘린더에서 보기" +``` +✅ **성공**: 일정 등록 완료 + +### 8.3 수정된 파일 +- `rb8001/app/router/calendar_handler.py`: 자연어 시간 파싱, 제목 추출, 재인증 안내 +- `rb8001/app/skills/calendar_skill.py`: 401 에러 감지 및 전파 +- `skill-calendar/services/google_calendar_service.py`: 토큰 자동 갱신, DB 저장 +- `skill-calendar/routers/calendar.py`: `invalid_grant` → 401 변환 + +### 8.4 교훈 +1. **자연어 파싱**: "오후 1시부터 4시까지" 같은 자연어 시간 표현을 정규식으로 파싱 가능 +2. **제목 추출**: LLM 응답이 구조화되지 않아도 원본 메시지에서 직접 추출 가능 +3. **OAuth 토큰 관리**: skill-email 패턴을 참고하여 skill-calendar에도 동일한 토큰 갱신 로직 적용 +4. **에러 전파**: `invalid_grant` 같은 인증 에러는 401로 명확히 전파하여 상위 레이어에서 처리 가능 +5. **사용자 안내**: 기술적 에러를 사용자 친화적인 재인증 안내 메시지로 변환