---
title: "작업보고 — 코치챗 붙여넣기 글자 우선 처리(엑셀 셀 OCR 깨짐 차단) + .mcp.json gitignore + go_work spec 문서 최신화 (PR#86)"
category: "workreport"
document_type: "작업보고"
source_status: "generated"
knowledge_group: "03_history"
priority: "Medium"
purpose: "코치챗에서 엑셀 셀을 복사해 붙여넣을 때 클립보드에 글자가 함께 실려 OCR이 숫자·기호를 깨먹던 문제를, 글자가 있으면 OCR을 우회하고 그대로 붙여넣도록 분기 처리한 수정을 풀 깊이로 기록한다. 함께 묶인 보안 조치(.mcp.json gitignore 추가로 MCP 토큰 보호 + 권한 설정 갱신)와 코치 spec01~06 로컬 작업 문서 최신화까지 PR#86 머지 1건의 전체 맥락을 복원해 향후 회귀·재발 방지와 의사결정 추적의 근거로 삼는다."
read_when: ["코치챗","붙여넣기","OCR","엑셀셀","보안","gitignore","최신상태복구"]
updated: "2026-06-12"
work_timestamp: "20260612_110700"
context: "달록본레포CC (D:\\dallog\\dallog_git) — 코치챗 붙여넣기 글자우선 처리(PR#86) 작업보고"
source_of_truth: "https://dallog-tools.hansbridge.co.kr/knowledge/"
---

# 작업보고 — 코치챗 붙여넣기 글자 우선 처리(엑셀 셀 OCR 깨짐 차단) + 보안·문서 최신화 (PR#86)

> **이 문서가 무엇인가 (비개발자용 한 줄 설명)**
> 코치챗 입력창에 엑셀 칸을 복사해서 붙여넣으면, 컴퓨터가 그 칸을 "사진"으로 오인해 글자를 잘못 읽어버리던(예: 딥스10 → E210) 문제를 고친 작업이다. 이제는 붙여넣은 내용에 **진짜 글자(text/plain = 글자 데이터)**가 있으면 사진 인식(OCR = 이미지에서 글자 뽑아내기)을 건너뛰고 글자를 그대로 넣고, **그림밖에 없는 진짜 화면 캡처일 때만** OCR을 돌린다. 여기에 더해 MCP 토큰이 든 설정 파일을 git 추적에서 빼는(gitignore = git 추적 제외) 보안 조치와, 코치 작업 메모 문서 최신화를 함께 묶었다.

---

## 1. 무엇을 했나 (요약)

PR#86(머지 커밋 `15730d4`, 2026-06-12 11:08)은 서로 독립적인 3개 커밋을 하나로 묶은 머지다. 핵심은 **①** 코치챗 붙여넣기 로직 수정이고, **②·③**은 함께 정리된 보안·문서 작업이다.

| # | 커밋 | 시각 | 한 줄 요약 | 변경 파일 |
|---|---|---|---|---|
| ① | `02aba61` | 11:07 | 붙여넣기 글자 우선 처리로 엑셀 셀 OCR 깨짐 차단 | `src/components/coach/CoachChatPanel.tsx` (+9/-3) |
| ② | `6437a77` | 11:07 | `.mcp.json` gitignore 추가(토큰 보호) + 권한 설정 갱신 | `.claude/settings.json` (+4/-1), `.gitignore` (+3) |
| ③ | `a8efd6f` | 11:07 | 코치 spec 작업일지·핸드오프 최신화(로컬 작업 메모) | `docs/go_work/` 9파일 (+1172/-469) |

머지 통계 합계는 12파일·+1187/-473 다.

---

## 2. 왜 이 작업이 필요했나 (배경)

