# task-1181.1 완료 보고서: InsuWiki My 탭 카드 미노출 원인 조사

## SCQA

**S**: InsuWiki의 "나만의AI 비서작업" 문서(ID: `iZE2qBM8Ztc6hUCGN5MT`)는 전종혁(제이회장님, UID: `HZbEbrneWOSjfyXtc4OdzZCUQlX2`) 소유의 문서로, 현재 visibility=`private`, docType=`wiki`, isDeleted=미설정, category=`practice` 상태이다. Firestore 복합 인덱스(authorId+updatedAt DESC)도 정상 배포되어 있다.

**C**: 제이회장님이 My 탭에서 해당 카드를 발견하지 못했다. 그러나 현재 Firestore 데이터 조회 결과, 문서의 모든 필드값은 My 탭 표시 조건을 충족한다. 작업 지시서에는 "약 3주 전 수정"이라 기재되어 있으나, 실제 updatedAt은 `2026-03-28T08:07:56.175Z`(오늘)이며 version=7이다. 이 시간 불일치는 최근 누군가가 문서를 편집(가능성: visibility를 public→private으로 변경)했음을 시사한다.

**Q**: My 탭에서 노출되지 않았던 정확한 원인은 무엇이며, 현재 수정 필요 사항이 있는가?

**A**: 근본 원인은 **문서의 visibility가 'public'이었을 가능성이 가장 높다** (확률 90%). My 탭 필터(`page.tsx:153`)는 `visibility === 'private'`을 엄격히 요구하므로, public 문서는 Wiki 탭으로 분류된다. 검색은 `authorId === user.uid`이면 visibility 무관하게 표시하므로 검색에서는 발견 가능했다. 현재 상태에서는 My 탭에 정상 표시되어야 하며, 브라우저 새로고침 후 확인 권장. 추가로 limit(50) 잠재 이슈와 검색 쿼리 보안 규칙 미준수 이슈 2건 발견.

---

## 1. Firestore 문서 현재 상태

| 필드 | 값 | My 탭 조건 충족 |
|---|---|---|
| `id` | `iZE2qBM8Ztc6hUCGN5MT` | — |
| `title` | 나만의AI 비서작업 | — |
| `visibility` | `private` | ✅ (`=== 'private'` 필요) |
| `docType` | `wiki` | ✅ (`!== 'daily'` 필요) |
| `isDeleted` | 미설정 (undefined) | ✅ (falsy → 필터 통과) |
| `authorId` | `HZbEbrneWOSjfyXtc4OdzZCUQlX2` | ✅ (제이회장님 UID 일치) |
| `authorName` | 전종혁 | — |
| `category` | `practice` | — |
| `updatedAt` | `2026-03-28T08:07:56.175Z` | ✅ (최신 → limit(50) 내 1번째) |
| `version` | 7 | — |
| `status` | `draft` | — |

---

## 2. My 탭 미노출 원인 분석

### 가설 1 (최유력, 90%): visibility가 'public'이었음

**코드 근거** (`nextapp/src/app/page.tsx:150-156`):
```javascript
// My 탭 필터 (라인 153)
if (activeTab === 'my') return doc.visibility === 'private'
    && doc.authorId === user?.uid
    && doc.docType !== 'daily';

// Wiki 탭 필터 (라인 152)
if (activeTab === 'wiki') return doc.visibility === 'public' || !doc.visibility;
```

- `visibility === 'public'`인 문서 → Wiki 탭에만 표시, My 탭에서 제외
- 검색 필터(`SearchModal.tsx:110-113`)는 `visibility === 'public' || authorId === user.uid`이므로 본인 문서는 visibility 무관하게 검색됨
- **증거**: updatedAt이 오늘로 변경됨 (작업 지시서의 "약 3주 전 수정"과 불일치) → 최근 편집으로 visibility 변경 가능성
- **미확인**: 버전 이력 서브컬렉션(`versions/`)이 비어 있어 직접 확인 불가

### 가설 2 (가능성 낮음, 5%): 카테고리 필터 선택 상태

My 탭에도 카테고리 필터(전체/의료/손해/자산/실무)가 존재한다(`page.tsx:322-343`). 문서의 category는 `practice`(실무)이므로, "의료"나 "손해" 등 다른 카테고리가 선택되어 있으면 미노출된다. 기본값은 `all`이므로 일반적 상황에서는 해당 없음.

