---
title: "기능설명서 — AI에게 보내기"
category: "guide"
parent: "달록 개발 현황"
document_type: "spec"
source_status: "generated"
knowledge_group: "02_specs"
priority: "Medium"
purpose: "내 운동·체성분 기록 전체를 AI 코칭용 마크다운으로 자동 정리해 클립보드에 복사하는 '✦ AI에게 보내기' 기능설명서. 현재 ccy8215 전용, 복사→사용자 붙여넣기 반자동 구조."
read_when: ["기능파악","AI브리프·코칭"]
updated: "2026-06-04"
source_of_truth: "https://dallog-tools.hansbridge.co.kr/"
---

# 달록 기능설명서 — "AI에게 보내기"

| 항목 | 내용 |
|---|---|
| 기능명 | AI에게 보내기 |
| 작성일 | 2026.06.04 |
| 상태 | 운영 중 (현재 `ccy8215@gmail.com` 전용) |
| 분류 | 기능설명서 |
| 관련 코드 | `src/lib/aiHandoff.ts`, `src/components/Layout.tsx`, `src/pages/Settings.tsx`, `src/components/demo/AISendButton.tsx` |

---

## 1. 한 줄 정의

> 내 운동·체성분 기록 전체를 **AI가 코칭 브리프를 써 줄 수 있는 형태(마크다운)로 자동 정리해서 클립보드에 복사**해 주는 기능.

흩어져 있는 기록을 AI(Claude·ChatGPT 등)에게 한 번에 붙여넣기 좋도록 "보고서 한 장"으로 묶어 주는 버튼이다. 버튼이 직접 AI를 호출하지 않고, **복사 → 사용자가 AI 사이트에 붙여넣기** 흐름으로 동작한다.

> 비개발 해설 — 평소 캘린더·기록에 흩어져 있던 체성분·러닝·근력 데이터를 "AI에게 물어보기 딱 좋은 한 장짜리 보고서"로 자동으로 만들어 복사해 주는 기능이다. 복사된 내용을 Claude나 ChatGPT 창에 붙여넣으면 곧바로 코칭 브리프를 받아볼 수 있다.

---

## 2. 접근 권한 (현재 본인 전용인 이유)

현재는 사장님 본인 계정에만 버튼이 보이도록 제한돼 있다. 구현은 단순 이메일 일치 검사다.

- `const OWNER_EMAIL = 'ccy8215@gmail.com'` (`Layout.tsx`, `Settings.tsx`)
- `const isOwner = user?.email === OWNER_EMAIL`
- 버튼은 `{isOwner && (...)}` 조건으로만 렌더링 → 다른 사용자에겐 **버튼 자체가 화면에 나타나지 않음**

> 비개발 해설 — 이건 "서버에서 막는 보안 차단"이 아니라 "UI에서 버튼을 숨기는" 방식이다. 본인 데이터만 복사하는 기능이라 위험은 없으나, 향후 다른 사용자에게 열어 줄 때는 이메일 하드코딩 대신 권한 플래그로 전환하는 것이 깔끔하다.

---

## 3. 버튼 위치 (3곳)

| 위치 | 파일 | 비고 |
|---|---|---|
| 상단 헤더 | `Layout.tsx` | |
| 데스크탑 사이드바 하단 | `Layout.tsx` | 축소 시 `✦` 아이콘만 표시 |
| 설정 페이지 | `Settings.tsx` | `✦ AI에게 보내기` 라벨 |

> 데모 모드에서는 별도 컴포넌트 `AISendButton.tsx` 가 사용되며, 이때만 복사 후 자동으로 `claude.ai` 새 탭을 열어 준다.

---

## 4. 동작 흐름

```
버튼 클릭
  └→ handleSendToAI() 실행
       └→ buildAIHandoffMarkdown()  ── Supabase에서 내 기록 6종 조회
            └→ 마크다운 한 장으로 조립
       └→ navigator.clipboard.writeText(마크다운)  ── 클립보드 복사
            └→ (실패 시) document.execCommand('copy') 로 재시도
  └→ "복사 완료" 알림
  └→ 사용자가 직접 Claude.ai / ChatGPT 등에 붙여넣기
```

핵심 함수는 `src/lib/aiHandoff.ts` 의 `buildAIHandoffMarkdown()` 이다.

> 비개발 해설 — 버튼은 **AI를 호출하지 않는다.** 내 데이터를 깔끔히 정리해 클립보드에 담아주는 데까지가 역할이고, 실제로 AI에게 물어보는 것은 사용자가 AI 창에 Ctrl+V 로 붙여넣어 진행한다. (반자동 구조)

---

## 5. AI에게 보내는 데이터 (6개 섹션)

`buildAIHandoffMarkdown()` 이 Supabase 여러 테이블을 한 번에 조회해 마크다운으로 묶는다.

| # | 섹션 | 출처 테이블 |
|---|---|---|
| ① | 체성분 (체중·골격근·체지방·체지방률·BMR) | `body_records` |
| ② | 러닝 (거리·페이스·BPM·케이던스 등) | `running_logs` |
| ③ | 근력 (운동명·세트·무게·반복) | `strength_logs` 외 |
| ④ | 최근 코칭 브리프 전문 1건 | `coach_notes` (category='brief') |
| ⑤ | 개인 메모 | `app_settings` (personal_memo) |
| ⑥ | AI 브리프 지침 (훈련철학·부상·식이 등) | `app_settings` (ai_brief_instructions) |

마지막에 지시문이 붙는다.

```
위 데이터를 기반으로 종합 코칭 브리프를 작성해줘.
```

> 데이터 수집 기간: 현재 빌더는 **전체 기간**의 기록을 정렬해 담는다. (그동안 30일 등으로 여러 차례 테스트 후, 사장님 요청에 따라 최종 전체 기간으로 확정됨.)

---

## 6. 적용 기술

| 영역 | 사용 기술 |
|---|---|
| UI | React 조건부 렌더링 (`{isOwner && ...}`) |
| 복사 | `navigator.clipboard.writeText()` + `document.execCommand('copy')` 폴백 |
| 데이터 | Supabase 클라이언트 직접 조회, `Promise.all` 병렬 처리 |
| 포맷 | 마크다운 테이블 + 구조화 텍스트 |
| (보조) AI 직접호출 경로 | `src/lib/claude.ts` — CF Worker 프록시 `dallog-brief-proxy` 경유. 기본 `gpt-5.4-mini`, 폴백 `claude-sonnet-4`. 단, "AI에게 보내기" 버튼은 이 경로를 쓰지 않고 클립보드 복사만 수행 |

---

## 7. 정리

"AI에게 보내기"는 **내 운동 기록 6종을 AI용 마크다운 보고서로 자동 조립 → 클립보드 복사**하는 기능이다. 현재는 `user.email === 'ccy8215@gmail.com'` 검사로 본인에게만 버튼이 노출되며, AI 호출은 버튼이 아니라 사용자가 직접 붙여넣어 수행하는 반자동 구조다. 완전 자동 호출 버전은 [기능설명서 — AI 브리프](#/doc/spec-doc-92) 참조.

---

## 별첨: 알려진 후속 과제

- 설정 페이지 안내 문구가 "최근 30일" 기준으로 남아 있으나 실제 빌더는 전체 기간을 사용한다. **문구만 미갱신**된 상태이며, 안내 문구를 실제 동작(전체 기간)에 맞춰 수정하는 작업이 별도로 필요하다. (코드 동작은 정상)
