1,974줄 풀 백업 — 1인 개발에서 상태 관리하는 법

PM·BE·FE·QA·외부 단말 5개 역할을 한 사람이 워크트리 4개로 돌리는 동안 통신 손실을 막은 단일 파일 운영기. 500줄 임계치를 넘어 1,974줄까지 누적된 하루치 통신을 풀 아카이브로 떨어뜨린 시점의 회고와, 같은 파일 위에서 변경 명세서·LESSONS 갱신·다음 작업 지시가 어떻게 직렬화됐는지 정리한다.


💡 Tip. 바쁜 현대인들을 위한 본문 요약

  • 워크트리 4개를 한 사람이 돌릴 때 통신 채널이 없으면 어제 결정이 오늘 휘발된다 — 단일 파일 session-sync.md 한 장으로 모든 역할이 같은 줄을 읽고 쓰는 운영
  • 500줄 임계치 + 풀 아카이브 디렉토리session-archive/YYYY-MM-DD_HHmm_제목.md 로 떨어뜨리는 패턴, 임계치는 모델 컨텍스트 윈도우 보호
  • 메시지 표준 한 줄 — ## [발신 → 수신] YYYY-MM-DD HH:MM - 제목 — 회고 가능한 형태로 결정이 남고, 다음 세션이 grep 으로 따라잡는다
  • 변경 명세서는 별도 디렉토리docs/changes/YYYY-MM-DD_*.md 는 git 추적, session-sync.md 는 git 외부
  • 하루치 통신이 1,974줄까지 누적된 풀 백업의 안쪽 — 모듈 등록 누락 DI 에러 회수, 배포 인프라 동시 진행, 연락처 포맷 통일 BE·FE 직렬화 같은 결정 3건이 같은 한 장 위에서 차례로 실렸다
  • 권장 도입 순서 — 단일 파일 신설 → 500줄 임계치 → 아카이브 디렉토리 → 메시지 표준 → 변경 명세서 분리 → LESSONS 갱신 룰

🎯 동기 — 한 사람이 5개 세션을 돌리려면 상태가 어디 있어야 하나

데스크톱 런타임 배포까지 끝낸 다음 날, 같은 사람이 같은 키보드 앞에서 다섯 개 역할을 번갈아 돌리는 흐름이 본격적으로 가동됐다. PM 세션이 변경 명세서를 떨어뜨리면 BE 세션이 구현 + 빌드를 가져가고, FE 세션이 그 위에서 폼·테이블을 갈아끼우고, QA 세션이 검증 시나리오를 회수하고, 외부 단말 세션이 모바일·Unity 콘텐츠 흐름을 받아낸다.

문제는 각 세션이 서로의 결정을 모른다는 점이다. 같은 사람이라도 세션은 별개의 모델 인스턴스이고, 한 세션이 컨텍스트 윈도우를 다 쓰고 종료되면 그 안에 있던 결정·근거·다음 작업은 함께 휘발된다. 어제 PM 세션이 BE 세션에 넘긴 “Display 테이블 스키마 변경 명세서”의 채택 사유가 다음 BE 세션에는 남아 있지 않다는 의미다.

“같은 사람이 같은 키보드로 두 역할을 번갈아 박아도, 결정을 문자열로 남겨 두지 않으면 회고가 되지 않는다.”

해결은 단순했다 — 모든 세션이 같은 파일 한 장을 읽고 쓴다. 그 파일이 session-sync.md 다. PM 세션이 BE 세션에 넘기는 명세는 [PM → BE] 헤더로 시작하는 메시지가 되고, BE 세션의 완료 보고는 [BE → PM] 헤더로 같은 파일 그 아래에 누적된다. 다음 BE 세션이 깨어났을 때 첫 행동은 이 파일을 처음부터 끝까지 읽는 것이다.

📌 핵심: 1인 멀티 세션 개발의 상태 관리는 각 세션의 메모리가 아니라 세션 외부의 공유 파일에 있어야 한다. 같은 사람이 같은 결정을 두 번 내리지 않으려면, 결정이 문자열로 같은 파일 안에 남아 있어야 한다.


