티스토리 뷰
Node.js는 대표적으로
논 블로킹(Non-blocking) I / O, 싱글 스레드(Single Thread), 이벤트 루프(Event Loop)의 특성이 있습니다.
논 블로킹 I / O(Non-Blocking Input / Output)
블로킹 I/O와 논블로킹 I/O는 프로그램의 실행 흐름을 제어하는 방식입니다.
블로킹 방식
- 프로그램이 특정 작업을 수행하는 동안 다른 작업을 중단시키는 방식입니다.
논블로킹 방식
- 프로그램이 여러 작업을 동시에 처리할 수 있는 장점이 있습니다.
I/O
- 데이터의 입력(Input) / 출력(Output)을 의미하며 파일을 저장하거나, 불러오는 것을 I/O처리한다라고 합니다.
블로킹 I/O
● 한번에 하나의 작업만을 처리할 수 있으며,
호출된 함수가 자신의 작업을 모두 마칠 때 까지 호출한 함수에게 제어권을 넘겨주지 않습니다.
EX) 파일을 읽는 동안에는 다른 작업을 함께 수행할 수 없습니다.

논 블로킹 I/O
● 시스템 호출이 완료되기를 기다리지 않고 바로 다음 작업으로 즉시 넘어갈수 있는 방식입니다.
호출된 함수는 작업의 완료 여부와 상관없이 즉시 제어권을 호출한 함수에게 반환합니다.
EX) 파일을 읽는 동안에도 동시에 연산을 하는 것 처럼 다른 작업을 함께 수행할 수 있습니다.

블로킹I/O와 논블로킹I/O, 동기식과 비동기식의 차이
이렇게 설명을 들으면 블로킹이 동기식 같고 논 블로킹이 비동기식 같습니다.
하지만 동기-비동기, 블로킹-논블로킹은 개념이 다르다고 합니다.
■ 동기 - 비동기는 함수의 제어권으로 인해 함수의 진행 여부와는 상관이 없는
프로세스의 수행 순서 보장에 대한 메커니즘 입니다.
• 동기(Synchronous) : 호출한 함수의 반환값을 계속해서 신경쓴다.
• 비동기(Asynchronous) : 호출한 함수의 반환값을 신경 쓰지 않는다.

■ 동기 - 블로킹 : 일반적인 읽기/쓰기 , 자바의 대부분의 코드 작동 방식
■ 비동기 - 논블로킹 : 자바 스크립트의 fetch, seTimeOut과 같은 비동기 함수
■ 동기 - 논블로킹 : 맵데이터를 불러오는 동안 로딩바가 변하는 작업
(화면을 구성하는 함수와 상관없이 계속해서 맵함수의 작업을 진행하지만
로딩함수가 맵의 얼만큼 로딩했는지 지속적으로 확인 하기 때문)
■ 비동기 - 블로킹 : 데이터 베이스에 접근하는경우?
이해 한지는 모르겠지만 확실한건 동기-비동기와, 블로킹-논블로킹이 서로 다른 개념인건 알고 가는것 같습니다.
싱글 스레드(Single Thread)
■ 싱글 스레드는 스레드 하나를 사용하는 것이며 동시에 하나의 작업만을 처리할 수 있음을 의미합니다.
■ Node.js는 싱글 스레드로 동작하지만,
I/O작업이 발생한 경우 이를 비동기적으로 처리하여 여러 작업을 동시에 처리할 수 있게 합니다.
■ 스레드 생성과 관리에 드는 부담을 줄여주며, 컴퓨팅 리소스를 효율적으로 사용할 수 있게 하고
한번에 하나의 작업만 처리하기 때문에 여러 스레드가 공유하는 자원에 대한 동시성문제(Racecondition)를 방지합니다.
■ 싱글 스레드 + 이벤트 루프 방식을 사용하여 동시에 많은 요청을 효율적으로 처리할 수있고
이러한 연결 요청의 부하에 따른 서버 확장이 매우 자유롭습니다.
스레드란?
- 프로그램이 동작할 때, CPU 또는 프로세스를 사용하는 단위 즉, 프로세스 내에서 실행되는 최소 실행 기본 단위
- 여러 스레드를 사용하면 여러 작업을 동시에 처리가능
- 동시성(Concurrency)을 구현하기 위한 방법 중 하나
- 각 프로세스는 하나 이상의 스레드를 가질 수 있으며 스레드들은 프로세스 내의 자원을 공유하면서 동작
- 여러 작업을 동시에 처리할 수 있어 비동기적 프로그래밍을 지원하며 효율적인 다중 작업 처리가 가능
but 복잡성을 증가시키고 리소스를 더욱 많이 소모하게 되므로 주의가 필요함.
즉, 스레드는 경량화된 프로세스
호출 스택(Call Stack)
■ 함수의 실행 순서를 추적하는 자료구조입니다.
- Js는 코드를 실행하면서 호출 스택에 함수를 추가하고 함수가 완료 되면 호출 스택에서 제거합니다.
이러한 작업은 비동기 작업에서 문제가 되는데 네트워크요청과 같은 시간이 많이 걸리는 작업을 기다리는 동안
Js는 다른 어떠한 작업도 처리할 수 없게 됩니다.
이 문제를 해결하기 위해 이벤트 루프와 이벤트 를 사용하게 됩니다.

