블로킹(blocking)
- 작업을 실행시키는 방식 중 하나
- 하나의 작업을 실행시킨 후 해당 작업이 끝날 때까지 기다린 후에 다음 작업을 실행시킨다.
- 실행시킨 작업이 길어지면 다음 작업이 지연이 되는 문제
논블로킹(non-blocking)
- 하나의 작업을 실행시키고 그 작업이 마치지 않아도 다음 작업을 실행하는 실행 방식
- "작업을 실행시켜 놓기만 하는 행위"
- 실행시킨 작업이 길어져도 다음 작업이 지연이 되는 문제가 없다 - 비동기(Asynchronous)로 작업을 실행시킨 경우 논블로킹 방식
- 블로킹 예시: 파일 읽기 작업을 호출하면 해당 작업이 완료될 때까지 다른 작업을 할 수 없습니다.
const fs = require('fs');
console.log('블로킹 파일 읽기 시작');
try {
// 파일을 동기적으로 읽습니다. 이 작업이 완료될 때까지 다른 작업은 수행되지 않습니다.
const data = fs.readFileSync('example.txt', 'utf8');
console.log('파일 내용:', data);
} catch (err) {
console.error('파일 읽기 중 오류 발생:', err);
}
console.log('블로킹 파일 읽기 끝');
- 논블로킹 예시: 파일 읽기 작업을 호출하고, 해당 작업이 완료되지 않아도 다른 작업을 계속 수행할 수 있습니다. 파일 읽기 작업이 완료되면 콜백 함수나 이벤트를 통해 결과를 처리합니다.
const fs = require('fs');
console.log('논블로킹 파일 읽기 시작');
// 파일을 비동기적으로 읽습니다. 이 작업이 완료되지 않아도 다음 작업이 수행됩니다.
fs.readFile('example.txt', 'utf8', (err, data) => {
if (err) {
return console.error('파일 읽기 중 오류 발생:', err);
}
console.log('파일 내용:', data);
});
console.log('논블로킹 파일 읽기 끝');
Node.js의 비동기 I/O와 스레드 풀
Node.js는 싱글 스레드 기반의 Non-Blocking/Asynchronous입니다. 비동기 I/O 작업을 통해 요청들을 서로 블로킹하지 않고 즉, 동시에 많은 요청들을 비동기로 수행함으로써 싱글스레드일지라도 논블로킹이 가능합니다.
기술적으로 논블로킹 방식은 싱글스레드만으로 불가능합니다. 하지만 Node.js는 항상 싱글 스레드 방식으로 동작하지 않기때문입니다. 일부 블로킹 작업들은 libuv의 스레드 풀에서 수행되기 때문입니다.
스레드 풀이란?
Node.js의 fs 모듈은 파일 시스템 관련 작업을 비동기 방식으로 처리합니다. 이는 여러 개의 파일 작업을 동시에 처리할 수 있는 장점을 제공합니다. 이러한 작업들을 백그라운드에서 스레드 풀을 이용하여 처리합니다.
스레드 풀은 여러 작업을 동시에 처리할 수 있도록 스레드를 효율적으로 관리하는 메커니즘입니다. 각 작업은 독립적으로 백그라운드 스레드에서 실행되며, 메인 스레드는 블로킹되지 않고 다른 작업을 계속할 수 있습니다. 스레드 풀의 크기는 너무 크게 설정하면 스레드 간의 컨텍스트 스위칭 오버헤드가 발생하여 성능 저하가 발생할 수 있습니다. 따라서 Node.js에서는 이러한 스레드 풀의 크기를 환경 변수를 통해 조정할 수 있어, 애플리케이션의 성능을 최적화할 수 있습니다. 이 설계 덕분에 Node.js는 단일 스레드로 동작하면서도 높은 동시성을 제공할 수 있는 특징을 가지고 있습니다.
'Framework > Node.js' 카테고리의 다른 글
[Node.js] Naver Oauth로 로그인 구현해보기 (0) | 2024.07.25 |
---|---|
[node.js] JWT에서 Refresh Token의 필요성 (0) | 2024.07.05 |
[node.js] JWT(Json Web Token)토큰 사용해보기 (2) | 2024.07.04 |