이벤트 루프와 비동기 통신의 이해

shooting star·2024년 7월 10일
post-thumbnail

이벤트 루프와 비동기 통신의 이해

자바스크립트는 싱글 스레드에서 작동하는 언어입니다. 즉, 기본적으로 자바스크립트는 한 번에 하나의 작업만 동기 방식으로 처리할 수 있습니다. 동기 작업은 직렬 방식으로 처리되며, 한 작업이 끝난 후에야 다음 작업을 진행할 수 있습니다. 이러한 방식은 개발자에게 직관적이지만, 동시에 많은 작업을 처리하기 어렵다는 단점이 있습니다.

반면 비동기 작업은 병렬 방식으로 처리되며, 한 작업이 완료되기를 기다리지 않고 다음 작업을 진행할 수 있습니다. 그렇다면 자바스크립트 환경에서 비동기 작업은 어떻게 가능한 것일까요? 이를 이해하려면 이벤트 루프와 비동기 처리에 대한 개념을 알아야 합니다.

이벤트 루프란 무엇인가?

이벤트 루프는 자바스크립트 런타임 외부에서 비동기 실행을 돕기 위해 만들어진 장치입니다. 자바스크립트는 호출 스택(call stack)과 이벤트 루프(event loop)를 통해 비동기 작업을 처리합니다.

호출 스택과 이벤트 루프

호출 스택은 자바스크립트에서 수행해야 할 코드나 함수를 순차적으로 담은 스택입니다. 코드가 실행되면 호출 스택에 쌓이고, 실행이 완료되면 스택에서 제거됩니다.

이와 함께 태스크 큐(task queue)라는 개념이 등장합니다. 태스크 큐는 실행해야 할 태스크의 집합을 의미하며, 이벤트 루프는 이러한 태스크 큐를 관리합니다. 자바스크립트 코드 실행이 싱글 스레드에서 이루어지지만, 비동기 작업은 태스크 큐와 이벤트 루프를 통해 관리됩니다.

비동기 작업의 처리 과정

비동기 작업이 발생하면 해당 작업은 웹 API나 Node.js API를 통해 처리됩니다. 작업이 완료되면 콜백 함수가 태스크 큐에 추가됩니다. 이벤트 루프는 호출 스택이 비어 있을 때 태스크 큐에서 콜백을 꺼내 실행합니다. 이렇게 하면 자바스크립트는 싱글 스레드 환경에서도 비동기 작업을 효과적으로 처리할 수 있습니다.

예제 코드: 비동기 작업 이해하기

다음은 자바스크립트의 비동기 작업을 이해하기 위한 간단한 예제입니다:

console.log('1. 시작');

// 비동기 작업 예제: setTimeout을 사용한 타이머
setTimeout(() => {
    console.log('3. 비동기 작업 완료');
}, 2000);

console.log('2. 끝');

위 코드는 다음과 같은 순서로 실행됩니다:
1. console.log('1. 시작');이 호출 스택에 쌓이고 즉시 실행됩니다.
2. setTimeout 함수가 호출 스택에 쌓이고, 2초 후 콜백 함수를 태스크 큐에 추가하는 비동기 작업을 시작합니다.
3. console.log('2. 끝');이 호출 스택에 쌓이고 즉시 실행됩니다.
4. 2초 후, setTimeout의 콜백 함수가 태스크 큐에서 호출 스택으로 이동하여 실행됩니다.

이러한 순서로 인해 콘솔 출력은 다음과 같습니다:

1. 시작
2. 끝
3. 비동기 작업 완료

동시성 문제와 비동기 처리

자바스크립트는 DOM 조작 시 동시성 문제를 방지하기 위해 싱글 스레드 방식을 유지합니다. 만약 여러 스레드가 동시에 DOM을 조작할 수 있다면 타이밍 이슈로 인해 브라우저의 DOM 표시가 엉망이 될 수 있습니다. 자바스크립트는 'Run-to-Completion' 특징을 가지고 있어 하나의 코드가 실행되는 동안 다른 코드는 대기하게 됩니다.

하지만 자바스크립트는 비동기 처리를 통해 동시성 문제를 해결합니다. 이벤트 루프, 태스크 큐, 마이크로 태스크 큐, 그리고 웹 API 등의 생태계를 통해 비동기 작업을 효율적으로 처리합니다.

예제 코드: 비동기 요청 처리하기

다음은 비동기 요청을 처리하는 예제입니다:

function fetchData() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('데이터 가져오기 완료');
        }, 3000);
    });
}

console.log('1. 데이터 요청');

fetchData().then((data) => {
    console.log(`3. ${data}`);
});

console.log('2. 다른 작업');

이 코드의 실행 순서는 다음과 같습니다:
1. console.log('1. 데이터 요청');이 호출 스택에 쌓이고 즉시 실행됩니다.
2. fetchData 함수가 호출되고, 3초 후 데이터를 반환하는 비동기 작업을 시작합니다.
3. console.log('2. 다른 작업');이 호출 스택에 쌓이고 즉시 실행됩니다.
4. 3초 후, fetchDatathen 메서드에 전달된 콜백 함수가 태스크 큐에서 호출 스택으로 이동하여 실행됩니다.

콘솔 출력은 다음과 같습니다:

1. 데이터 요청
2. 다른 작업
3. 데이터 가져오기 완료

결론

자바스크립트는 싱글 스레드에서 동작하지만, 비동기 작업을 통해 효율적으로 여러 작업을 동시에 처리할 수 있습니다. 이벤트 루프와 태스크 큐는 이러한 비동기 작업을 관리하며, 개발자가 더욱 매끄러운 웹 애플리케이션 서비스를 제공할 수 있도록 돕습니다. 이를 통해 자바스크립트는 싱글 스레드의 한계를 극복하고 비동기 이벤트 처리가 가능한 강력한 언어로 자리 잡았습니다.

0개의 댓글