배포하자마자 데이터가 날아갔다 — Render H2에서 Supabase Postgres로
배포
Oracle Cloud 가입이 막혀서 대안을 찾다가 Render(백엔드, Docker)로 방향을 틀었다. 무료 티어는 15분 무활동 시 슬립되는데, GitHub Actions 예약 워크플로가 매일 외부에서 깨우는 방식으로 우회했다(ADR 0008). Cloudflare Pages(웹)도 같이 배포해서 저녁에 Phase 1(backend+web) 배포를 마쳤다.
데이터가 사라졌다
배포 몇 시간 만에 브리핑과 감사로그가 전부 사라진 걸 발견했다. 원인은 단순했다 — Render 무료 티어는 영구 디스크가 없어서, 슬립 후 재기동될 때마다 파일 기반 H2 DB가 초기화되고 있었다. prod 프로필을 분리해서 로컬 개발은 H2 그대로 두고, 프로덕션만 외부 Supabase Postgres를 쓰도록 바꿨다(ADR 0009).
Postgres로 옮기자마자 또 터졌다
감사로그 검색이 500 에러를 뱉기 시작했다. "IS NULL OR ..." 형태의 JPQL 패턴이 H2에서는 문제없이 돌아가지만 Postgres에서는 "could not determine data type of parameter"로 죽었다. Specification 기반으로 교체해서, 필터가 실제로 있을 때만 predicate를 추가하도록 바꿨다 — null 타입 추론 문제 자체가 애초에 발생하지 않는 구조로.
리디자인
같은 날 저녁, 웹 디자인을 AntD 기본 톤(파란 primary, radius 6)에서 토스·TradingView 쪽 벤치마킹으로 갈아엎었다. Pretendard 폰트, 인디고 브랜드 컬러, 지표 카드(굵은 숫자 + 트렌드 색 상단 바), 그라디언트 차트 영역. 카드 hover 리프트와 값 변경 시 배경 플래시 애니메이션도 붙였다. 감사로그 상태 4색은 디자인 규칙에 고정값이라 그대로 뒀다.
교훈
무료 티어 인프라는 "슬립"만 신경 쓰면 될 것 같지만, 슬립 뒤에 뭐가 초기화되는지까지 봐야 한다. 파일 기반 DB는 특히 위험했다.