🛠️ 설계 — 단일 파일 + 임계치 + 아카이브 디렉토리

설계는 세 부분으로 나뉜다. 파일 한 장, 임계치 한 개, 디렉토리 한 개.

session-sync.md 운영 모델 — 워크트리 4개에서 단일 파일로 모이는 통신 채널, 500줄 임계치 풀 백업 흐름, 세 디렉토리의 갱신 빈도·영속성 비교표

단일 파일 session-sync.md 의 위치

파일은 git 추적 밖이다. 위치는 워크트리 바깥의 별도 vault — ~/Documents/obsidian/jongmolee-vault/git/server/nest-prisma/session-sync.md. git 추적에 두면 머지 충돌이 통신 비용을 거꾸로 끌어올린다. 같은 머신 안에서 세션끼리만 보면 되는 워킹 메모 의 성격이라 별도 vault 가 자연스러운 위치다.

파일 상단은 세션 진행 상황 보드 다. 아래는 실제 풀 백업 시점의 상단 일부를 발췌한 형태다.

# Session Sync - 세션 간 공유 파일

> PM/Backend/Frontend/QA/Unity 세션 간 실시간 소통용.
> Git 외부, 커밋 없이 즉시 공유.

## 운영 규칙
- **500줄 이하** 유지
- 아카이브: `session-archive/YYYY-MM-DD_HHmm_제목.md`

## 현재 진행 상황 (YYYY-MM-DD HH:MM)
| 작업 | 내용 | 담당 | 상태 |
|------|------|------|------|
| ...  | ...  | ...  | ...  |

## 워크트리 현황
nest-prisma/            ← PM (dev)
nest-prisma-backend/    ← BE (feature/backend-work)
nest-prisma-frontend/   ← FE (feature/frontend-work)
nest-prisma-unity/      ← 외부 단말 (feature/unity-work)

상단 보드 아래로 시간순 메시지 스트림 이 누적된다. 각 메시지는 한 형식만 따른다.

## [PM → BE] 2026-02-03 00:30 - 지표 운영테이블 스키마 변경

### 배경
기존 구현이 RAW 테이블 기반이었으나, Display 테이블 히스토리 방식으로 변경 필요.

### 변경 명세서
docs/changes/2026-02-03_지표_운영테이블_히스토리.md (v2 업데이트됨)

### 작업 체크리스트
- [ ] schema.prisma: @unique 제거, 인덱스 추가
- [ ] prisma db push
- [ ] metric-display.service.ts: upsert → create
- [ ] member-metrics API 로직 수정 (Display 기반)

🔍 단서: 메시지 표준 한 줄 ## [발신 → 수신] YYYY-MM-DD HH:MM - 제목 이 다음 세션의 grep 진입점이 된다. 다음 BE 세션이 깨어났을 때 grep '\\[PM → BE\\]' 한 번으로 자신 앞으로 떨어진 모든 명세를 시간순으로 회수한다.

임계치 500줄 — 모델 컨텍스트 윈도우 보호

500줄은 자의적인 숫자가 아니다. 세션 모델의 컨텍스트 윈도우 가 임계치를 결정한다. 한 세션이 깨어나서 첫 행동으로 session-sync.md 를 전부 읽어야 하는데, 파일이 2,000줄로 부풀어 있으면 그 한 번의 읽기로 컨텍스트의 큰 덩어리가 지나간 통신 으로 채워진다. 정작 본 작업에 쓸 토큰이 줄어든다.

500줄 임계치는 작업 가능한 컨텍스트 비율 을 60% 이상으로 유지하려는 보호 장치다. 임계치를 넘으면 완료된 메시지를 아카이브로 떨어뜨려 본문을 다시 가볍게 만든다. 임계치는 머신 메모리·모델 컨텍스트 윈도우에 따라 조정 가능하지만, 500줄은 16K 토큰 안쪽에서 시간순 보드 + 워크트리 현황 + 다음 작업 보드 까지 모두 보존할 수 있는 경험적 임계치다.

