Today I Learned
Node.js란 Chrome V8 JavaScript 엔진으로 빌드된 JavaScript 런타임이다.
이벤트기반, 논 블로킹 I/O 모델을 사용해 가볍고 효율적인게 특징이다.
Node.js 패키지 생태계인 npm은 세계에서 가장 큰 오픈 소스 라이브러리 생태계이기도 하다.
간단하게 말해 Node.js는 JavaScript를 브라우저가 아닌 컴퓨터에서 브라우저 없이 실행하게 도와주는 환경이다.
이는 핵심적인 라이브러리와 V8엔진, 그리고 libuv라는 라이브러리를 통해 가능해진다.
1. 논 블로킹 I/O(Non-Blocking Input/Output)
블로킹 I/O
한번에 하나의 작업만을 처리 가능하다. 호출된 함수가 완료되기까지는 호출한 함수에게 제어권을 넘겨주지 않음. 그만큼 작업이 딜레이 된다!
논 블로킹 I/O
호출이 완료되기를 기다리지 않고 바로 다음 작업으로 넘어갈수있는 방식. 호출된 함수는 작업의 완료여부와 상관없이 즉시 제어권을 호출된 함수에게 반환한다.
2. 싱글 스레드(Single Thread)
싱글 스레드는 스레드 하나를 사용하는것, 동시에 하나의 작업만을 처리하는것을 의미한다.
Node.js는 싱글스레드로 동작하지만, I/O작업이 발생한 경우 이를 비동기적으로 처리해 여러작업을 동시에 처리할수있다.
그럼 간단하게 생각했을때는 multi thread가 좋을거같은데 왜 single thread를 고집하는것일까?
생각하는것과 다르게 싱글스레드 방식은 많은 이점을 제공한다. 스레드 생성과 관리에 드는 부담을 줄여주며, 컴퓨팅 리소스를 효율적으로 사용할수 있게 한다. 또한, 한번에 하나의 작업만 처리하기 떄문에 동시성 문제, 즉 여러 스레드가 공유하는 자원에 대한 동시접근 문제, 즉 Race condition 문제를 방지한다.
예를 들어, 웹 서버에서 동시에 많은 요청을 처리해야 하는 경우, 멀티스레드 방식을 사용하면 각 요청마다 스레드를 생성해야 하므로 오버헤드가 크게 발생한다. 반면에 Node.js의 싱글 스레드 + 이벤트 루프 방식을 사용하면, 동시에 많은 요청을 효율적으로 처리할수 있다.
이러한 특징 때문에 연결요청의 부하에 따른 서버확장이 매우 자유롭다. 그러나 CPU집중적인 작업에는 적합하지 않음을 알고있어야 한다.
3. 이벤트 루프(Event Loop)
이벤트 루프는 여러이벤트들과 같은 비동기 작업들을 모아서 관리하고, 어떤 순서대로 실행해야하는지 도와주는 도구이다. Call stack과 Event Queue를 관찰하면서, 호출 스택이 비어있고 이벤트 큐에 작업이 없다면, 이벤트 큐의 작업을 호출 스택으로 이동하는 역할을 담당한다. 이벤틀 루프를 이용한다면 자바스크립트는 시간이 오래걸리는 작업을 이벤트 큐에 넣어 비동기적으로 처리하고, 그 동안 호출 스택에서 다른작업들을 계속 처리할 수 있다.
'TIL' 카테고리의 다른 글
TIL #13) 개인프로젝트 진행 중 발생 오류 (2) | 2024.01.22 |
---|---|
TIL #12) REST API 배우며 잘 모르겠는것들 임시 저장 (0) | 2024.01.18 |
TIL #10) git으로 협업하기 (0) | 2024.01.09 |
TIL #9) 자바스크립트에서 실행 컨텍스트 (0) | 2024.01.08 |
TIL #8) 순수 JS를 이용해 fetch 사용하기 (0) | 2024.01.04 |