Node.js 인터뷰 질문 6
질문: Node.js에서 "논 블로킹(Non-blocking)"의 의미를 설명해주세요.
답변:
Node.js에서 "논 블로킹(Non-blocking)"은 I/O 작업이 완료될 때까지 프로그램의 실행을 중단하지 않는 방식을 의미합니다. 이는 Node.js의 핵심 특징 중 하나로, 높은 성능과 확장성의 기반이 됩니다.
블로킹 vs 논 블로킹
블로킹(Blocking):
// 블로킹 방식 예제
const fs = require("fs");
const data = fs.readFileSync("/path/to/file.txt"); // 이 라인에서 파일 읽기가 완료될 때까지 실행이 중단됨
console.log(data);
console.log("파일 읽기 완료 후 실행");
논 블로킹(Non-blocking):
// 논 블로킹 방식 예제
const fs = require("fs");
fs.readFile("/path/to/file.txt", (err, data) => {
if (err) throw err;
console.log(data);
});
console.log("파일 읽기를 요청했지만, 이 코드는 즉시 실행됨");
논 블로킹의 작동 원리
- 콜백 함수: 작업이 완료되면 호출될 함수를 제공합니다.
- 이벤트 루프: 비동기 작업을 관리하고 완료 시 콜백을 실행합니다.
- libuv: Node.js의 기반 라이브러리로, 비동기 I/O 작업을 효율적으로 처리합니다.
논 블로킹의 장점
- 높은 처리량: 하나의 작업이 I/O를 기다리는 동안 다른 요청을 처리할 수 있습니다.
- 확장성: 적은 수의 스레드로 많은 연결을 처리할 수 있습니다.
- 효율적인 리소스 활용: CPU와 메모리를 효율적으로 사용합니다.
논 블로킹의 발전
현대 Node.js에서는 콜백보다 더 깔끔한 비동기 코드를 작성할 수 있는 방법들이 있습니다:
Promise:
const fs = require("fs").promises;
fs.readFile("/path/to/file.txt")
.then((data) => {
console.log(data);
})
.catch((err) => {
console.error(err);
});
console.log("파일 읽기 요청 후 즉시 실행");
Async/Await:
const fs = require("fs").promises;
async function readFile() {
try {
const data = await fs.readFile("/path/to/file.txt");
console.log(data);
} catch (err) {
console.error(err);
}
}
readFile();
console.log("readFile 함수 호출 후 즉시 실행");
논 블로킹 I/O는 Node.js가 웹 서버, API 서버, 실시간 애플리케이션과 같은 I/O 집약적인 응용 프로그램에 이상적인 선택이 되게 합니다.