# [[ 자동완성 미작동 원인 파악 및 수정 회의 결과

> **일시**: 2026-02-23 11:04  
> **참석자**: PM, Frontend, QA, UX  
> **안건**: `[[` 위키링크 자동완성이 기존 문서를 추천하지 않는 문제 원인 파악 및 수정

---

## 1. 문제 현상 (재확인)

사용자 스크린샷으로 확인된 정확한 증상:
- `[[누수플` 입력 시 **"누수플랜"** 문서가 추천 목록에 전혀 뜨지 않음
- **"Create new: 누수플"** 항목만 표시됨
- "누수플랜"은 Wiki 탭에 실제로 존재하며 내용도 있는 문서임

---

## 2. 근본 원인 분석

### 원인 1: `wikiMap` stale 캐시 (가장 유력)
- `useWikiMap.ts`는 마운트 시 최초 fetch 후 5분 폴링으로만 갱신됨
- 에디터가 열리는 시점에 wikiMap이 아직 로딩 중이거나, 최근 생성된 문서가 캐시에 없는 경우 목록 누락
- `wiki-updated` 이벤트로 갱신되지만 동일 페이지 편집 중일 때는 이벤트가 발화되지 않을 수 있음

### 원인 2: content 동기화 useEffect가 `[[` 팝업 강제 종료
- `ReflectEditor.tsx`의 두 번째 useEffect: `content !== currentContent`이면 `setContent()` 호출
- `setContent()`는 ProseMirror 문서 전체를 교체 → Suggestion 플러그인이 초기화되어 팝업이 사라짐
- 부모 컴포넌트가 리렌더링되는 상황(예: 저장 중)에서 이 effect가 발동하면 팝업이 날아감

### 원인 3: `WikiAutoLink.ts` 한글 미지원 `\b` 정규식
- `\bTitle\b` 패턴은 ASCII 기반 word boundary만 인식 (한글 미지원)
- 한글 제목에 대해 잘못된 위치에 decoration 생성 → ProseMirror 트랜잭션 과부하 및 suggestion 타이밍 충돌

---

## 3. 수정 내역

### Fix 1: `ReflectEditor.tsx` - 마운트 시 강제 refresh
```tsx
// 마운트 시 wikiMap을 강제로 최신화 (stale 캐시 방지)
useEffect(() => {
    refresh();
}, []);
```

### Fix 2: `ReflectEditor.tsx` - suggestion 활성 중 setContent 차단
```tsx
const suggestionPluginKey = (editor.state as any).plugins?.find(
    (p: any) => p?.key?.key?.startsWith?.('Suggestion')
);
const isSuggestionActive = !!suggestionPluginKey?.getState?.(editor.state)?.active;
if (!isSuggestionActive) {
    editor.commands.setContent(content);
}
```

### Fix 3: `WikiAutoLink.ts` - 한글 정규식 교체
```ts
const escaped = title.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
const regex = new RegExp(`(?<![\\w가-힣ㄱ-ㅎ])${escaped}(?![\\w가-힣ㄱ-ㅎ])`, 'gi');
```

---

## 4. 검증

- **빌드**: `✓ Compiled successfully in 18.1s` (TypeScript 에러 없음)
- **커밋**: `6910e29`
- **수동 검증**: 사용자가 `[[누수플` 입력 후 "누수플랜" 추천 여부 확인 필요