아카이브 디렉토리 — 시간 기준 풀 백업

session-archive/ 디렉토리는 시간 기준의 풀 백업 저장소 다. 파일명 규칙은 YYYY-MM-DD_HHmm_제목.md. 풀 백업이 떨어지는 순간 본문은 상단 보드 + 다음 작업 보드 만 남기고 비워진다.

디렉토리갱신 빈도용도
session-sync.md (단일 파일)분 단위실시간 통신 — 모든 세션 읽기·쓰기
session-archive/YYYY-MM-DD_HHmm_*.md임계치 도달 시시간순 풀 백업 — 다음 세션의 grep 회수 가능
docs/changes/YYYY-MM-DD_*.md머지 단위변경 명세서 — git 추적, 머지 단위로 잠금

세 디렉토리는 갱신 빈도와 영속성이 다르다. 분 단위로 바뀌는 통신은 git 외부, 머지 단위로 고정되는 명세는 git 안. 둘 사이의 다리가 시간 기준 아카이브 다.


📝 실전 사례 — 1,974줄 풀 백업 안에 담긴 결정 3건

2026-02-03_1740_full_backup.md 는 하루치 통신이 1,974줄까지 누적된 시점에 떨어진 풀 백업이다. 그날 하루 안에 같은 한 장 위에서 일어난 결정 3건을 짧게 짚는다.

결정 1 — 모듈 등록 누락 DI 에러 회수 → LESSONS 항목 추가

지표 운영테이블 스키마 변경 머지 직후, dev 머지를 받은 직후 서버 기동에서 NestJS DI 에러가 발견됐다.

Nest can't resolve dependencies of the MemberReportApplicationService (PrismaService, ?).
Please make sure that the argument MetricDisplayService at index [1] is available
in the ParentModule context.

근본 원인은 단순했다 — MemberReportApplicationServiceMetricDisplayService 의존성을 추가했으나, 해당 모듈의 providers 배열에 등록을 누락 했다. tsc --noEmitpnpm build 는 통과한다. NestJS 런타임에서 의존성 그래프를 구성할 때만 실패한다.

PM 세션이 직접 수정한 후 같은 파일에 한 줄을 남겼다.

## [PM → BE] 2026-02-03 02:00 - ⚠️ DI 에러 발생 (모듈 등록 누락)

### 필수 조치 — LESSONS.md 에 새 항목 추가됨, 반드시 숙지

`.claude/skills/role-backend/LESSONS.md`
→ "13. 서버 기동 테스트 필수 - DI 에러 검증 (Critical)"

### 앞으로의 작업 완료 보고 전 체크리스트
1. TypeScript 빌드 — `pnpm build`
2. 서버 기동 테스트 (PORT=3001) — "Nest application successfully started" 확인
3. 관련 API curl 테스트
4. 3001 포트 회수 (Ctrl+C)

같은 한 장의 마법은 이 지점에서 나온다. 결정 (pnpm build 만으론 부족) 이 문자열 로 남고, 근거 (실제 에러 메시지) 가 바로 위 메시지 에 보존되어 있고, 전파 채널 (LESSONS.md 13번 항목) 이 다음 BE 세션의 시작 시 자동 읽기 대상으로 묶인다.

⚠️ 주의: DI 에러는 pnpm build 만으론 잡히지 않는다. NestJS 의 의존성 주입은 런타임 에서 모듈 그래프를 구성한다 — 컴파일 통과와 무관하다. 서버 기동 테스트가 마지막 검증 단계 다.

결정 2 — Cloud Run 배포 + Firebase Hosting 멀티사이트 동시 진행

같은 날 오전·오후 안에 Cloud Run 컨테이너 배포Firebase Hosting 멀티사이트 3건 분리 배포 가 차례로 들어갔다. 같은 세션이 두 가지를 동시에 박지 않았다. PM 세션이 [PM → BE] 메시지로 Dockerfile 트러블슈팅을 넘기고, BE 세션이 응답으로 [BE → PM] 머지 보고를 떨어뜨리는 사이에, PM 세션은 Firebase 콘솔에서 사이트 4건을 생성하고 같은 파일에 다른 메시지 헤더 로 보고를 남겼다.

