---
title: "기능설명서 — 프로필 공개 대시보드/기록 (프로필 기록)"
category: "guide"
document_type: "기능설명서"
source_status: "generated"
knowledge_group: "02_specs"
priority: "Medium"
purpose: "사용자가 대시보드/기록을 저장시점 스냅샷으로 프로필에 선택 공개하는 기능의 사용법·구조·예외를 실제 구현 기준으로 정리한 기능설명서."
read_when: ["기능파악","UI작업"]
updated: "2026-06-04"
work_timestamp: "20260604_195230"
context: "달록본레포CC (D:\\dallog\\dallog_git)"
source_of_truth: "https://dallog-tools.hansbridge.co.kr/knowledge/"
---

# 기능설명서 — 프로필 공개 대시보드/기록 ("프로필 기록")

## 1. 기능명 / 한 줄 정의
**프로필 공개 대시보드/기록** — 내 대시보드(체성분·러닝·근력)와 기록을 **저장 시점 스냅샷(불변)** 으로 프로필에 선택 공개하는 기능. 공개 영역의 명칭은 "**프로필 기록**".

## 2. 위치 (관련 코드)
| 구분 | 경로 |
|---|---|
| DB | `migrations/2026-06-02_profile_publications.sql` (테이블 `profile_publications`) |
| 데이터 API | `src/lib/publications.ts` |
| 공개 모달 | `src/components/profile/PublishModal.tsx` |
| 읽기전용 대시보드 | `src/components/profile/PublicDashboardCard.tsx` |
| 읽기전용 기록 | `src/components/profile/PublicRecords.tsx` |
| 프로필 기록 관리 | `src/components/profile/ProfileRecords.tsx` |
| 프로필 페이지 | `src/pages/SocialProfilePage.tsx` |
| 공개 진입 버튼 | `src/pages/Dashboard.tsx` · `src/pages/History.tsx` |
| 섹션 readOnly | `src/components/dashboard/BodySection.tsx` · `StrengthSection.tsx` |
| 레이아웃 폭 | `src/components/Layout.tsx` (`/u/:handle` wide) |

## 3. 목적
피드 중심 프로필에, 내 운동 성과(요약·그래프·기록)를 **원하는 섹션·범위만 골라** 타인에게 보여주는 공개 채널을 제공한다. **실시간 노출이 아닌 동결 스냅샷**이라, 공개 후 원본을 수정해도 공개본은 그대로 유지된다(사용자가 직접 업데이트할 때만 갱신).

## 4. 사용 방법 (사용자 흐름)
1. **공개하기**: 대시보드 또는 기록 페이지 우상단 **"프로필에 공개"** → 모달에서 섹션(현재 탭)·**공개 범위**·(기록은)보기형식·제목 선택 → 미리보기 "공개될 기록 N건" 확인 → **공개하기**.
2. **확인**: 프로필 페이지 좌측 **"프로필 기록"** 영역에 카드 생성. **바로가기**로 펼치면 대시보드 그래프/기록이 저장 당시 그대로 표시.
3. **관리(본인)**: 카드 하단 **비공개로 ↔ 공개로 · 업데이트(현재 데이터로 재동결) · 범위 수정 · 삭제**.
4. **타인 열람**: `https://dallog.kr/u/<handle>` 로 접근(본인은 `/profile`). 공개(`is_public=true`) 카드만 읽기전용으로 노출.

### 공개 범위 옵션
전체 · 최근 1주일 · 최근 1개월 · 프로젝트 기준 · 키워드 기준 · 현재 화면 기준 · 직접 지정 기간(기록).
(체성분은 키워드 미제공, 근력은 프로젝트 개념 없음 — 섹션별로 가능한 옵션만 노출.)

### 기록 보기형식
달력 · 큰썸네일 · 주간보기(러닝 전용) · 한줄 자세히. (대시보드 공개는 요약카드+그래프 형식 고정.)

## 5. 입력 데이터
- 본인 현재 기록(`body_records`·`running_logs`·`strength_*`·`strength_daily_summary`·`exercise_configs`)을 `loadPublishSource()`로 로드 → 선택 범위로 필터 → `snapshot(jsonb)`에 **note 등 비공개 필드를 제거하고** 동결.

## 6. 출력 결과
- `profile_publications` 1행(스냅샷 + 메타). 프로필 "프로필 기록" 영역의 공개 카드(제목·섹션·종류·범위·보기형식·공개일·공개상태) + 펼침 시 대시보드 그래프/카드 또는 기록 보기.

## 7. 레이아웃
- **데스크탑**: 좌(프로필 기록) · 우(피드) 2단 병렬, 각 독립 스크롤.
- **모바일**: 병렬 금지 — "프로필 기록 / 피드" 전환형(기본 프로필 기록). 헤더 1행(프사·닉·소개 | 설정·편집) / 2행(통계 | 전환 버튼).

## 8. 연결 기능
- 소셜 프로필·피드·팔로우(기존), 대시보드 섹션 컴포넌트(readOnly 재사용), 기록 보기형식(History 마크업 재사용), 디자인 토큰/`hist-*`·`dash-*` 클래스.

## 9. 예외 상황
- **마이그레이션 미적용**: 테이블 없으면 공개 기능만 무동작(기존 기능 영향 없음).
- **프로필 비공개/팔로워만**: 타인이 `/u/<handle>` 접근 시 "프로필을 찾을 수 없어요"(profiles RLS). 전체공개여야 외부 노출.
- **범위 내 기록 0건**: 모달에서 공개 버튼 비활성("해당 범위에 기록이 없어요").
- **타인 화면**: 관리 버튼 미표시, 공개본만 노출(RLS), 메모 등 비공개 필드 비포함.
- **스냅샷 불변**: 원본 수정해도 공개본 불변 — 갱신은 "업데이트" 클릭 시에만.

## 10. 보안 요약
- RLS: 공개본은 누구나 SELECT, 비공개본·쓰기는 본인만. 마스터 우회 없음.
- 스냅샷 빌드 시 비공개 필드(note) 제거. 삭제된 원본 데이터는 스냅샷에 남지 않음(저장 시점 기준).
