프론트엔드/풀스택 개발자 최재용(jaeyonging)의 개발 블로그입니다. React, TypeScript, Node.js 등 웹 개발 경험과 직접 만든 사이트, 프로젝트 기록을 공유합니다.
거래소 WebSocket 글에서 rAF로 렌더링을 묶었다고 썼는데 숫자가 하나도 없었다. 실제 시세를 녹화해서 다시 흘려보내며 재보니 평소에는 차이가 거의 없었고, 느린 폰과 바쁜 장이 겹칠 때 7.6fps와 37.6fps로 갈렸다.
코인 모의투자 사이트에 테스트가 하나도 없어서 청산가 계산과 재연결 소켓부터 Vitest로 테스트를 붙였다. 26개 중 1개가 실패했는데, 교차 포지션이 여러 개면 같은 현금을 여러 번 잃는 것으로 계산하던 버그였다.
이동 시간은 실제 도로로 바꿨는데 머무는 시간은 여전히 관광지면 90분이었다. 관광공사 소분류 코드와 이름 규칙으로 장소마다 기준을 다시 잡고, 실제 일정 27개를 옛 규칙과 새 규칙으로 다시 계산해 비교했다.
10월 7일에 서비스 9개가 80분 동안 같이 응답하지 않았다. 다운 메일은 하나도 못 나갔고 복구 메일만 9통이 왔다. 같은 시간대의 실패를 공통 장애로 묶어 status 페이지에 따로 보여주게 바꿨다.
방문자 수를 세는 API가 끝나야 화면을 그리게 짜놔서 홈의 글 목록 요청이 그 뒤에 줄을 서고 있었다. 기다리지 않게 바꾸고 모바일 회선을 흉내 내 재보니 홈이 뜨는 시간이 3.98초에서 3.39초가 됐다.
헬스체크 기록이 지우는 코드 없이 1분마다 쌓여 status 페이지 집계가 매번 테이블 전체를 훑고 있었다. 일별 집계 테이블을 두고 성공 기록만 30일 뒤 지워서 쿼리를 0.68초에서 0.012초로 줄였다.
코드블록 하이라이팅을 붙이고 홈 요청을 확인했더니 글 화면에서만 쓰는 highlight.js 71KB가 같이 내려오고 있었다. 원인은 Rollup의 CommonJS 헬퍼였고, 같은 이유로 lodash도 1년 넘게 홈에서 받고 있었다.
와일드카드 DNS와 Apache 기본 vhost 때문에 없는 서브도메인이 블로그로 들어가 빈 화면이 떴다. 안내 페이지로 바꾸면서 파일 순서, 와일드카드 인증서, 상태 코드와 noindex를 어떻게 정했는지 정리했다.
27만 번 체크한 기록을 다시 뜯어봤다. 공개 도메인으로 체크한 건 잘한 선택이었고, 자기 자신을 감시하는 구조와 순차 체크, 끝없이 쌓이는 이력, 로그에 남는 토큰은 고쳐야 한다
실패 31건이 쌓이는 동안 알림은 0건이었다. 실패마다 알리면 메일 58통, 연속 2회 기준이면 4통. 쌓인 기록으로 먼저 세보고 상태 전이 방식으로 붙인 과정