직전까지 코치챗에는 **이미지 붙여넣기 → OCR 첨부** 경로가 이미 들어 있었다(첨부 입력 확장 PR#49·#58). 사용자가 운동 기록 화면을 캡처해 붙여넣으면 그림에서 글자를 뽑아 코치에게 전달하는 흐름이다.

그런데 문제가 하나 있었다. **엑셀 셀을 복사**하면 클립보드(복사한 내용을 잠시 담아두는 공간)에 두 가지가 **동시에** 실린다.

- `text/plain` = 셀 안의 진짜 글자 데이터 (예: `딥스 10`)
- `image/*` = 그 셀을 화면에 그린 모습을 찍은 그림 한 장

기존 붙여넣기 로직은 클립보드 항목을 훑다가 **이미지가 보이면 무조건 OCR 경로**로 보냈다. 그 결과 멀쩡한 글자가 클립보드에 있는데도, 굳이 그림을 OCR로 다시 읽어 `딥스10`이 `E210`처럼 깨지는 일이 발생했다. **있는 글자를 두고 그림을 잘못 읽는** 비효율과 오류가 동시에 났다.

---

## 3. 문제 (증상)

- 엑셀 셀을 복사해 코치챗 입력창에 붙여넣으면 OCR이 글자를 잘못 인식(예: `딥스10` → `E210`).
- 사용자는 정확한 텍스트를 복사했는데도 깨진 결과가 들어가, 코치 답변 품질이 떨어지고 다시 손으로 고쳐 써야 했다.

## 4. 원인 (근본 원인)

붙여넣기 핸들러 `onPaste`가 **클립보드에 글자가 함께 있는지 먼저 확인하지 않고**, 이미지 존재 여부만 보고 OCR 첨부 경로로 분기한 것이 근본 원인이다. 엑셀 셀처럼 글자 + 그림이 함께 오는 케이스를 고려하지 않은 설계 누락이다.

## 5. 해결 (수정 내용)

`src/components/coach/CoachChatPanel.tsx`의 `onPaste`에 **글자 우선(text-first) 분기**를 추가했다. 핵심은 단 한 줄의 가드다.

```tsx
const onPaste = (e: ClipboardEvent<HTMLTextAreaElement>) => {
  const dt = e.clipboardData
  if (!dt) return
  // 글자가 함께 들어오면(엑셀 셀·표·일반 텍스트) 기본 붙여넣기로 통과시켜 OCR을 거치지 않는다.
  if (dt.getData('text/plain').trim()) return
  const imgs: File[] = []
  for (const it of Array.from(dt.items ?? [])) {
    if (it.kind === 'file' && it.type.startsWith('image/')) {
      const f = it.getAsFile()
      if (f) imgs.push(f)
    }
  }
  // ...(이하 기존 OCR 첨부 경로 유지)
}
```

**동작 원리**

- 클립보드에 `text/plain`(글자)이 조금이라도 있으면 → `return`으로 즉시 빠져나가 브라우저 기본 붙여넣기에 맡긴다. OCR을 아예 거치지 않으므로 글자가 깨질 여지가 없다.
- `text/plain`이 비어 있고 **그림만** 있을 때(진짜 스크린샷) → 기존 OCR 첨부 경로를 그대로 탄다.

주석도 의도가 드러나게 보강했다(엑셀 셀은 글자+그림이 함께 담긴다는 설명, `딥스10→E210` 같은 인식 깨짐을 원천 차단한다는 의도). 변경량은 +9/-3로 외과수술급이며, 기존 OCR 경로(스크린샷용)는 손대지 않았다.

---

## 6. 함께 묶인 보안·문서 작업

### 6-1. `.mcp.json` gitignore 추가 (커밋 ②, 토큰 보호)

`.mcp.json`에는 Supabase MCP의 **PAT(개인 액세스 토큰 = 사실상 비밀번호급 자격증명)**가 들어간다(맥락: [[reference_supabase_mcp]]). 이 파일이 실수로 git에 커밋되면 토큰이 이력에 영구 박제될 위험이 있어, `.gitignore`에 추가해 **git 추적에서 원천 제외**했다.

```gitignore
# MCP 로컬 설정 (PAT 토큰 포함 — 절대 커밋 금지) — 2026.06.11 추가
.mcp.json
```

함께 `.claude/settings.json`의 권한 허용 목록에 wrangler 배포 명령을 추가했다(배포 자율성 정책 반영, [[feedback_deploy_autonomy]] 맥락).

```json
"mcp__claude_ai_Google_Drive__download_file_content",
"Bash(npx wrangler deploy:*)",
"Bash(wrangler deploy:*)"
```

### 6-2. 코치 spec01~06 작업 문서 최신화 (커밋 ③, 로컬 메모)

`docs/go_work/`의 핸드오프·작업일지 9개 파일을 최신 상태로 갱신했다(+1172/-469). 이것은 **본레포 로컬의 작업 메모**이며 달록KB(SoT) 업로드 대상이 아니다.

| 파일 | 성격 |
|---|---|
| `handoff_spec01_to_spec02.md` / `handoff_spec02_to_spec03.md` / `handoff_spec04_to_spec05.md` / `handoff_spec05_to_spec06.md` | spec 단계 간 핸드오프 |
| `worklog_spec01_foundation.md` / `worklog_spec02_data_injection.md` / `worklog_spec04_storage_privacy.md` / `worklog_spec05_plan_billing.md` / `worklog_spec06_frontend_ux.md` | 코치 spec 단계별 작업일지 |

이 문서들은 코치노트 멀티턴 대화 기능 설계·구현 흐름의 로컬 기록이다([[project_coachnote_chat_design]] 맥락).

---

## 7. Codex 검토 반영 결과

본 작업은 클립보드 분기 한 줄 가드 추가와 gitignore·문서 정리 위주의 저위험 변경으로, 별도 Codex 정식 검수 라운드를 돌리지 않았다. 수정 자체가 "글자 있으면 통과(early return)"라는 단순·국소 분기이고 기존 OCR 경로를 건드리지 않아 회귀 표면이 작다. 향후 첨부 입력 경로를 추가로 손댈 때는 [[feedback_codex_review_handling]] 기준에 따라 검수 협업을 적용한다.

---

## 8. 결과

- ✅ 엑셀 셀 복사 → 코치챗 붙여넣기 시 글자가 OCR 없이 그대로 입력된다(`딥스10→E210` 류 깨짐 차단).
- ✅ 진짜 스크린샷(그림만) 붙여넣기는 기존 OCR 첨부 경로 그대로 유지된다(기능 회귀 없음).
- ✅ `.mcp.json`이 git 추적에서 제외되어 MCP PAT 토큰 누출 경로가 차단됐다.
- ✅ wrangler 배포 명령 권한 등재로 배포 자율 흐름이 정비됐다.
- ✅ 코치 spec 작업 문서 9건이 최신 상태로 정리됐다.
- ✅ PR#86으로 머지 완료(`15730d4`, 2026-06-12 11:08).

## 9. 미해결 / 후속

- **텍스트+이미지 혼합 의도 케이스** — 사용자가 일부러 글자와 그림을 함께 붙여 둘 다 활용하길 원하는 경우, 현재 로직은 글자 우선으로 그림을 버린다. 실사용에서 이 패턴 요구가 나오면 별도 분기를 검토한다(현재는 엑셀 셀 오인식 차단이 우선이라 의도된 트레이드오프).
- **OCR 인식 정확도 자체** — 진짜 스크린샷의 OCR 품질 개선은 본 작업 범위 밖이며 별도 과제로 남는다.
- 코치 spec 후속 단계 작업은 `docs/go_work` 로컬 메모 기준으로 이어간다([[project_coachnote_chat_design]]).

---