## [PM] 2026-02-03 09:10 - 인프라 NestJS Dockerfile 완료 (Final)
... 트러블슈팅 5건 표 ...
## [PM] 2026-02-03 10:20 - ✅ Cloud Run 배포 완료
... Service URL + 트러블슈팅 3건 ...
## [PM] 2026-02-03 03:00 - Firebase Hosting 설정 완료
... 사이트 4건 ...
## [PM] 2026-02-03 10:40 - ✅ Firebase Hosting 배포 완료
... 배포 URL 3건 + 남은 작업 ...

같은 PM 세션이 같은 한 장 위에서 시간순으로 자기 작업 흔적을 남기면, 다음 날 다른 세션 이 깨어났을 때 인프라 흐름 전체가 한 화면에 정렬된다. 이 인프라 결정의 자세한 분리 흐름은 직전 편의 외부 단말 분리 결정 과 직접 연결된다.

결정 3 — 연락처 포맷 통일 BE·FE 직렬화

가장 길었던 단일 결정은 연락처 포맷 통일 이다. DB·DTO·UI 모두 하이픈 포함/미포함이 섞여 있어, 숫자만 저장 으로 통일하는 결정을 같은 파일 안에서 다음 순서로 직렬화했다.

단계발신 → 수신핵심
분석[PM] 16:10현황 분석 — DB/DTO/예제/Seed 모두 다른 포맷, 해결 방안 A 권장
명세 BE[PM → BE] 16:40유틸 함수 + DTO @Transform + @Matches + 마이그레이션 SQL
명세 FE[PM → FE] 16:40패키지 + Zod 스키마 + 폼 리팩토링 + 표시 포맷팅
보고 BE[BE → PM] 17:00유틸 + 4 DTO + 마이그레이션 SQL 완료
잠금[PM] 17:20머지 + 수동 SQL 실행 — 기존 데이터 정규화 완료
명세 FE[PM → FE] 17:30BE 완료 후 FE 작업 게이트 해제

같은 결정의 BE 와 FE 측면 이 같은 한 장 위에서 시간 라벨로 순서 가 매겨지면, 다음 세션이 깨어났을 때 “지금 어디까지 직렬화됐는지” 가 한 번의 grep 으로 회수된다. 17:30 시점에서 BE 게이트가 닫혔고 FE 게이트가 열려 있다는 사실이 시간순 보드 의 메시지 두 줄로 남는다.

📊 데이터: 풀 백업 1,974줄 중 결정 3건이 점유한 비중은 약 41% (812줄). 나머지 1,162줄은 작은 결정 17건 — DTO 필드 추가·캐시 모듈 도입·로깅 인터셉터 추가·UX 버그 회수 같은 단발 통신이다.


💡 교훈 — 운영하며 알게 된 패턴·안티패턴

90개 풀 백업이 누적된 4개월간 운영하며 채택·기각한 패턴을 짧게 정리한다.

채택한 패턴

패턴채택 사유
메시지 헤더 [발신 → 수신] 표준화grep 한 번으로 자신 앞으로 떨어진 명세 시간순 회수
임계치 500줄 + 풀 백업 한 번모델 컨텍스트 윈도우 60% 이상 본 작업에 할당
변경 명세서 별도 디렉토리 (docs/changes/)머지 단위로 잠기는 영속 결정과 분 단위 통신을 분리
DI 에러 회수 LESSONS 항목다음 세션 깨어남 시 자동 읽기 대상으로 묶임 — 같은 에러 회수 비용 0
시간 라벨 + 발신자 한 줄 보고 ([PM] 09:10)외부 수신자 없는 인프라 작업도 같은 보드에 시간순 정렬

기각한 패턴

