LabHub
배우기 러닝패스 코스

상태 관리 — 라이브러리를 직접 만들어 본다 · 늦게 온 응답이 이겼다 · 실습

경합을 막는 레인

LabHub 에서 이어서 보기

목표

검색창·좋아요·목록 새로고침에서 상태를 망가뜨리는 비동기 경합을 직접
막아 봅니다. 파일 하나에 함수 넷을 만듭니다.

왜 중요한가

동기 세계에서는 "마지막에 부른 것이 마지막에 반영된다" 가 공짜다. 비동기에서는
공짜가 아니다. 먼저 보낸 요청이 나중에 도착할 수 있고, 그때 상태를 고치는 자리에
순서 개념이 없으면 새 값이 옛 값으로 조용히 덮인다. 개발자 기계에서는 응답이
너무 빨라 재현되지 않기 때문에, 이런 버그는 사용자만 본다.

되돌리기도 마찬가지다. 낙관적 갱신을 역연산으로 되돌리면 그 사이에 들어온 다른
갱신까지 함께 날아간다. 되돌리기는 빼기가 아니라 **대기 목록에서 제거하고 다시
계산하는 일**이다. 이 실습이 그 차이를 손으로 만들게 한다.

만들 것

/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

참고

단계 8개

  1. 최신 우선 레인
  2. 취소 신호
  3. 열쇠별 중복 제거
  4. 되돌리기는 빼기가 아니다
  5. 서버 응답이 바닥값을 갈아 끼운다
  6. 낡음과 버림은 다른 눈금이다
  7. 직접 재서 적는다
  8. 무엇이 순서를 지켜 주었나