비슷한 개념이므로 한 번에 블로그에 정리해보려고 한다 (자바!=자바스크립트)
먼저 자바에서 스레드를 직접 생성해서 사용하다보면 성능 관리, 예외처리 문제, 결과를 받기 어려움의 문제가 있다
따라서, ExecutorService 기능을 제공하여 스레드 재사용을 돕고, Future를 통해 결과나 예외를 쉽게 관리할 수 있게 해준다.
submit() 메서드를 사용하면 Future 객체가 리턴되고 future.get() 으로 결과를 받을 수 있는데 get()은 작업이 끝날 때까지 현재 스레드를 블로킹하게 된다. 따라서, 이를 비동기적으로 실행하기 위해 CompletableFuture라는 클래스가 도입되었다. 이는 작업이 끝난 후에 로직을 미리 지정할 수 있는 체이닝 메서드를 제공하게 된다.
자바스크립트에도 CompletableFuture과 비슷한 역할을 하는 Promise 가 있다.
Promise는 미래에 완료/실패할 비동기 작업의 결과를 나타내는 객체로 기본적으로 아래와 같이 사용된다.
const promise = new Promise((resolve, reject) => {
// 비동기 작업 (예: 서버에 데이터 요청)
const success = true;
if (success) {
resolve("작업 성공");
} else {
reject("작업 실패");
}
});
그리고 아래 처럼 결과를 이어서 처리(체이닝)할 수 있다
promise
.then(result => {
console.log(result); // "작업 성공"
})
.catch(error => {
console.error(error); // "작업 실패"
});
주요 메서드에는 then(), catch(), finally()가 있으며
then()은 java의 thenApply(), thenAccept()와 비슷하고
catch()는 exceptionally()와 비슷하다
아 그리고 java에서 스레드 관리는 Executor나 ForkJoinPool을 사용하게 되는 반면에
Javascript는 브라우저 또는 Node.js 이벤트 루프가 진행한다.
그리고 Java 는 비동기 기본 실행 환경이 병렬 스레드 풀인 반면에 JavaScript는 이벤트 루프 기반 단일 스레드 비동기이다
자바스크립트가 싱글 스레드 기반이지만 비동기 처리를 할 수 있는 이유는 이벤트 루프 구조이기 때문이다
CallStack이 비었는지 확인하고, Microtask Queue를 확인하여 다 비울 때까지 처리하고 Macrotask Queue를 확인하여 하나만 실꺼내서 실행한다 그리고 다시 CallStack이 비었는지 확인하게 된다
console.log("A");
setTimeout(() => console.log("B"), 0);
Promise.resolve()
.then(() => console.log("C"))
.then(() => console.log("D"));
console.log("E");
// A E C(마이크로) D(마이크로) B(메크로)
javascript에서 비동기 흐름을 효과적으로 설계하려면,
빠르게 처리할 후속 로직은 then()으로 묶어서 microtask로 실행되도록 설계하고
시간이 오래 걸리거나 외부 리소스와 연동되는 작업은 macrotask 에 위임하면 된다
아 그렇다면 microtask로 들어가는 작업들에는 무엇이 있는지 나열해보자
Promise.then() : 비동기 완료 후 실행도리 콜백
async/await의 await이후 로직 : 내부적으로 Promise 기반
MutationObserver : DOM 변경 감지 API
queueMicrotask() : 명시적을로 마이크로태스크 예약
macrotask 로 들어가는 작업에는 setTimeout, 브라우저 이벤트, 네트워크, 파일시스템 등이 있다.
[웹 질문 정리] HTML, RESTful API, HTTP 메소드, Webpack과 Babel, MVC패턴과 MVVM 패턴 그리고 Flux패턴 (0) | 2024.12.16 |
---|---|
[CSS] 직면하며 배우는 CSS (1) : overflow, position 속성 (0) | 2024.09.02 |
[리액트] 공식문서 읽기 : useContext (0) | 2024.07.15 |
Webpack ? (0) | 2024.07.03 |
[우아한 타입스크립트 with 리액트] 타입의 세계 : 타입스크립트만의 독자적 타입 시스템 (0) | 2024.06.30 |