2026년 12주차 회고
이번 주 한 일
이번 주는 말 그대로 폭발적이었다. 6개 레포에서 총 144개 커밋, 블로그 포스트 7개, 그리고 내포마라톤 10km까지. Claude 병렬 세션을 3~5개씩 동시에 돌리며 프로젝트를 밀어붙였고, 금요일에는 홍성으로 내려가 토요일 대회를 뛰었다. 돌이켜보면 좀 무리하긴 했는데, 이런 주간이 가끔은 필요한 것 같다.
Claude Multiple Dashboard — v1.0.0 안정 릴리스 (53커밋)
월요일부터 수요일까지 가장 많은 시간을 쏟은 프로젝트. 브라우저 터미널부터 알림 시스템까지 Phase 5~8을 전부 마무리하고, v1.0.0 stable release로 올렸다.
주요 작업:
- Phase 5: 브라우저 터미널 (node-pty + WebSocket + xterm.js) 구현 → 고민 끝에 제거 (경량 모니터링 포커스 유지)
- Phase 6: atomic writes, 서버사이드 검색, 로그 압축
- Phase 7: 세션 메모, 컬러 필터, 인라인 컬러 피커, transcript Markdown export, hourly activity heatmap
- Phase 8: 세션 프리셋, API 통합 테스트
- README 영문 전환 + 한국어 번역 분리, 스크린샷 정비
- v0.3.1 → v0.4.0 → v0.5.0 → v1.0.0 퍼블리시 (npm)
터미널 기능을 만들었다가 과감히 빼는 결정이 이번 주의 하이라이트였다. 프로세스 생명주기와 터미널 프로토콜을 공부하면서 삽질기 블로그 글도 썼는데, 결국 “이 기능이 이 도구의 본질인가?”를 자문하고 빼기로 했다. 기능을 추가하는 것보다 빼는 게 더 어렵다.
HabitFlow — 하루 만에 MVP, 일주일 만에 멀티플랫폼 (19커밋)
Swift를 처음 써보면서 시작한 습관 트래커. 일요일 기획에서 시작해 화요일에 M1~M7을 하루 만에 끝냈다.
마일스톤 진행:
- M1: Xcode 프로젝트 초기화 + Firebase SDK 연동
- M2: 데이터 모델 + 서비스 레이어 (TDD)
- M3: Anonymous Auth + Firestore 보안 규칙
- M4: 습관 CRUD UI + ViewModel
- M5: 오늘의 습관 + 체크 + 탭 구조
- M6: GitHub 잔디 스타일 히트맵 + DateFormat 공통 유틸 (TDD)
- M7: Streak 계산 + TodayView 표시
- M8: macOS 멀티플랫폼 확장 + Google Sign-In + 적응형 네비게이션
- M9: 로컬 알림 — NotificationService + 설정 UI
특히 macOS 이식은 SwiftUI의 힘을 체감한 순간이었다. .macOS(.v14) 한 줄 추가하고 #if os(macOS) 분기 몇 개만 넣으면 끝. 블로그에도 정리했다.
CloudPocket — 시트 동기화 리팩토링 (32커밋)
가계부 앱의 Google Sheets 연동을 대폭 개선한 주였다. 특히 batchGet/batchUpdate 전환으로 API 호출을 64회→2회로 줄인 것이 핵심.
주요 작업:
- MS1: 예산 UI — BudgetProgressBar + Settings 예산 탭 + Home 통합
- MS2: 자동 동기화 — 앱 시작 + 포그라운드 복귀 시 Google Sheets export
- MS3: 앱 아이콘/스플래시 생성 + app.json 정비 + expo prebuild
- MS5: 수입/저축/자산 관리 UI — Settings CRUD + Statistics 표시 통합
- 시트 리팩토링: 카테고리/결제수단 설정 시트 분리 → batchUpdate 400 에러 근본 해결
- API 호출 최적화: 개별 read/write 64회 → batchGet + batchUpdate 2회
- 셀 범위 충돌, 동적 패딩, 동기화 연도 자동 감지 등 수많은 버그 수정
셀 범위가 겹치면서 발생하는 400 에러를 잡느라 월~화 이틀을 통째로 썼다. 결국 설정 시트를 물리적으로 분리하는 게 답이었다.
블로그 — 7개 포스트 발행 (36커밋)
이번 주만 블로그에 7개 글을 올렸다.
| 날짜 | 제목 | 카테고리 |
|---|---|---|
| 3/16 | 레이스 다음 날 (일기) | essay/diary |
| 3/17 | Claude Multiple Dashboard — 멀티 세션 관제탑 만들기 | dev |
| 3/17 | HabitFlow — SwiftUI + Firebase로 습관 트래커 만들기 | dev |
| 3/17 | 의성데이터포털 — 0에서 운영까지, 백엔드 7개월 회고 | dev/work |
| 3/17 | 프로세스 생명주기와 터미널 프로토콜 — 브라우저 터미널 삽질기 | dev/til |
| 3/18 | Dashboard v0.4.0, HabitFlow M6+M9, CloudPocket Sheets (묶음 포스트) | dev |
| 3/19 | SwiftUI 앱을 macOS로 이식하기 + WidgetKit + Google 로그인 | dev/project |
일기를 포함하면 거의 매일 하나씩 쓴 셈이다. 블로그를 만든 지 일주일 만에 컨텐츠가 10개를 넘겼다.
Daily Mail — RSS 정비 (3커밋)
- 중앙일보 RSS 서비스 종료 확인 → 소스 제거
- Discord enabled 플래그 추가 + RSS 소스 밸런싱
- RSS 피드 URL 정리 + 실제 연결 테스트 추가
Claude Productivity — 스킬 대규모 업데이트 (1커밋)
- 6개 기존 스킬 개선 + 3개 신규 스킬 추가
- description 트리거 강화, eval 벤치마크 반영
러닝 — 주간 28km + 내포마라톤 10km 🏃
동마 후유증에서 시작해 내포마라톤까지, 2주 연속 대회를 소화한 주간이었다. 월요일 회복런 3km, 목요일 양재천 8km, 금요일 컨디셔닝 7km, 토요일 내포마라톤 10km(53:54) — 주간 합계 28km. 이준호와 함께 뛰었고, 기록이 각인된 메달을 받았다.
자세한 러닝 기록은 3월 3째주 러닝 로그 — 동마 후유증에서 내포마라톤까지에.
일상 — 귀요미 버블헤드
홍성 내려가는 길에 팝업스토어에서 반한 버블헤드. 비싸서 포기했는데, 알고 보니 집에 있었다.
귀요미 버블헤드에 자세한 이야기를.
주요 일정
- 3/16 (월) 종일 — CloudPocket 시트 동기화 + 블로그 SEO/접근성
- 3/17 (화) 종일 — HabitFlow M1
M7 하루 만에 완성 + Dashboard Phase 57 - 3/18 (수) 종일 — Dashboard README 리뉴얼 + 블로그 3편 발행 + HabitFlow M6/M9
- 3/19 (목) 종일 — Dashboard v1.0.0 릴리스 + HabitFlow macOS 멀티플랫폼 + CloudPocket 시트 분리
- 3/20 (금) 저녁 — 홍성 이동 🚂 (팝업스토어에서 버블헤드 구경)
- 3/21 (토) 오전 — 내포마라톤 10km 완주 (이준호와 함께) 🏃
이번 주 숫자
| 지표 | 수치 |
|---|---|
| 총 커밋 | 144개 (6개 레포) |
| 블로그 포스트 | 7개 |
| npm 릴리스 | 4회 (v0.3.1 → v1.0.0) |
| 주간 러닝 | 28km (4회) |
| 마라톤 기록 | 53분 54초 (10km) |
| HabitFlow 마일스톤 | M1~M9 (9개) |
| CloudPocket API 최적화 | 64회 → 2회 |
배운 것
- SwiftUI 멀티플랫폼:
.macOS(.v14)한 줄이면 iOS 앱이 Mac에서 돌아간다.#if os(macOS)분기로 플랫폼별 네비게이션만 분리하면 끝 - WidgetKit: TimelineProvider + AppGroup 공유 컨테이너로 위젯 ↔ 앱 데이터 동기화
- Google Sign-In (Swift): Firebase Auth에 Google credential을 연결하는 과정. 크로스 디바이스 동기화의 핵심
- node-pty + xterm.js: 브라우저 터미널을 만들면서 Unix 프로세스 생명주기 (orphan, zombie, SIGHUP)를 실전으로 공부
- Kitty Keyboard Protocol: 최신 터미널들이 CSI u 시퀀스로 키 입력을 처리한다는 것. Claude Code가 이걸 쓴다
- Google Sheets batchGet/batchUpdate: 개별 API 호출을 배치로 묶으면 할당량과 지연 시간 모두 극적으로 개선
- “기능을 빼는 용기”: 이틀 걸려 만든 브라우저 터미널을 빼는 결정. 도구의 정체성(경량 모니터링)에 맞지 않으면 아무리 멋진 기능이라도 빼야 한다
느낀 점
이번 주는 지난주의 연장선이면서도 확실히 다른 점이 있었다. 지난주가 인프라를 세우는 주였다면, 이번 주는 세운 인프라 위에서 전력 질주한 주였던 것 같다.
Claude 병렬 세션으로 하루에 3~5개 프로젝트를 동시에 진행하는 게 자연스러워졌다. 한 세션에서 CloudPocket 시트 버그를 잡는 동안, 다른 세션에서 HabitFlow 마일스톤을 밀고, 또 다른 세션에서 Dashboard를 릴리스한다. 이 워크플로우 자체가 하나의 스킬이 된 느낌이다.
특히 HabitFlow는 Swift를 처음 써보면서도 하루 만에 M7까지 갈 수 있었던 게 놀라웠다. TDD로 테스트를 먼저 쓰고 Claude에게 구현을 맡기는 패턴이 Swift에서도 잘 동작한다는 걸 확인했다. 언어는 달라도 개발 방법론은 이식이 가능하다는 생각이 든다.
Dashboard v1.0.0을 찍으면서 “프로젝트 완료”를 경험한 것도 의미 있었다. 만들기만 하는 게 아니라, 유지보수 모드로 전환하고 안정 릴리스를 내는 것까지가 프로젝트라는 걸 느꼈다. 앞으로 다른 프로젝트에도 이 마인드셋을 적용해야겠다.
마라톤은 지난주 동아서울(53:41)에 이어 이번주 내포(53:54). 기록은 거의 같지만, 2주 연속 대회를 뛰면서 러닝이 일상의 일부로 자리잡아가고 있다. 이준호와 같이 뛰니까 확실히 더 동기부여가 된다. 기록이 각인된 메달을 받으니까 더 기분이 좋았다 — 다음엔 50분 벽을 깨고 싶다.
144커밋이라는 숫자가 중요한 게 아니다. 6개 프로젝트를 동시에 진행하면서도 각각에서 의미 있는 진전을 만들어냈다는 것, 그리고 그 과정에서 새로운 기술을 실전으로 익혔다는 것. 양과 질이 동시에 올라가는 경험은 쉽게 오지 않는다. 이 모멘텀을 유지하고 싶다.
(다만 이력서를 2주째 안 쓰고 있다는 사실은… 다음 주에는 정말 써야겠다.)
다음 주 계획
프로젝트
- CloudPocket 시트 분리 리팩토링 마무리 + Phase 3 남은 작업
- HabitFlow Phase 2 — 통계/차트 + 성취 뱃지
- 블로그 포스팅 계속 — 최소 주 3편
이직
- 이력서 업데이트 + 포트폴리오 프로젝트 정리
- 5곳 이상 지원 목표
러닝
- 주간 35km 이상 — 하루 7
8km, 주 45회 - 50분 벽 깨기 위한 인터벌 훈련 시작
약속
- 3/22 (일) 17:00 — 대학 친구 저녁 식사 (이승수, 기경도, 박진석) @ 강남
한 줄 회고
세운 인프라 위에서 전력 질주한 한 주. 144커밋과 53분 54초 — 코드로도, 발로도 달린 일주일이었다.