# Reflect Backlink System Walkthrough

Reflect.app의 핵심 철학인 "네트워크형 노트"를 구현하기 위해 **WikiLink 추출 및 백링크 집계 시스템**을 구축했습니다.

## 주요 구현 사항

### 1. WikiLink 실시간 추출 로직
문서 저장 시 본문(Markdown)에서 `[[WikiLink]]` 및 표준 Markdown 링크 `[Label](/docs/ID)`를 자동으로 추출하여 Firestore의 `outgoingLinks` 및 `outgoingLinkIds` 필드에 배열로 저장합니다.

- **추출 도구**: `src/lib/markdown.ts`의 `extractWikiLinks` 함수
- **저장 방식**: Firestore Transaction을 통한 원자적 업데이트 및 버전업(Optimistic Locking)

### 2. Linked & Unlinked Mentions UI
문서 하단에 현재 문서를 참조하고 있는 다른 문서들의 목록을 보여주는 `BacklinksPanel`을 대폭 개선했습니다.

- **Linked Mentions**: ID 기반 또는 제목 기반의 명시적 링크(`[[ ]]`)를 집계합니다.
- **Unlinked Mentions**: 본문 내의 일반 텍스트가 문서 제목과 일치하는 경우를 `searchKeywords`를 통해 자동으로 찾아냅니다. 
- **UI 디자인**: 깔끔한 섹션 구분과 본문 요약(Line-clamp) 기능을 포함합니다.

### 3. Phantom Document (유령 문서) 지원
아직 생성되지 않은 문서를 [[링크]] 하더라도, 해당 링크를 클릭했을 때 오류가 아닌 **"Linked Mentions" 요약 페이지**를 보여줍니다. 사용자는 여기서 바로 편집 버튼을 눌러 실제 문서를 생성할 수 있습니다.

## 적용된 파일 일람

- [firestore.ts](file:///c:/Users/drumb/.gemini/antigravity/scratch/InsuWiki/nextapp/src/types/firestore.ts): `outgoingLinks`, `outgoingLinkIds`, `version` 필드 추가
- [markdown.ts](file:///c:/Users/drumb/.gemini/antigravity/scratch/InsuWiki/nextapp/src/lib/markdown.ts): 링크 추출 및 토크나이징 유틸리티 고도화
- [BacklinksPanel.tsx](file:///c:/Users/drumb/.gemini/antigravity/scratch/InsuWiki/nextapp/src/components/BacklinksPanel.tsx): Linked/Unlinked 멘션 지원 UI
- [page.tsx](file:///c:/Users/drumb/.gemini/antigravity/scratch/InsuWiki/nextapp/src/app/docs/[id]/page.tsx): 저장 트랜잭션 및 유령 문서 렌더링 로직 통합

## 향후 과제
- [ ] 브라우저 테스트를 통한 백링크 쿼리 성능 검증
- [ ] 대소문자 구분 없는 링크 매칭 (현재는 정확한 제목 일치 필요)
- [ ] 비정규화된 제목 정보를 업데이트하기 위한 Cloud Functions 도입 고려

🤖 Generated with [Claude Code](https://claude.com/claude-code)
