상태 관리 — 라이브러리를 직접 만들어 본다 · 늦게 온 응답이 이겼다 · 실습
경합을 막는 레인
목표
검색창·좋아요·목록 새로고침에서 상태를 망가뜨리는 비동기 경합을 직접
막아 봅니다. 파일 하나에 함수 넷을 만듭니다.
왜 중요한가
동기 세계에서는 "마지막에 부른 것이 마지막에 반영된다" 가 공짜다. 비동기에서는
공짜가 아니다. 먼저 보낸 요청이 나중에 도착할 수 있고, 그때 상태를 고치는 자리에
순서 개념이 없으면 새 값이 옛 값으로 조용히 덮인다. 개발자 기계에서는 응답이
너무 빨라 재현되지 않기 때문에, 이런 버그는 사용자만 본다.
되돌리기도 마찬가지다. 낙관적 갱신을 역연산으로 되돌리면 그 사이에 들어온 다른
갱신까지 함께 날아간다. 되돌리기는 빼기가 아니라 **대기 목록에서 제거하고 다시
계산하는 일**이다. 이 실습이 그 차이를 손으로 만들게 한다.
만들 것
/root/work/race/lane.mjs 에서 아래를 export 합니다.
| export | 계약 |
|---|---|
| createLane() | run(task) — 최신 요청만 반영. 새 run 이 앞 run 의 신호를 끊는다 |
| createDedupe() | run(key, task) — 진행 중인 같은 열쇠는 같은 약속을 나눠 준다 |
| createOptimistic(base) | begin · rollback · settle · getState |
| createCache() | set(key, value, now) · get(key, now, staleMs) |
단계
1. 최신 우선 레인
2. 취소 신호
3. 열쇠별 중복 제거
4. 낙관적 갱신과 되돌리기
5. 서버 응답으로 바닥값 갈아 끼우기
6. 낡음 판정
7. 직접 재서 적기 — /root/work/race/07-measure.txt
8. 정리 — /root/work/race/08-notes.md
참고
- npm install 은 안 됩니다. 네트워크가 없고 필요하지도 않습니다.
- 채점기는 여러분의
lane.mjs를 import 해서 계약만 확인합니다. 화면도 - 7단계는 여러분이 적은 숫자를 채점기가 그 자리에서 다시 재어 대조합니다.
AbortController 와 queueMicrotask 는 node 22 에 기본으로 있습니다.
프레임워크도 쓰지 않습니다.
지어낸 숫자로는 통과하지 못합니다.
단계 8개
- 최신 우선 레인
- 취소 신호
- 열쇠별 중복 제거
- 되돌리기는 빼기가 아니다
- 서버 응답이 바닥값을 갈아 끼운다
- 낡음과 버림은 다른 눈금이다
- 직접 재서 적는다
- 무엇이 순서를 지켜 주었나