DOCS/troubleshooting/250827_frontend_backend_user_preferences_mismatch.md
happybell80 7dea8c9c0f docs: Frontend-Backend preferences 연동 현황 업데이트
- API 전혀 구현되지 않음 확인
- Frontend는 localStorage만 사용
- Backend preferences API 없음
- scheduled_tasks 테이블 미존재
- skill-email 토큰 자동 갱신은 구현됨
2025-08-27 20:53:53 +09:00

207 lines
6.3 KiB
Markdown

# Frontend ActivityPanel과 Backend user_preferences 연동 불일치 문제
## 작성일: 2025-08-27
## 작성자: happybell80
## 상태: 🔴 미구현 - API 전혀 없음
## 영향: 사용자 설정 기능 연동 불가
## 최종 업데이트: 2025-08-27 20:30
---
## 1. 핵심 문제
**API가 아예 구현되지 않음**
- Frontend: localStorage만 사용, API 호출 코드 없음
- Backend: preferences CRUD API 없음
- Gateway: preferences 라우팅 없음
---
## 2. 현재 구현 상태
### 2.1 Frontend (ActivityPanel.tsx)
- **위치**: `/frontend-customer/src/components/activity-panel.tsx`
- **구현 완료**: UI 컴포넌트 및 로직
- **데이터 저장**: localStorage (목업)
- **기능**:
- 다중 브리핑 작업 관리 (task.id별)
- 키워드 추가/삭제
- 스케줄 설정 (매일/평일/주말/커스텀)
- 포함 항목 선택 (이메일/뉴스/캘린더/슬랙)
### 2.2 Backend (user_preferences 테이블)
- **위치**: PostgreSQL main_db
- **구조**:
```sql
CREATE TABLE user_preferences (
id SERIAL PRIMARY KEY,
user_id UUID REFERENCES users(id),
slack_user_id VARCHAR(100),
news_keywords VARCHAR(128)[], -- 뉴스 키워드 배열
email_filter VARCHAR(128)[], -- 이메일 필터 (미사용)
briefing_enabled BOOLEAN DEFAULT true,
briefing_time TIME DEFAULT '09:00',
updated_at TIMESTAMP DEFAULT NOW()
);
```
### 2.3 rb8001 사용 현황
- **dm_skill.py**: user_preferences에서 news_keywords 조회
- **사용자별 맞춤 뉴스**: 정상 작동 중
- **브리핑 시간**: briefing_time 사용 중
---
## 3. 핵심 문제점
### 3.1 데이터 모델 불일치
| Frontend TaskSettings | Backend user_preferences | 불일치 내용 |
|---------------------|------------------------|------------|
| keywords: string[] | news_keywords VARCHAR(128)[] | ✅ 호환 가능 |
| scheduleTime: string | briefing_time TIME | ⚠️ 타입 변환 필요 |
| scheduleType: 'everyday' \| 'weekdays' \| ... | - | ❌ 필드 없음 |
| scheduleDays: string[] | - | ❌ 필드 없음 |
| includeEmail: boolean | - | ❌ 필드 없음 |
| includeNews: boolean | - | ❌ 필드 없음 |
| includeCalendar: boolean | - | ❌ 필드 없음 |
| includeSlack: boolean | - | ❌ 필드 없음 |
### 3.2 다중 작업 관리 불가
- **Frontend**: 여러 개의 scheduledTask 관리 (일일 브리핑, 주간 리포트 등)
- **Backend**: 사용자당 1개 설정만 저장 가능
- **영향**: "일일 브리핑", "주간 리포트" 등 구분 불가
### 3.3 Mock 데이터 하드코딩
```typescript
// ActivityPanel.tsx:155-210
const conversations: ConversationSession[] = [...]; // 하드코딩
const activities: ActivityLog[] = [...]; // 하드코딩
const scheduledTasks: ScheduledTask[] = [...]; // 하드코딩
```
- 실제 데이터 조회 API 없음
- conversation_logs 테이블 조회 엔드포인트 필요
### 3.4 API 라우팅 문제
```python
# robeing-gateway/main.py:391
@app.api_route("/api/{path:path}", methods=["GET", "POST", "PUT", "DELETE"])
# 모든 /api/* 요청을 가로챔
# /api/preferences가 어디로 갈지 불명확
```
### 3.5 서버 위치 확인됨
- PostgreSQL: 51123 서버만 (51124는 SSH 터널 사용)
- robeing-monitor: 51124 서버 (포트 매핑 없음)
### 3.6 실시간 동기화 부재
- localStorage 기반으로 다른 디바이스와 동기화 안됨
- WebSocket이나 polling 구현 없음
### 3.7 권한 검증 누락
- user_preferences 수정 시 본인 확인 로직 필요
- 다른 사용자 설정 수정 가능한 보안 문제
---
## 4. 해결 방안
### 4.1 단기 해결책 (최소 수정)
1. **Backend 스키마 확장**
```sql
ALTER TABLE user_preferences ADD COLUMN schedule_type VARCHAR(20);
ALTER TABLE user_preferences ADD COLUMN schedule_days VARCHAR(10)[];
ALTER TABLE user_preferences ADD COLUMN include_email BOOLEAN DEFAULT true;
ALTER TABLE user_preferences ADD COLUMN include_news BOOLEAN DEFAULT true;
ALTER TABLE user_preferences ADD COLUMN include_calendar BOOLEAN DEFAULT false;
ALTER TABLE user_preferences ADD COLUMN include_slack BOOLEAN DEFAULT false;
```
2. **robeing-monitor에 CRUD API 추가**
```python
GET /api/preferences/{user_id}
PUT /api/preferences/{user_id}
GET /api/conversations/{user_id}?limit=10
GET /api/activities/{user_id}?limit=10
```
3. **ActivityPanel localStorage → API 호출 변경**
### 4.2 중기 해결책 (구조 개선)
1. **scheduled_tasks 테이블 생성**
```sql
CREATE TABLE scheduled_tasks (
id SERIAL PRIMARY KEY,
user_id UUID REFERENCES users(id),
task_type VARCHAR(50), -- 'daily_briefing', 'weekly_report' 등
title VARCHAR(255),
schedule_type VARCHAR(20),
schedule_days VARCHAR(10)[],
schedule_time TIME,
settings JSONB, -- 유연한 설정 저장
enabled BOOLEAN DEFAULT true
);
```
2. **Frontend와 Backend 인터페이스 통일**
- 공통 TypeScript 타입 정의
- API 응답 형식 표준화
### 4.3 장기 해결책 (완전 재설계)
1. **마이크로서비스 분리**
- user-preferences-service 별도 구현
- GraphQL 도입 검토
2. **실시간 동기화**
- WebSocket 구현
- 설정 변경 시 실시간 반영
---
## 5. 검증 결과 (2025-08-27 20:30)
### ✅ 작동 중
- rb8001이 news_keywords로 맞춤 뉴스 제공
- skill-email 토큰 자동 갱신 (Google 라이브러리 직접 사용)
### ❌ 미구현
- Frontend API 호출 코드
- Backend preferences API
- scheduled_tasks 테이블
- email_filter 필드 사용
---
## 6. 필수 구현 사항
1. **Backend**: preferences CRUD API 구현 (robeing-monitor 또는 Gateway)
2. **Frontend**: localStorage → API 호출로 변경
3. **DB**: 다중 작업용 테이블 설계 (선택)
---
## 7. 관련 파일
### Frontend
- `/home/happybell/projects/ivada/frontend-customer/src/components/activity-panel.tsx`
### Backend
- `/home/happybell/projects/ivada/robeing-monitor/app/api/items.py`
- `/home/happybell/projects/ivada/robeing-gateway/app/main.py`
- `/home/happybell/projects/ivada/rb8001/app/skills/dm_skill.py`
### 문서
- `/home/happybell/projects/ivada/DOCS/troubleshooting/250826_slack_id_column_standardization.md`
---
## 8. 결론
**Frontend와 Backend 연결을 위한 API가 전혀 없음**
- 즉시 사용 불가
- 최소 API 구현 필요
---
*최종 수정: 2025-08-27 20:30*
*상태: API 미구현으로 연동 불가*