---
title: "📋 작업보고 — 데이터 관리 (엑셀 백업 내보내기 / 표준양식 가져오기)"
category: "report"
parent: "Claude Code 작업보고"
updated: "2026-07-04"
priority: "High"
purpose: "설정 > 계정설정에 추가된 데이터 백업/복원 기능. 기록을 엑셀(.xlsx)로 내보내 백업하고, 달록 표준 양식으로 작성한 엑셀을 검증·가져오기하는 기능의 산출·검증·배포 보고. AI 전달용 Markdown 기능과 완전 분리된 별도 경로. (2026-07-04 갱신: 가져오기 파서 유연화 A+C 반영.)"
read_when: ["기록 내보내기","기록 가져오기","엑셀 백업","xlsx 가져오기","데이터 관리 패널","표준 양식","인식 결과 3구분","dataBackup","헤더 별칭 매핑","컬럼순서 무관","CSV 가져오기","파서 유연화"]
document_type: "작업보고"
source_status: "generated"
knowledge_group: "03_history"
work_timestamp: "20260702_204702"
source_of_truth: "https://dallog-tools.hansbridge.co.kr/knowledge/"
context: "달록본레포CC (D:\\dallog\\dallog_git)."
---

> 대상 브랜치 `phase1-release` → `main`·`demo`. 설계 결정(내보내기≠가져오기 컬럼·근력 그룹핑·중복 3구분·D1~D5)은 [의사결정] "데이터 관리 설계결정" 참조.

## 1. 배경
사장님 지시로 설정 > 계정설정에 엑셀 백업/가져오기 추가. 기존 "AI에게 보내기"(Markdown 클립보드 복사)와 목적이 다름 → **패널 레이아웃 골격만 참고**하고 AI 고유요소(제목·markdown 복사·부가영역 그룹)는 배제. 자유양식 자동해석은 이번 범위 제외(표준 템플릿만 허용).

## 2. 기록 내보내기 (백업 목적 — 최대 보존)
- `DataExportPanel`: 기간(전체/최근4주/최근3개월/사용자지정) + 영역(체성분/러닝/근력) 선택 → **달록 보유 주요 필드 최대 보존** xlsx(최소 3시트) 다운로드.
- 내보내기 컬럼은 가져오기 양식과 **분리**(사장님 D3 확정): 러닝은 달린시각·페이스·런타입·신발·거리반영까지, 근력은 세트번호·추가중량·추가사용까지 포함. 근력은 세트별 1행(set_index 순서 보존).
- 백업 전용 조회 함수 신설(기존 `exerciseData` 미변경 — 시각 컬럼 미select 문제 회피).

## 3. 기록 가져오기 (사용자 입력 편의 — 간소 양식)
- `DataImportPanel`: [양식 다운로드](간소 표준 3시트) → [파일 업로드] → 파싱·검증 → **인식 결과(신규 / 중복 의심 / 오류 3구분)** → 중복 의심 포함 여부 확인 → [적용하기](오류 0일 때만 활성).
- 가져오기 표준양식(지시 5번, 간소): 체성분(날짜/체중/골격근량/체지방률/메모)·러닝(+평균심박/최대심박/케이던스/칼로리)·근력(날짜/시각/루틴명/종목/중량/횟수/세트수/메모).
- **검증**: 필수값·날짜형식·숫자형식·음수·미래날짜·시각(M:SS 초<60·AM/PM·엑셀 serial·Date)·불가능한 날짜(2026-02-31 등). 오류행은 등록 제외.
- **근력 세션 그룹핑**: 날짜+운동시각+루틴명이 같으면 한 세션(strength_logs), 각 행=종목, 세트수만큼 동일 reps/weight 세트. 중량 공란=맨몸(0 강제 금지).
- **중복 판정**: 파일 내부 중복 + 기존 DB 중복(체성분=날짜, 러닝=날짜+시각, 근력=날짜+시각+루틴).
- **적용**: 검증된 `recordSave.saveProposals` 재사용(체성분 upsert·러닝/근력 insert·strength cascade+보상삭제·근력 메모 저장 추가).

## 4. 검증
- **Codex 사전컨펌**(착수 전 설계 검토) + **사후 복수검수**: 즉시반영 3(DB 중복조회 error·parseClock serial/PM·불가능 날짜 차단), 검토후반영 3(parseDuration serial·근력 메모 유실) 반영. 반려 5(오탐).
- Playwright 실측: 테스트 xlsx(정상·오류·중복 섞음) 업로드 → 인식 결과 **신규 4 / 중복 의심 1 / 오류 1**(13월 날짜 "존재하지 않는 날짜" 차단 확인).
- 빌드 GREEN · 가드 3/3.

## 5. 배포
`main` fd45ced(dallog.kr) · `demo` dea15c6 · `phase1-release` f8765c7. CF 라이브 번들 교체 실측(dbk-manage 코드 등장). xlsx 라이브러리는 기설치 `xlsx@0.18.5`(SheetJS).

## 6. 파일
- `src/lib/dataBackup.ts`(조회·xlsx생성·템플릿·파싱·검증·중복판정), `src/components/DataExportPanel.tsx`·`DataImportPanel.tsx`, `src/pages/Settings.tsx`(버튼·패널 연결), `src/index.css`(.dbk-*), `src/lib/coachChat/recordTools.ts`·`recordSave.ts`(근력 note 추가).

## 7. 업데이트 (2026-07-03) — 가져오기 파서 유연화 (A+C)
사장님 요청("파서 개선하면 블록2 완전 닫고 블록3")으로 가져오기 파서를 개선. **경계 = 표준 3시트 개념 내에서만 관대**(타 앱 자유양식 자동해석 B는 "완전히 닫히지 않는" 작업이라 범위 밖·별도 페이즈).
- **A. 유연 헤더/컬럼 매핑**: 위치기반(cells[0..8]) → **컬럼맵 기반**. 헤더 별칭(`날짜`↔`date`·`거리(km)`↔`거리`)·컬럼 순서 상이·여분 컬럼·영문/혼합 헤더를 인식. 시트명이 달라도·CSV 단일시트여도 **헤더 시그니처로 유형(체성분/러닝/근력) 판별**.
- **C. CSV 지원**: `.xlsx`만 → `.csv`도. CSV는 UTF-8 디코드(fatal) — CP949 등 미지원 인코딩은 mojibake 저장 대신 거부.
- **안전장치**: 필수필드 미충족·다중유형 모호·CP949 CSV는 **조용한 오파싱 대신 거부**. 중복판정·세션그룹핑·saveProposals 경로는 무변경(검증된 부분 보존).
- **신규 파일**: `src/lib/dataImportMapping.ts`(별칭·유형판별) + 단위/통합 테스트 28케이스. `dataBackup.ts`·`DataImportPanel.tsx`(accept=.csv) 수정.
- **검증**: 파서 28 + 전체 152 vitest GREEN · build 통과. **Codex 3라운드 검수**(치명 2건=export 왕복 오염 차단 등, 상세는 [의사결정] D6 참조).
- 커밋: `42b1ea6`(코드) · phase1-release.
