비동기 반복은 값의 도착 시점과 소비자의 처리 속도를 맞추는 계약이다
파일, 웹소켓, DB 커서는 모양은 달라도
next()가
Promise를 돌려주고 for await가 값을 하나씩 기다린다는
점이 같다.
생산자
[Symbol.asyncIterator]()와
next(): Promise<IteratorResult<T>>
소비자value는 T로 좁혀지고 done은 반복 종료를
알린다.
중단루프의 break는 연결, 커서, 스트림 정리 지점을 함께
설계하게 만든다.
| 대상 | 생산 값 | 소비 방식 | 설계 포인트 |
|---|---|---|---|
| 파일 스트림 |
AsyncGenerator<string>로 줄 단위 문자열을 낸다.
|
파일 전체를 메모리에 올리지 않고 준비된 줄만 처리한다. | 읽기 오류와 파일 닫기를 반복 종료와 같이 본다. |
| 웹소켓 |
AsyncIterable<Message>가 도착 순서대로 메시지를
준다.
|
루프 안에서 메시지를 처리하고 필요하면 중간에 멈춘다. | 느린 소비자가 연결 버퍼를 밀어 올리지 않게 한다. |
| DB 커서 |
AsyncGenerator<Row[]>가 페이지 단위 결과를
낸다.
|
대량 결과를 작은 묶음으로 순차 처리한다. | 커서 닫기, 트랜잭션 범위, 취소 신호를 함께 둔다. |
| 작업 큐 | 비동기 작업 결과나 진행 이벤트를 순서대로 노출한다. | 처리량을 루프 본문 속도로 자연스럽게 제한한다. | 재시도, 실패 전파, 종료 신호를 타입에 드러낸다. |
next Promise다음 값이 아직 없으면 대기 상태 자체가 계약이 된다.
for await루프 변수는
AsyncIterable<T>의 T로
추론된다.
Backpressure소비 속도가 생산자에게 압력으로 전달되도록 설계한다.
Cleanup중단과 예외가 자원 해제로 이어지는지 확인한다.