Drag to move
‹ Home
💰

WorthWatch

A read-only asset dashboard that keeps the trend of balances, not just today’s numbers

Released
2026.09
Role
Planning · Development
Tech
5

Preview

  • 대시보드 상단
  • 미래 시뮬레이션

About this app

The write-up below is in Korean. For an English overview of every project, see the CV.

왜 만들었나

거래소 앱은 지금 잔고만 보여준다. 석 달 전 내 순자산이 얼마였는지는 어디에도 남아 있지 않고, 지나간 날의 잔고는 나중에 되살릴 방법도 없다.

그래서 질문을 바꿨다. 오늘 얼마인지가 아니라, 어떻게 움직여 왔는지. 매일 아침 모든 잔고를 원화로 환산해 하루치 기록으로 쌓아 두면 추이는 저절로 그려진다.

무엇을 만들었나

WorthWatch는 나 혼자 쓰는 조회 전용 자산 대시보드다. 코인 거래소 6곳과 증권사 3곳의 커넥터를 두고, 매일 아침 8시 배치가 잔고를 SQLite에 하루치 스냅샷으로 남긴다. 연동할 수 없는 은행·보험·부채는 값이 바뀔 때만 손으로 적는다. 주문·이체·출금 코드는 저장소에 아예 없다.

대시보드 상단

대시보드 상단. 순자산 추이와 자산군 비중이 첫 화면에 있다. 숫자는 모두 가짜 데이터다.

화면은 대시보드·수입·수기 입력·API 연동·미래 시뮬레이션 다섯 개다. 매일 여는 첫 화면이 곧 배치 감시 화면이기도 하다 — 오늘 데이터가 빠진 소스가 있으면 상단에 노란 배너가 뜬다.

미래 시뮬레이션

미래 시뮬레이션. 월 적립액·수익률·기간을 바꾸며 목표 도달 시점을 비교한다. 투자 권유가 아니라는 고지와 세금·물가 미반영 안내를 화면에 함께 둔다.

이 글의 화면은 실제 데이터가 아니다. 저장소를 따로 복사한 빈 폴더에서 npm run seed로 만든 60일치 가짜 시계열이다.

어떻게 만들었나

수집기는 웹서버와 떼어 놓았다. 수집은 Next.js와 별개인 스크립트이고, 실행은 Windows 작업 스케줄러가 맡는다. 대시보드가 꺼져 있어도 기록은 쌓인다. 쓰기는 (소스 × 날짜) 단위로 지우고 다시 넣어서 같은 날 몇 번을 돌려도 결과가 같다. 날짜는 한국 시간 기준이다 — UTC로 찍으면 오전 8시 실행이 전날 기록이 된다.

키보다 코드가 먼저. 커넥터 9개는 전부 가짜 응답(fixture)으로 먼저 만들었다. mock과 real은 외부를 부르는 한 지점에서만 갈라지고, 응답을 해석하는 코드는 공유한다. 테스트는 16개 파일, 106개다.

잔고는 개인정보다. 대시보드는 127.0.0.1에만 묶었다. 처음엔 기본값인 0.0.0.0에 떠 있어서 같은 공유기에 붙은 기기가 화면에 닿을 수 있는 상태였는데, 검토에서 잡아 첫날 고쳤다. DB는 무결성 검사를 통과할 때만 일별 7개·월별 12개로 백업한다.

모르는 값은 0으로 그리지 않는다. 한 소스가 실패한 날을 0으로 그리면 순자산이 급락한 것처럼 보인다. 그날은 그 소스의 직전값을 이월해 그리고 ’보정 표시 N일’을 적되, DB에는 실측만 남긴다.

걸렸던 것

가짜와 진짜가 섞이는 길은 생각보다 많았다. mock은 개발용 DB로, real은 실제 DB로 가르면 끝일 줄 알았다. 그런데 mock 상태에서 손으로 입력한 값까지 개발용 DB에 들어가면, real로 전환하는 순간 실데이터가 증발한다. 그래서 수기 입력만은 모드와 무관하게 항상 실제 DB에 쓰도록 바꿨다. 이 결정은 캡처에서 한 번 더 걸렸다 — mock으로 띄워도 수기 데이터는 실제 DB에서 읽히니, 화면을 찍으려면 저장소를 통째로 복사해야 했다.

PC가 꺼진 날은 기록도 없다. 기획서의 원칙은 ’놓친 날은 비워 둔다’였다. 지나간 잔고는 복원할 수 없으니까. 하지만 PC를 매일 켜 두지 않으니 차트에 빈 구간이 생겼다. 스케줄러에 ‘로그온 2분 뒤’ 트리거를 더했고, 결국 원칙을 한 번 굽혔다. 최근 60일 안의 완전히 빈 날만, ’그날도 지금 수량을 들고 있었다’는 가정으로 그날 시세를 곱해 채운다. 실측이 아니라 재구성이라서 채운 행에는 표식을 남긴다.

감사도 틀린다. 화면 4개를 실측하는 기술 감사에서 20건을 받아 정리하자 점수가 12/20에서 19/20이 됐다. 폰 폭(375px)에서 페이지를 최대 595px 밀어내던 가로 넘침도 0이 됐다. 그런데 20건 중 2건은 오탐이었다. 보이지 않는 탭에서 재느라 리사이즈 알림이 오지 않은 것을 결함으로, 차트 라이브러리가 JS 안에서 이미 처리하던 ‘동작 줄이기’ 설정을 ’대응 없음’으로 읽었다. 고치기 전에 철회했다. 겉으로 보이는 증거만으로 ’없다’고 판정하면 안 된다.

어디까지 왔나

기획서가 정한 진짜 판정 기준은 ’3개월 뒤에도 내가 매일 여는가’다. 그 3개월은 11월 중순에 찬다. 아직 판정 전이다.

자동화는 절반만 됐다. 코인 거래소 쪽은 실제로 돌리며 고친 곳까지 있지만, 증권사는 아직 API 대신 보유 수량을 파일로 적어 두고 시세만 매일 붙이는 우회로로 반영한다. ’자동화 우선, 수기 최소화’라는 원칙에서 증권 쪽은 아직 수기에 가깝다.

남은 것

증권 3사 실연동이 첫째다. 커넥터는 공개 문서를 보고 만들어 fixture로만 검증했고, 증권사 한 곳은 실제 응답을 아직 확인하지 못한 잠정 구현이다. 8월 말 전체 검토에서 살아남은 지적 20건 중 중복을 뺀 19건도 문서상 아직 체크 전이고, 그중 숫자가 틀리게 나오는 2건이 최우선이다. 늘 켜져 있는 기기로 옮기면 ‘PC가 꺼진 날’ 문제는 통째로 사라진다.

Information

Made by
Kipyo Bae (kipioneer)
Role
Planning · Development
Tech
Next.js · TypeScript · SQLite · Drizzle ORM · Recharts
Released