패턴기각 사유
각 역할별 별도 파일 (pm-sync.md / be-sync.md 분리)grep 도착점이 분산 — 어떤 파일을 먼저 읽을지 모름, 결정 추적 비용 증가
파일 git 추적머지 충돌이 통신 비용을 거꾸로 끌어올림, 분 단위 통신 부적합
임계치 없는 무한 누적컨텍스트 윈도우 포화 — 다음 세션이 본 작업에 쓸 토큰 부족
메시지 형식 자유 서술grep 진입점 소멸 — 다음 세션의 회수 비용 폭증
변경 명세서를 session-sync.md 안에 묶기머지 단위 잠금이 안 됨 — 명세 갱신이 통신 누적 안에 묻혀 추적 불가

📌 핵심: session-sync.md 운영의 핵심은 시간 단위에 따른 위치 분리 다. 분 단위 통신, 머지 단위 명세, 시간 단위 풀 백업, 세션 단위 LESSONS — 네 가지가 서로 다른 위치 에 놓이고, 위치 간의 다리만 명확하면 1인 멀티 세션은 작동한다.


🚀 권장 — 같은 상황이라면 어떻게 도입하나

같은 1인 멀티 세션 흐름을 처음 도입한다면 권장 순서는 다음과 같다.

1단계 — 단일 파일 신설 (10분)

워크트리 바깥의 별도 디렉토리에 session-sync.md 한 장 신설. 위치는 git 외부. 상단에 세션 진행 보드 + 워크트리 현황 + 운영 규칙 세 섹션만 두고 시작.

mkdir -p ~/notes/<project>/session-archive
touch ~/notes/<project>/session-sync.md

2단계 — 메시지 표준 한 줄 (5분)

모든 메시지는 ## [발신 → 수신] YYYY-MM-DD HH:MM - 제목 으로 시작. 표준 한 줄이 다음 세션의 grep 진입점 이다.

세션 신설 시 .claude/CLAUDE.md (또는 동등 위치)에 다음 룰 한 줄을 박아 둔다.

## 세션 시작 시 필수 행동
1. `~/notes/<project>/session-sync.md` 처음부터 끝까지 정독
2. 자신 역할에 해당하는 가장 최근 `[X → 본인]` 메시지 회수
3. 작업 완료 시 `[본인 → 발신자]` 헤더로 같은 파일에 보고 누적

3단계 — 임계치 + 풀 백업 룰 (15분)

session-sync.md 가 500줄을 넘으면 다음 세션이 깨어났을 때 첫 작업으로 풀 백업 떨어뜨리기 를 수행. 파일명은 session-archive/YYYY-MM-DD_HHmm_제목.md. 본문은 상단 보드 + 다음 작업 보드만 남기고 비움.

4단계 — 변경 명세서 분리 (30분)

git 추적이 필요한 명세는 별도 디렉토리. docs/changes/YYYY-MM-DD_제목.md. 머지 단위로 고정하고, session-sync.md 안에서는 명세 파일 경로 만 인용한다.

### 변경 명세서
docs/changes/2026-02-03_연락처_포맷_통일.md

5단계 — LESSONS 갱신 룰 (선택)

세션 종료 직전, 운영 중 발견한 재발 가능 패턴.claude/skills/role-<역할>/LESSONS.md 에 번호 매긴 항목으로 추가. 다음 세션 깨어남 시 자동 읽기 대상으로 묶이도록 CLAUDE.md 에 인용 한 줄.

💡 인사이트: 5단계 도입의 비용은 1 시간 안쪽 이고, 회수는 세션 한 번 만에 시작된다. 두 번째 세션이 깨어났을 때 첫 행동이 어제 결정 회수 로 자동 정렬되면, 같은 결정을 두 번 내리는 비용이 사라진다.


📋 정리 — 1인 멀티 세션 운영 체크리스트

본 회고의 결정을 체크리스트로 정리한다.

