diff --git a/journey/plans/251117_claude_robeing_diary_시스템_계획.md b/journey/plans/251117_claude_robeing_diary_시스템_계획.md index 8367a6f..e4a93d0 100644 --- a/journey/plans/251117_claude_robeing_diary_시스템_계획.md +++ b/journey/plans/251117_claude_robeing_diary_시스템_계획.md @@ -184,21 +184,32 @@ CREATE INDEX idx_activity_log_type ON activity_log(activity_type); 1. ✅ **DB 테이블 생성**: `robeing_diary`, `activity_log` 테이블 생성 완료 (`rb8001/app/state/diary_repository.py`) 2. ⏳ **활동 로그 기록**: 스킬 실행 시 `activity_log`에 자동 기록 로직 추가 -3. ⏳ **Diary Aggregator 구현**: `rb8001/app/services/diary/aggregator.py` 생성, 모든 데이터 소스 집계 -4. ⏳ **일기 생성 로직**: `rb8001/app/services/diary/generator.py` 생성, LLM으로 일기 텍스트 생성 -5. ⏳ **스케줄러 등록**: `rb8001/app/scheduler/jobs/diary_generator.py` 생성, `main.py`에 등록 -6. ⏳ **API 엔드포인트**: `rb8001/app/router/diary.py` 생성, `/api/diary/{date}` 구현 -7. ⏳ **관리자 대시보드**: admin-dashboard에 일기 목록/상세 페이지 추가 +3. ✅ **Diary Aggregator 구현**: `rb8001/app/services/diary/aggregator.py` 생성, 모든 데이터 소스 집계 완료 +4. ✅ **일기 생성 로직**: `rb8001/app/services/diary/generator.py` 생성, LLM으로 일기 텍스트 생성 완료 +5. ✅ **스케줄러 등록**: `rb8001/app/scheduler/jobs/diary_generator.py` 생성, `main.py`에 등록 완료 +6. ✅ **API 엔드포인트**: `rb8001/app/router/diary_endpoint.py` 생성, `/api/diary/{date}` 구현 완료 +7. ✅ **관리자 대시보드**: admin-dashboard에 일기 목록/상세 페이지 추가 완료 8. ⏳ **DOCS 동기화 스크립트**: 선택적으로 별도 스크립트로 DOCS 동기화 -## 진행 상황 +## 구현 완료 -**완료 (2025-12-09)**: -- DB 테이블 스키마 정의 및 생성 (`_ensure_tables()`) -- Repository 함수 구현 (`save_diary`, `get_diary`, `save_activity_log`) -- 테스트 완료 (더미 데이터 저장/조회 검증) +**완료일**: 2025-12-23 -**다음 단계**: Diary Aggregator 및 일기 생성 로직 구현 +**구현 완료 문서**: [로빙 일기 시스템 구현 완료](../../journey/troubleshooting/251223_로빙_일기_시스템_구현_완료.md) + +**주요 완료 사항**: +- ✅ DB 테이블 스키마 정의 및 생성 (`_ensure_tables()`) +- ✅ Repository 함수 구현 (`save_diary`, `get_diary`, `save_activity_log`) +- ✅ Diary Aggregator 구현 (대화/활동/감정/성장/이슈 데이터 집계) +- ✅ LLM 일기 생성 로직 구현 (Gemini 사용) +- ✅ 스케줄러 등록 (매일 오전 2시 자동 생성) +- ✅ API 엔드포인트 구현 (`GET /api/diary/{date}`) +- ✅ Admin Dashboard 일기 페이지 추가 (목록/상세 조회) +- ✅ 일기 클릭 시 본문 표시 버그 수정 + +**미구현 항목**: +- ⏳ 스킬 실행 시 `activity_log` 자동 기록 로직 (수동 기록 가능) +- ⏳ DOCS 동기화 스크립트 (선택적) --- diff --git a/journey/troubleshooting/251223_로빙_일기_시스템_구현_완료.md b/journey/troubleshooting/251223_로빙_일기_시스템_구현_완료.md new file mode 100644 index 0000000..935e016 --- /dev/null +++ b/journey/troubleshooting/251223_로빙_일기_시스템_구현_완료.md @@ -0,0 +1,143 @@ +# 로빙 일기 시스템 구현 완료 + +**날짜**: 2025-12-23 +**작성자**: Claude +**관련 문서**: [로빙 일기 시스템 계획](../plans/251117_claude_robeing_diary_시스템_계획.md) + +--- + +## 구현 완료 사항 + +### 1. 백엔드 구현 (rb8001) + +**파일 위치**: +- `rb8001/app/state/diary_repository.py` - DB 테이블 및 저장/조회 함수 +- `rb8001/app/services/diary/aggregator.py` - 데이터 집계 +- `rb8001/app/services/diary/generator.py` - LLM 일기 생성 +- `rb8001/app/router/diary_endpoint.py` - API 엔드포인트 +- `rb8001/app/scheduler/jobs/diary_generator.py` - 스케줄러 작업 +- `rb8001/main.py` - 스케줄러 등록 + +**기능**: +- 매일 오전 2시 자동 일기 생성 (APScheduler cron) +- 데이터 집계: 대화 로그, 활동 로그, 감정 데이터, 성장 데이터, 이슈 데이터 +- LLM(Gemini)으로 마크다운 형식 일기 생성 +- PostgreSQL `robeing_diary` 테이블에 저장 +- API: `GET /api/diary/{date}?robeing_id=rb8001` + +### 2. Admin Dashboard 구현 + +**파일 위치**: +- `admin-dashboard/frontend/index.html` - 일기 페이지 UI +- `admin-dashboard/frontend/app.js` - 일기 목록/상세 로드 함수 +- `admin-dashboard/backend/admin_routes.py` - 일기 API 프록시 +- `admin-dashboard/frontend/styles.css` - 일기 스타일 + +**기능**: +- 일기 목록 조회 (최근 30일) +- 일기 상세 조회 (날짜별) +- 날짜 입력으로 조회 +- rb8001 API 프록시 (`/admin/api/diary/list`, `/admin/api/diary/{date}`) + +### 3. 버그 수정 + +**문제**: 일기 목록에서 항목 클릭 시 본문이 표시되지 않음 + +**원인**: `loadDiaryByDate` 함수가 IIFE 내부에 있어 전역 스코프에서 접근 불가 + +**해결**: `loadDiary`, `loadDiaryByDate` 함수를 IIFE 밖으로 이동하여 전역 함수로 노출 + +**커밋**: `d734322` - fix: 일기 클릭 시 본문 표시 안 되는 문제 수정 (전역 함수로 노출) + +--- + +## 알려진 이슈 + +### robeing 테이블 스키마 불일치 + +**문제**: `DiaryAggregator._get_growth()` 함수에서 `robeing_id` 컬럼을 조회하나 실제 테이블에는 해당 컬럼이 없음 + +**영향**: 성장 데이터 조회 실패 (일기 생성에는 영향 없음, 빈 stats로 저장) + +**해결 필요**: `robeing` 테이블 스키마 확인 후 쿼리 수정 또는 테이블 스키마 수정 + +--- + +## 테스트 결과 + +### 일기 생성 테스트 (2025-12-22) + +```bash +docker exec rb8001 python /code/scripts/generate_diary_manual.py +``` + +**결과**: +- ✅ 일기 생성 성공 +- ✅ DB 저장 성공 +- ✅ API 조회 정상 동작 +- ⚠️ 성장 데이터 조회 실패 (robeing_id 컬럼 없음) + +### API 테스트 + +```bash +curl "http://localhost:8001/api/diary/2025-12-22?robeing_id=rb8001" +``` + +**응답**: +```json +{ + "date": "2025-12-22", + "robeing_id": "rb8001", + "content": "# 로빙 일기 – 2025-12-22\n\n## 오늘 한 일\n...", + "summary": "# 로빙 일기 – 2025-12-22", + "dominant_emotion": "surprise", + "stats": {} +} +``` + +### 브라우저 UI 테스트 + +- ✅ 일기 탭 표시 확인 +- ✅ 일기 목록 로드 확인 +- ✅ 일기 클릭 시 본문 표시 확인 (수정 후) + +--- + +## 구현 단계별 완료 현황 + +1. ✅ **DB 테이블 생성**: `robeing_diary`, `activity_log` 테이블 생성 완료 +2. ⏳ **활동 로그 기록**: 스킬 실행 시 자동 기록 로직 미구현 (수동 기록 가능) +3. ✅ **Diary Aggregator 구현**: 모든 데이터 소스 집계 완료 +4. ✅ **일기 생성 로직**: LLM으로 일기 텍스트 생성 완료 +5. ✅ **스케줄러 등록**: 매일 오전 2시 자동 생성 등록 완료 +6. ✅ **API 엔드포인트**: `/api/diary/{date}` 구현 완료 +7. ✅ **관리자 대시보드**: 일기 목록/상세 페이지 추가 완료 +8. ⏳ **DOCS 동기화 스크립트**: 미구현 (선택적) + +--- + +## 교훈 + +### 1. 전역 함수 노출 필요성 +- `onclick` 핸들러에서 호출하는 함수는 전역 스코프에 있어야 함 +- IIFE 내부 함수는 외부에서 접근 불가 +- **해결**: 필요한 함수는 IIFE 밖으로 분리하여 전역 함수로 노출 + +### 2. API 응답 필드명 일관성 +- 백엔드 API는 `content` 필드 사용 +- 프론트엔드에서 `content || full_content`로 호환 처리 +- **권장**: API 스펙 문서화 및 필드명 통일 + +### 3. DB 스키마 검증 +- ORM 모델과 실제 테이블 스키마 불일치 가능성 +- **권장**: 테이블 생성 시 스키마 검증 로직 추가 또는 마이그레이션 스크립트 사용 + +--- + +## 참고 + +- [로빙 일기 시스템 계획](../plans/251117_claude_robeing_diary_시스템_계획.md) +- `rb8001/app/services/diary/aggregator.py` - 데이터 집계 로직 +- `rb8001/app/services/diary/generator.py` - LLM 일기 생성 로직 +- `admin-dashboard/frontend/app.js` - 일기 UI 로직 +