이벤트 루프(Event Loop)
■ 여러 이벤트들과 같은 비동기 작업들을 모아서 관리하고, 어떤 순서대로 실행해야하는지 도와주는 도구입니다.
■ 호출스택과 이벤트 큐를 관찰하면서 호출 스택이 비어있고,
이벤트 큐에 작업이 있다면, 이벤트 큐의 작업을 호출 스택으로 이동 한느 역할을 담당 합니다.
■ 이벤트 루프를 활용 한다면, Js는 시간이 오래 걸리는 작업을 이벤트 큐에 넣어 비동기 적으로 처리하고,
그동안 호출 스택에서 다른 작업들을 계속 처리할 수 있습니다.

function firstFunction() {
console.log('firstFunction 입니다.');
secondFunction();
}
function secondFunction() {
setTimeout(function () {
console.log('secondFunction 입니다.');
}, 2000);
}
firstFunction();
console.log('전역 코드 실행 중!');
// firstFunction 입니다.
// 전역 코드 실행 중!
// secondFunction 입니다.
firstFunction()은 호출 스택에 추가(push)되고, 실행되며 ‘firstFunction 입니다.’를 콘솔에 출력하고
secondFunction()을 호출 합니다.
그 다음 secondFunction()은 호출 스택에 추가되고, setTimeout()을 실행합니다.
setTimeout()은 비동기 함수이므로,
JavaScript는 이 작업을 이벤트 큐에 넣고 secondFunction()을 호출 스택에서 제거(pop)합니다.
그 다음 firstFunction()도 호출 스택에서 제거하고, ‘전역 코드 실행 중!’을 콘솔에 출력합니다.
2초가 지난 후, ‘secondFunction 입니다.’를 출력하는 작업이 이벤트 큐에서 호출 스택으로 이동하고 실행됩니다.
이때 호출 스택은 비어 있기 때문에 이벤트 루프가 이 작업을 호출 스택으로 이동시킬 수 있었습니다.
이처럼, 이벤트 루프와 이벤트 큐를 사용함으로써 JavaScript는 비동기 작업을 처리할 수 있게된 것입니다.
'프로그래밍 기초 > Node.js' 카테고리의 다른 글
미들웨어란? (0) | 2024.01.30 |
---|---|
REST API구현하기 [할일 메모 사이트] (1) | 2024.01.29 |
Express.js의 req, res 객체 (0) | 2024.01.24 |
REST API 만들어보기(데이터 베이스 X) (0) | 2024.01.18 |
vscode yarn 실행 오류 (1) | 2024.01.17 |