항목안티패턴권장 패턴
공유 파일 위치❌ git 추적 안에 둠✅ git 외부 별도 vault
파일 개수❌ 역할별 분산 (pm-sync / be-sync)✅ 단일 파일 한 장
메시지 형식❌ 자유 서술## [발신 → 수신] YYYY-MM-DD HH:MM - 제목
임계치❌ 무한 누적✅ 500줄 → 풀 백업
풀 백업 위치❌ git commitsession-archive/YYYY-MM-DD_HHmm_*.md
변경 명세서session-sync.md 안에 묶음docs/changes/ 별도 디렉토리, git 추적
재발 패턴❌ 메시지 안에 묻힘LESSONS.md 번호 항목 + CLAUDE.md 자동 인용
세션 시작 행동❌ 즉시 작업 진입session-sync.md 정독 → 자신 앞 메시지 grep 회수
세션 종료 행동❌ 보고 누락[본인 → 발신자] 보고 누적 + LESSONS 추가 검토

본 운영 회고의 더 깊은 패턴 정리는 다음 편에서 세션 단위 LESSONS.md 의 7가지 역할 분기now.md 단일 파일 ToDo 보드 를 같은 C 톤 메타 회고로 이어간다.

📚 NestJS + Refine 풀스택 트러블슈팅 시리즈 (63편)

  1. 1. 왜 NestJS + Prisma를 선택했나 — B2B SaaS 백엔드 기술 선택기
  2. 2. 도메인 모델링 첫날 — B2B SaaS의 핵심 엔티티 정의하기
  3. 3. 27개 테이블의 탄생 — Prisma 스키마 설계기
  4. 4. 권한 매트릭스 — Admin/운영자/사용자 3역할 설계
  5. 5. BigInt PK에서 Int PK로 — 첫 번째 스키마 리팩토링
  6. 6. Seed 데이터의 함정 — FK 삭제 순서 삽질기
  7. 7. DDD를 도입하기로 했다 — Repository/Domain/Application 3계층
  8. 8. 인터페이스 구현체로 바꾸는 날 — NestJS DI와 TypeScript의 간극
  9. 9. 단위 테스트 인프라 구축 — Jest 설정부터 Mock까지
  10. 10. E2E 테스트와 Cloud SQL의 고난 — 4/8 passing에서 8/8까지
  11. 11. REST API 첫 구현 — 6개 Controller, 21개 엔드포인트 완성
  12. 12. v1.0 완성, 그리고 갈아엎기로 결심한 날
  13. 13. 번들 구조를 통째로 바꿔야 했던 이유
  14. 14. Phase 1 문서 정비 — Use Case를 번들 기반으로 다시 쓰다
  15. 15. Phase 2 스키마 마이그레이션 — 데이터 안 날리고 구조 바꾸기
  16. 16. Phase 3-1·3-2 — Repository와 Domain 서비스로 36개 빌드 에러 잡기
  17. 17. Phase 3-3·3-4·3-5 — Application부터 Module까지, v2.0 마이그레이션 닫는 날
  18. 18. 코드를 박은 다음 날 — 4,658줄 DDD 문서를 24분 사이에 다시 쓴 하루
  19. 19. v2.1 Domain Layer — 도메인 서비스 1,682줄을 한 커밋에 박은 날의 설계 철학
  20. 20. v3.0 Application Layer 재작성 — 도메인 서비스 위에 얇은 막을 한 Phase에 박은 날
  21. 21. 갈아엎고 80일 — v2.0 마이그레이션 8편 메타 회고
  22. 22. 1인 다역으로 5일 만에 90% — Admin Portal MVP를 끌어올린 토글 한 줄
  23. 23. Mock에선 되던 게 REST에선 안 됐다 — 응답 포맷 한 칸 차이가 만든 하루
  24. 24. CORS는 됐다 — PATCH만 빼고. allowedHeaders 한 줄과 Vite 프록시의 소문자 메서드
  25. 25. 멀티테넌트 누수 — tenantId 3계층 강제
  26. 26. Prisma 정책 싱글톤 — zod superRefine 임계값 가드
  27. 27. 멀티테넌트 쓰기 가드 — body.tenantId 차단과 집계 일관성
  28. 28. 두 번째 점검은 합류 지점이었다 — Admin Portal 2차에서 한 사이클에 잡힌 FE-BE 연동 버그 11건
  29. 29. Prisma 그래프 스키마 — 선형 레벨을 DAG로 옮긴 4가지 결정
  30. 30. 교육과정 구조 리팩토링 — 3필드 분리와 폴백 결정기
  31. 31. 배치고사 MVP — 자동 레벨 배치를 걷어내고 5지표 측정만 남기다
  32. 32. JWT Guard 적용 — request.user undefined부터 jwt malformed까지
  33. 33. 디버깅용 운영 API 7개 — Unity 만료 테스트 30분 대기를 0초로
  34. 34. NestJS Swagger 일괄 적용 — 35개 컨트롤러 + DTO 22개
  35. 35. Unity ↔ 웹 PostMessage 브릿지 설계기
  36. 36. Vuplex 브릿지 초기화 타이밍 — 첫 메시지가 증발한 이유
  37. 37. 콘텐츠 브릿지 10종 통합 완료 — 같은 규격으로 묶기
  38. 38. 지표 누계 시스템 — TOP5 순위를 INSERT 전용 스냅샷으로 굳히기
  39. 39. 킥오프 배치 첫 구현 — 매시 전체 EXPIRED 사고와 Winston 도입
  40. 40. 혼자 여러 역할로 QA 1차 — 브랜치 미동기화와 잔존 토큰의 함정
  41. 41. 타이머가 NaN:NaN으로 떴다 — Bundle API 응답 누락 필드와 비어 있는 콘텐츠 후보
  42. 42. 1인 개발 QA 5라운드 — 타이머·시드·스키마로 옮긴 버그들
  43. 43. Unity Lobby + 배치고사 씬 통합 — 두 클라이언트가 같은 회원을 보는 첫 빌드
  44. 44. 배치고사 MVP 후속 — 명세를 코드로 옮기고 레거시 571줄을 일괄 삭제하다
  45. 45. Problem 종속 끊기 — 1,891개 마이그레이션과 단위 테스트 38건
  46. 46. NestJS 권한 가드 — 목록은 막고 상세는 뚫린 날
  47. 47. 콘텐츠 후보 선택 3차 최적화 — 단일 쿼리로 옮기기
  48. 48. 재화 시스템 첫 머지 — 코인 지갑과 거래 원장(Wallet API)
  49. 49. 회원 레포트 5탭 API 설계 — 인사이트 3파트 구조
  50. 50. 보호자 외부 뷰어 대시보드 — 모바일 앱·초대 토큰 회원가입
  51. 51. 외부 뷰어 리포트 v1→v2 토큰 전환 — 가장 길었던 하루
  52. 52. 외부 뷰어 리포트 인사이트 — 활동 데이터를 자연어로 바꾸기
  53. 53. Framer Motion whileInView — 일부 카드만 안 뜨던 날
  54. 54. 외부 뷰어 리포트 4탭 N+1 — 14초 응답을 2초로
  55. 55. Cloud SQL 리전 트랩 — US→Taiwan 71% 트러블슈팅
  56. 56. QR 배치고사 + Firebase Hosting 멀티 사이트 배포
  57. 57. 1,974줄 풀 백업 — 1인 개발에서 상태 관리하는 법
  58. 58. 주간 출석 KST 타임존 — 월요일이 사라진 트러블슈팅
  59. 59. 연락처 포맷 통일 — 저장은 숫자만, 표시는 하이픈
  60. 60. react-hook-form + Zod 폼 표준 정착기
  61. 61. Soft Delete 구현 — deletedAt 한 컬럼이 닿은 27곳의 설계
  62. 62. 교육과정 자동 승급의 늪 — 도메인 버그 3 건 트러블슈팅
  63. 63. 교육과정 도메인 BE 완성과 같은 날 핫픽스 7 건 — NestJS @Cron 2 중 실행 묶음