cs 공부

Node.js는 non-blocking, asynchronous 기반 JS 런타임입니다. 이에 대해 아는 만큼 설명

늘곰's 2023. 10. 15. 21:52

 

논블로킹(non-blocking)

블로킹과 논블로킹을 비교해보겠습니다.

블로킹 vs. 논블로킹:

블로킹 (Blocking): 블로킹 작업은 작업이 완료될 때까지 다른 작업을 수행할 수 없는 작업입니다. 이러한 작업은 시스템 리소스를 소모하고 애플리케이션의 응답 시간을 늦추는 원인이 될 수 있습니다.

논블로킹 (Non-blocking): 논블로킹 작업은 작업이 진행되는 동안 다른 작업을 계속 수행할 수 있는 작업입니다. 이를 통해 애플리케이션은 I/O 작업이 완료될 때까지 기다리지 않고 다른 작업을 처리할 수 있으며, 응답 시간이 향상됩니다.

 

node.js 는 논블로킹  I/O 방식을 사용중입니다.

여기서  I/O는 인풋(input)과 아웃풋(output)을 나타냅니다.

 

차단 vs. 논블로킹 I/O:

차단 I/O (Blocking I/O): 차단 I/O 작업은 작업이 완료될 때까지 다른 코드 실행을 차단하는 방식입니다. 예를 들어, 파일을 읽을 때 파일의 모든 내용을 읽을 때까지 아무것도 할 수 없고, 프로그램이 I/O 작업이 완료될 때까지 기다립니다.

 

논블로킹 I/O (Non-blocking I/O): 논블로킹 I/O 작업은 작업을 시작한 후 즉시 다른 작업을 수행할 수 있는 방식입니다. I/O 작업이 완료되지 않았더라도 프로그램은 차단되지 않으며, I/O 작업이 완료되면 프로그램에 알림을 보내거나 콜백 함수를 호출하여 결과를 처리합니다.

 

 

node.js의 논블로킹 I/O

Node.js는 I/O 작업을 논블로킹 방식으로 처리합니다. 이는 파일 읽기, 데이터베이스 쿼리, 네트워크 호출과 같은 I/O 작업이 진행 중일 때 애플리케이션의 실행이 차단되지 않음을 의미합니다. 대신, I/O 작업은 백그라운드에서 비동기적으로 처리되며, 완료되면 콜백 함수가 호출됩니다.

 

예시: 웹 서버에서의 논블로킹 I/O의 예로, 클라이언트로부터 요청이 들어올 때 파일을 읽는 작업을 생각해보겠습니다. 논블로킹 I/O를 사용하면 파일 읽기 작업이 완료될 때까지 서버가 다른 클라이언트 요청을 처리할 수 있으며, 대기 시간이 줄어듭니다.

 

Node.js는 이러한 논블로킹 I/O와 비동기 프로그래밍 모델을 사용하여 I/O 작업을 효율적으로 처리합니다. 이를 통해 Node.js 애플리케이션은 높은 동시성과 응답성을 제공할 수 있으며, 여러 클라이언트 요청을 효과적으로 처리할 수 있습니다.

 

// 블로킹 예시
const fs = require('fs');
const data = fs.readFileSync('/file.md'); // 파일을 읽을 때까지 여기서 블로킹됩니다.
console.log(data);
moreWork();
// moreWork 는 console.log(data)가 실행되고 실행됩니다.
// 논 블로킹 예시
const fs = require('fs');
fs.readFile('/file.md', (err, data) => {
  if (err) throw err;
  console.log(data);
});
moreWork();
// moreWork();는 console.log 이전에 실행될 것입니다.

 

 

Node.js에서의 비동기 (asynchronous)

Node.js에서의 비동기 (asynchronous) 프로그래밍은 중요한 개념 중 하나로,

이것은 I/O 작업 및 이벤트 처리와 같은 작업을 동시에 처리하고 응답성을 향상시키기 위해 사용됩니다.

 

Callback (콜백): 비동기 작업은 종종 콜백 함수를 사용하여 처리됩니다. 콜백은 작업이 완료되면 호출되는 함수로, 작업이 완료되면 해당 콜백 함수가 실행됩니다. 이를 통해 작업이 진행 중일 때 다른 작업을 수행할 수 있습니다.

 

이벤트 루프 (Event Loop): Node.js는 이벤트 루프를 사용하여 비동기 작업과 이벤트 처리를 관리합니다. 이벤트 루프는 이벤트 큐에서 이벤트를 가져와 해당 이벤트에 등록된 콜백 함수를 실행합니다. 이를 통해 비동기 작업의 스케줄링과 실행을 관리합니다.

 

비동기 함수: Node.js의 내장 모듈 및 라이브러리에서는 비동기 함수를 사용하여 I/O 작업을 처리합니다. 이러한 함수는 작업을 시작한 후 즉시 반환하고, 작업이 완료되면 콜백 함수를 호출합니다. 일반적인 예로는 fs.readFile, http.get, setTimeout 등이 있습니다.

 

비동기 프로그래밍은 Node.js 애플리케이션에서 블로킹 작업을 최소화하고, 다중 작업을 효율적으로 처리하는 데 중요합니다. 이를 통해 높은 동시성과 응답성을 제공하며, 애플리케이션이 느려지거나 차단되지 않도록 합니다.

 

const fs = require('fs');

// 비동기 파일 읽기
fs.readFile('파일경로', 'utf8', (err, data) => {
    if (err) {
        console.error('파일을 읽는 중 에러 발생:', err);
        return;
    }
    console.log('파일 내용:', data);
});

console.log('파일 읽기 요청 완료.'); // 이 줄은 읽기 작업이 완료되기 전에 실행됩니다.

위의 예시에서 fs.readFile 함수는 파일을 비동기적으로 읽습니다. 파일 읽기 작업이 완료되면 콜백 함수가 실행됩니다. 이때 파일 읽기 요청은 즉시 반환되므로 "파일 읽기 요청 완료." 메시지는 파일 읽기 작업이 완료되기 전에 표시됩니다.