docs: 대화 히스토리 구현 전체 트러블슈팅 완성

- POST /api/message username 미전달 문제 및 해결
- /api/messages sender 매핑 오류 및 해결
- 프론트엔드 초기 로드 실패 원인 분석 및 해결
- lambda 함수 파라미터 패턴 주의사항
- React useEffect 타이밍 문제 상세 분석
This commit is contained in:
happybell80 2025-08-18 14:31:17 +09:00
parent 79ca094783
commit 89f2ae3507

View File

@ -290,4 +290,80 @@ CREATE TABLE users (
### 9. **상태 관리와 영속성 일치 필수**
- React state에 저장한 값은 localStorage에도 동기화
- API 요청 시 사용하는 값은 반드시 영속 저장소에 보관
- 로그인/로그아웃 시 모든 관련 데이터 정리
- 로그인/로그아웃 시 모든 관련 데이터 정리
## 오후 2시 15분 - POST /api/message 엔드포인트 username 미전달
### 문제
- GET /api/messages (조회)는 정상 작동
- POST /api/message (저장)가 default 컬렉션에 저장
- think_functional 호출 시 username 전달 안됨
### 해결
```python
# endpoints.py 수정
username = await resolve_username(request.user_id)
# lambda 함수 수정 - brain.py 호출 패턴과 일치
search_memories_fn=lambda query, user_id: search_memories(
query, user_id, username=username
),
```
### 주의사항
- brain.py가 keyword arguments로 호출 (`query=`, `user_id=`)
- lambda 파라미터 순서가 호출 패턴과 일치해야 함
- 예전에도 같은 실수 반복 - 트러블슈팅 문서 확인 필수
## 오후 2시 20분 - /api/messages sender 매핑 오류
### 문제
- ChromaDB에 role: "assistant"로 저장
- 프론트엔드는 sender: "robing" 기대
- 모든 메시지가 sender: "user"로 표시
### 해결
```python
# endpoints.py 수정
role = metadata.get('role', 'user')
sender = 'robing' if role == 'assistant' else 'user'
messages.append({
"sender": sender, # role을 sender로 변환
})
```
## 오후 2시 30분 - 프론트엔드 초기 로드 실패
### 문제 분석
- 백엔드는 정상 (94개 대화 반환)
- 프론트엔드가 페이지 로드 시 getMessages 호출 안함
- historyLoaded 플래그가 너무 일찍 true 설정
### 근본 원인
```javascript
// 문제의 코드
useEffect(() => {
if (historyLoaded) return; // user 로드 전에 실행되면 영원히 막힘
// ...
}, [isAuthenticated, user]);
```
### 해결
```javascript
// 1. 중복 체크 개선
if (messages.length > 0 && historyLoaded) return;
// 2. 로그인 확인 강화
} else if (user && isAuthenticated) {
// 3. user_id 우선순위 수정
const userId = localStorage.getItem('user_id') || user.id || 'default';
// 4. config 대기하지 않음
const batchSize = config?.message_batch_size || 30;
```
### 타이밍 문제 해결
- user가 null일 때 historyLoaded 설정 방지
- localStorage의 user_id 우선 사용
- config 로드 기다리지 않고 기본값으로 진행