2021-01-26-TIL
2021-01-26-TIL
문제를 작게 만들어 구현하기
동기적인 표현이 비동기적인 표현보다는 이해가 쉬우므로 코드도 그런식으로 작성한다.
간단한 시나리오를 먼저 구현해보는 것도 좋은 방법이다.
큰 뼈대를 먼저 만들고나서 살을 붙이면서 수정해나간다.
문제를 추상화시키고 축소시켜서 작성한다. lean startup
네 문장은 같은 방향을 가리킨다. 처음부터 모든 경우를 처리하는 완성품을 만들려 하지 말고, 가장 단순한 경로 하나가 끝까지 동작하게 만든 뒤 넓혀 가는 것이다. 린 스타트업에서 최소한의 제품을 먼저 내놓고 피드백으로 고쳐 가는 방식과 닮았다. 비동기 코드도 마찬가지로, 콜백이 얽힌 형태로 바로 쓰기보다 위에서 아래로 읽히는 순서로 흐름을 먼저 정리해 두면 이해하기 쉽다.
싱글 스레드인 JavaScript가 비동기를 처리하는 방법
- 이벤트 루프와 매크로·마이크로태스크 - javascript.info
- If JavaScript Is Single-Threaded, How Is It Asynchronous? - DEV Community
- 싱글스레드 기반 JS의 비동기 처리 방법 - hudi.kr
JavaScript 코드는 하나의 호출 스택에서 실행된다. 그런데도 네트워크 요청을 기다리는 동안 화면이 멈추지 않는 이유는 이벤트 루프 때문이다. MDN은 실행 모델을 세 가지로 설명한다. 함수 호출이 쌓이는 스택, 객체가 할당되는 힙, 그리고 실행을 기다리는 작업(콜백)이 줄 서는 큐다. 이벤트 루프는 스택이 비면 큐에서 다음 작업을 하나 꺼내 실행한다.
MDN은 이 구조를 “Each job is processed completely before any other job is processed.”라고 요약한다. 작업 하나는 끝까지 실행되고, 그동안 다른 작업이 끼어들지 않는다는 뜻이다. fetch() 같은 I/O는 브라우저가 따로 처리하고, 끝나면 결과를 처리할 콜백이 큐에 들어간다. 그래서 응답을 기다리는 동안에도 사용자 입력을 처리할 수 있다. 반대로 한 작업이 오래 걸리는 계산을 하면 그동안 큐의 다른 작업은 모두 기다려야 한다.
동기와 비동기, 블로킹과 논블로킹을 구분하는 내용은 동기·비동기 강의 정리에 따로 정리했다.
온라인 강의에서 질문 받기
zoom + slido 채팅창과 질문창을 따로 구분해서 강사가 질문큐를 처리할 수 있도록
채팅창에는 잡담과 질문이 섞여 흘러가므로 강사가 질문을 놓치기 쉽다. 질문만 따로 모으는 도구를 두면 강사는 쌓인 질문을 순서대로 꺼내 답할 수 있다. 위의 작업 큐와 같은 구조다.
CompletableFuture
Java에서 비동기 작업의 결과를 다루는 클래스다. Javadoc에 따르면 CompletableFuture는 명시적으로 완료시킬 수 있는 Future이면서 CompletionStage를 구현해, 작업이 끝났을 때 이어서 실행할 동작을 연결할 수 있다. supplyAsync()로 작업을 시작하고 thenApply()로 결과를 변환하는 식으로 콜백을 중첩하지 않고 위에서 아래로 이어 쓴다. 실행기(Executor)를 따로 주지 않은 비동기 메서드는 ForkJoinPool.commonPool()에서 실행된다.
1
2
3
4
5
6
CompletableFuture<String> result =
CompletableFuture.supplyAsync(() -> "Hello")
.thenApply(s -> s + " World")
.thenApply(String::toUpperCase);
System.out.println(result.join()); // HELLO WORLD
join()은 결과가 나올 때까지 기다리므로, 실제 비동기 흐름에서는 마지막에만 쓰거나 아예 쓰지 않고 다음 단계로 넘긴다.
댓글
아직 댓글이 없습니다