소식

두 번 예 라고 답한 자리 — 중복은 어디서 생기나

작성: makemind · 2026년 7월 17일

7월 셋째 주. 이번 주는 같은 일이 두 번 일어나는 자리를 팠다.

이번 주 Signal

두 번 예 라고 답했다.두 번 예라고 답했다」는 같은 시간대에 예약 두 건이 들어가는 상황을 만든다. 화면이 두 개든 손님이 동시에 누르든, 겹침이 성립하는 건 서버가 검사를 안 하기 때문이다. 창을 좁히는 게 아니라 겹침을 거절하는 도구를 두는 편이다.

재시도는 공짜가 아니다.재시도가 치르는 값」은 응답이 늦었을 때 한 번 더 보내면 무엇이 늘어나는지를 센다. 네트워크가 끊긴 게 아니라 답이 늦었을 뿐인 경우, 재시도는 주문을 하나 더 만든다.

판단이 일곱 줄이 됐다.물어볼 수 있는 기록」과 「통역 없이 앉는다」가 같은 자리를 양쪽에서 짚는다. 농부가 말로 하던 규칙 하나가 코드가 아니라 선언 일곱 줄로 앉고, 반장의 점검표는 한 글자도 안 바뀌도록 검증이 막는다.

도구·패키지 메모

이번 주에 제일 오래 걸린 건 코드가 아니라 결함을 재현하는 일이었다. 중복 예약을 클라이언트 두 개로 동시에 눌러서 만들려고 했는데 안 났다. stdio가 요청을 줄 세우기 때문이다 — 한 요청이 끝나야 다음이 들어간다. 그래서 겹침을 서버 안에서 만드는 도구를 따로 두고, 그 경로로 재현했다. 전송이 동시성을 감춰 주는 동안에는 결함이 안 보인다는 게 이번 주의 진짜 발견이다.

그리고 화면 하나가 거짓말을 했다. 경고 문장이 초록색으로 떴는데, 색이 화면 JSON에 하드코딩돼 있었기 때문이다. 로그에는 정확히 경고라고 찍혀 있었다 — 렌더된 픽셀을 눈으로 안 봤으면 못 잡았을 결함이다.

짧은 생각

중복은 대개 "동시에 눌러서" 생긴다고 설명된다. 실제로는 누가 검사를 안 해서 생긴다. 동시성은 그 부재를 드러내는 조건일 뿐이다. 그래서 고칠 자리도 타이밍이 아니라 거절하는 도구 하나다.

다음 주

묻지 않아도 바뀌었다고 알려 주는 화면, 그리고 도구가 끝내 하지 않는 일로 넘어간다.


makemind.dev 「소식」 — 매주 한 번, 그 주에 무엇이 올라갔고 만들면서 무엇이 걸렸는지.

Twitter