### 가설 3 (가능성 낮음, 5%): 브라우저 캐시/미새로고침

문서 목록은 `useEffect(() => { fetchDocuments(); }, [user]);`로 user 변경 시에만 자동 로드된다. 문서 수정 후 대시보드에서 수동 새로고침 버튼을 누르지 않으면 이전 데이터가 유지될 수 있다.

---

## 3. 검색에서 찾아지는 이유

**검색 데이터 로드** (`SearchModal.tsx:102-103`):
```javascript
const q = query(docsRef, orderBy('updatedAt', 'desc'), limit(500));
```

**검색 접근 필터** (`SearchModal.tsx:110-113`):
```javascript
const accessibleDocs = docs.filter(doc =>
    (doc.visibility === 'public' || doc.authorId === user.uid) && !doc.isDeleted
);
```

검색은 **visibility 무관하게 본인 문서를 포함**한다(`authorId === user.uid`). 따라서 문서가 public이든 private이든 검색 결과에 노출된다. 반면 My 탭은 `visibility === 'private'`만 허용하므로, public 문서는 검색에는 보이지만 My 탭에는 안 보이는 현상이 발생한다.

---

## 4. 수정 방안 (실제 수정 미수행)

### 즉시 확인 (수정 불필요 가능성)
현재 Firestore 데이터는 정상(visibility=private)이므로, **브라우저에서 페이지 새로고침** 후 My 탭 확인. 이미 정상 노출될 가능성이 높다.

### 근본 개선 (코드 수정 권장 — 3건)

**이슈 A: limit(50) 잠재 문서 누락 (중요도: 높음)**
- 작성자 문서 90개 중 50개만 fetch → 클라이언트 필터링 후 My 탭에 약 31개만 표시
- 52개 My 탭 후보 중 21개가 누락되는 상태
- 수정안: `limit(50)` → `limit(100)` 또는 무한 스크롤/페이지네이션 도입

**이슈 B: 검색 쿼리 Firestore 보안 규칙 미준수 (중요도: 높음)**
- `SearchModal.tsx:103`의 쿼리가 where 절 없이 전체 컬렉션 조회
- 다른 사용자의 private 문서 78개가 쿼리 범위에 포함되어 Firestore 보안 규칙 위반 가능성
- 보안 규칙은 `isPublic() || isAuthor()` 조건 필요하나 쿼리에 해당 필터 없음
- 수정안: 쿼리를 2개로 분리 (public 쿼리 + 본인 문서 쿼리) — page.tsx와 동일 패턴 적용

**이슈 C: My 탭에 public 본인 문서 미노출 (중요도: 중간)**
- 본인이 작성한 공개 문서도 My 탭에서 관리할 수 있어야 하나, 현재 `visibility === 'private'` 조건으로 제외됨
- 수정안: My 탭 필터를 `doc.authorId === user?.uid && doc.docType !== 'daily'`로 변경 (visibility 조건 제거)

---

## 발견 이슈 및 해결

### 자체 해결 (0건)
조사 전용 작업이므로 코드 수정 없음.

### 범위 외 미해결 (3건)
1. **limit(50) 문서 누락** — 범위 외 사유: 조사 작업으로 코드 수정 지시 없음. 별도 개선 작업 필요.
2. **검색 쿼리 보안 규칙 미준수** — 범위 외 사유: 검색 리팩토링은 별도 작업 범위.
3. **My 탭 public 본인 문서 미노출** — 범위 외 사유: UX 정책 결정 필요.

---

## 셀프 QC

- [x] 1. 다른 파일 영향: 없음 (조사만, 코드 미수정)
- [x] 2. 엣지 케이스: visibility 미설정 문서 → Wiki 탭으로 분류 (코드 확인)
- [x] 3. 작업 지시와 정확히 일치: Firestore 필드 상태, 원인, 검색 이유, 수정 방안 모두 포함
- [x] 4. 에러 처리/보안: 검색 쿼리 보안 규칙 미준수 이슈 발견 및 보고
- [x] 5. 테스트 커버리지: N/A (조사 작업)
- [x] 6. 이슈 해결: 3건 모두 범위 외 사유 명시
- [x] 7. 아키텍처 원칙: N/A (코드 미수정)
- [x] 8. 인터페이스 변경: N/A (코드 미수정)

## 산출물

- `/home/jay/workspace/memory/reports/task-1181.1.md`
