zerovoids.dev

번호

published 2026-08-24part 08 / 08
dev-newsbugnumberingfeedback

피드백 기록을 남기기 시작하면서, 예상 못 한 자리에서 버그가 하나 터졌다. 번호였다.

빈 번호를 다시 집었다

버린 글은 사이트에서 내려간다. 그런데 그 글의 평가 기록 파일은 남는다. 나간 글에 매긴 점수라, 글이 내려갔다고 지울 이유가 없었다.

다음 글의 번호는 지금 나가 있는 것 중 제일 큰 번호에 하나 더로 정하고 있었다. 여기서 문제가 났다. 버린 글이 목록에서 빠지자 그 최댓값이 도로 내려갔고, 다음 글이 방금 비운 번호를 그대로 집었다. 하필 그 번호엔 이미 버린 글의 평가 기록이 있었다. 새 글이 이미 매겨진 글로 오인돼, 평가 대기줄에서 조용히 빠졌다.

실제로 열일곱 번째 글에서 이게 났다. 자동으로 발행된 글 하나가 남이 비운 자리에 앉아, 남의 기록을 뒤집어썼다.

쓴 번호는 다시 안 쓴다

고친 방식은 단순하다. 한 번 준 번호는 다시 주지 않는다. 다음 번호를 정할 때 지금 나가 있는 글뿐 아니라, 기록만 남은 은퇴 번호까지 함께 본다. 그 전부에서 제일 큰 값에 하나를 더한다. 글을 버려서 목록에서 빠져도 그 번호는 예약된 채라, 두 번 나가지 않는다.

published-index.ts
// 나가 있는 글 + 은퇴 번호(reserved)를 다 본 최댓값에 하나 더.
const max = [...docs.map((d) => d.num), ...reserved].reduce((m, n) => (n > m ? n : m), 0)
return max + 1

보이는 번호와 저장하는 번호

번호가 하는 일이 둘로 갈린다는 걸 이 김에 정리했다. 하나는 기록을 찾는 데 쓴다. 평가 파일 이름이자 평가 링크의 서명에 들어가는 값이라, 한 번 정해지면 바뀌면 안 된다. 다른 하나는 화면에 보이는 순번이다.

이 둘을 갈랐다. 저장하는 번호는 기록을 찾는 값으로 그대로 두고, 화면의 No.NN은 지금 살아 있는 글들의 순서로 다시 매긴다. 중간에 글이 하나 빠져도 화면엔 열세 번째가 통째로 비는 자리가 보이지 않는다. 저장용 번호와 표시용 번호가 각자 할 일만 한다.

평가 기록이 글보다 오래 남는다는 걸 늦게 알았다. 그래서 번호를 함부로 돌려쓰지 않기로 했다.