카테고리 없음
17주차 (1)
jaeoun0238
2025. 2. 17. 21:31
기회를 모두 소진시 삭제완료
Node.js는 single-threaded 기반 JS 런타임입니다. 이에 대해 아는 만큼 설명해주세요.
- Node.js는 non-blocking, asynchronous 기반 JS 런타임입니다. 이에 대해 아는 만큼 설명해주세요.
9. Node.js의 Single-Threaded, Non-Blocking, Asynchronous 특성
Single-Threaded
- 정의: Node.js는 자바스크립트 엔진(V8)을 기반으로 단일 메인 스레드에서 자바스크립트 코드를 실행합니다.
- 의미:
- 모든 자바스크립트 코드는 기본적으로 하나의 스레드에서 순차적으로 실행됩니다.
- 개발자가 직접 멀티스레드를 다루지 않아도 되며, 코드를 작성할 때 동시성 문제(경쟁 상태 등)를 상대적으로 단순하게 관리할 수 있습니다.
Non-Blocking & Asynchronous
- Non-Blocking (논블로킹):
- I/O 작업(파일 읽기/쓰기, 네트워크 요청 등)이 진행되는 동안 해당 작업이 완료될 때까지 스레드가 멈추지 않고 다른 작업을 계속할 수 있도록 설계되어 있습니다.
- 예를 들어, 파일을 읽는 요청을 보낸 후 결과가 올 때까지 다른 요청들을 처리할 수 있습니다.
- Asynchronous (비동기):
- I/O 작업이나 타이머, 데이터베이스 쿼리 같은 작업은 백그라운드에서 처리되며, 해당 작업이 완료되면 미리 등록된 콜백 함수가 호출됩니다.
- 이를 통해 긴 작업이 끝나기를 기다리는 동안 다른 작업들을 처리할 수 있으므로 서버의 효율이 크게 증가합니다.
- 내부 동작 메커니즘:
- Libuv: Node.js는 libuv라는 라이브러리를 사용하여 이벤트 루프와 스레드 풀(thread pool)을 구현합니다.
- CPU 집약적인 작업은 기본적으로 단일 스레드에서 실행되지만, I/O 관련 작업은 libuv가 제공하는 스레드 풀을 활용하여 비동기적으로 처리됩니다.
- 콜백/프라미스/async-await:
- 작업이 완료되면 미리 등록된 콜백이 호출되거나, 프라미스 혹은 async/await 문법을 통해 결과를 받아 처리합니다.
- Libuv: Node.js는 libuv라는 라이브러리를 사용하여 이벤트 루프와 스레드 풀(thread pool)을 구현합니다.
Node.js의 이벤트 루프란 무엇이고 왜 필요하며 어떻게 작동하는지 아는 만큼 설명해주세요.
10. Node.js의 이벤트 루프
이벤트 루프란?
- 정의:
- 이벤트 루프(Event Loop)는 Node.js의 핵심 메커니즘으로, 비동기 작업의 완료를 감지하고 등록된 콜백들을 호출하는 역할을 합니다.
- 왜 필요한가?
- 비동기 처리: Node.js는 논블로킹 I/O와 비동기 처리를 통해 높은 성능을 제공하기 때문에, 각 작업의 완료 시점을 효율적으로 관리할 필요가 있습니다.
- 자원 효율성: 단일 스레드에서 동시 다발적인 I/O 요청을 관리함으로써, 새로운 스레드를 생성하는 비용 없이 다수의 요청을 처리할 수 있습니다.
이벤트 루프의 작동 방식
- 1. 순환 구조:
- 이벤트 루프는 끊임없이 순환하며 등록된 이벤트나 콜백이 있는지 체크합니다.
- 2. 여러 단계(Phases)로 구성:
- Timers: setTimeout, setInterval 등으로 예약된 콜백이 실행됩니다.
- I/O Callbacks: 대부분의 I/O 관련 콜백이 실행됩니다.
- Idle, Prepare: 내부 준비 단계로, 개발자가 직접 접근하는 단계는 아닙니다.
- Poll: 새로운 I/O 이벤트를 확인하고, 실행할 콜백이 대기 중이면 처리합니다.
- Check: setImmediate로 예약된 콜백이 실행됩니다.
- Close Callbacks: 소켓 종료 등 클로즈 이벤트에 등록된 콜백을 처리합니다.
- 3. 우선순위 & 실행 순서:
- 각 단계마다 실행 우선순위가 정해져 있어, 특정 작업들은 다른 작업보다 먼저 처리됩니다.
- 예를 들어, setImmediate는 poll 단계가 끝난 후 check 단계에서 실행되므로, setTimeout보다 빠르게 실행될 수 있습니다(조건에 따라 다름).
- 예시:
- 위 코드는 실행 환경에 따라 순서가 달라질 수 있는데, 이벤트 루프의 단계에 따라 setImmediate가 먼저 실행되거나 setTimeout이 먼저 실행될 수 있습니다.
-
복사setTimeout(() => { console.log('setTimeout'); }, 0); setImmediate(() => { console.log('setImmediate'); });
- javascript
요약
- Node.js의 특징:
- Single-Threaded: 모든 자바스크립트 코드는 단일 스레드에서 실행되지만,
- Non-Blocking & Asynchronous: I/O 작업은 백그라운드 스레드 풀(libuv)을 통해 비동기적으로 처리되어 효율적입니다.
- 이벤트 루프:
- 역할: 비동기 작업의 완료를 감지하고, 적절한 시점에 콜백 함수를 실행하여 작업을 순차적으로 처리합니다.
- 필요성: 단일 스레드에서 다수의 I/O 요청을 효율적으로 처리하기 위해 필요하며, 다양한 단계로 구성되어 각 작업의 실행 시점을 관리합니다.