⚡️ Node.js란?
Chrome V8 JavaScript 엔진으로 빌드된 자바스크립트 런타임(환경)
- 웹 브라우저 밖에서도 자바스크립트를 실행할 수 있는 환경
- 즉, JavaScript 를 웹 브라우저에서 독립시킨 것으로 Node.js를 설치하게 되면 터미널에서 Node.js를 입력하여 브라우저 없이 다양한 자바스크립트 애플리케이션을 바로 실행할 수 있다.
- Non-blocking I/O와 싱글 스레드 이벤트 루프를 통한 높은 처리 성능을 가지고 있는 것이 특징이다.
- 그외에도 Apache HTTP Server 또는 IIS와 같은 소프트웨어 없이 웹 서버의 역할을 할 수 있도록 하는 내장 라이브러리를 포함하고 있다.
- 그래서 자바스크립트로 서버를 개발하는 것도 Node.js를 이용하면 가능하다.
❗️ 이벤트 기반
- 노드는 V8과 더불어 libuv라는 라이브러리를 사용한다.
- libuv 라이브러리는 노드의 특성인 이벤트 기반, 논 블로킹 I/O 모델을 구현하고 있다.
- 이벤트 기반(Event-driven)이란 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식을 의미한다.
- 즉, 이벤트 기반 시스템에서는 특정 이벤트가 발생할 때 무엇을 할지 미리 등록해두고, 이를 이벤트 리스너에 콜백함수를 등록한다.
- 이후 이벤트가 발생하면 리스너에 등록해둔 콜백함수를 호출하며, 이벤트가 끝난 후 노드는 다음 이벤트가 발생할 때까지 대기한다.
✨ 이벤트 루프
- 이벤트 루프(event loop)는 여러 이벤트가 동시에 발생했을 때 어떤 순서로 콜백함수를 호출할지를 판단한다.
- 노드는 이벤트가 종료될 때까지 이벤트 처리를 위한 작업을 반복
- 이벤트 루프를 잘 활용하면 오래 걸리는 작업을 효율적으로 처리할 수 있다.
❗️ 논 블로킹 I/O
- 작업에는 두 가지 종류가 있는데 동시에 실행될 수 있는 작업과 동시에 실행될 수 없는 작업이다.
- 특히 파일 시스템 접근, 네트워크를 통한 요청 작업은 입력(Input)/출력(Output)의 일종이며,이러한 작업을 할 때 노드는 논 블로킹 방식으로 처리한다.
- 논블로킹이란 이전 작업이 완료될 때까지 대기하지 않고 다음 작업을 수행하는 것을 의미한다.
- 반대로 블로킹은 이전 작업이 끝나야만 다음 작업을 수행한다.
✨ 싱글 스레드
- 자바스크립트 코드는 동시에 실행될 수 없는데 그 이유는 싱글 스레드 프로그래밍 언어이기 때문이다.
- 프로세스 : 운영체제에서 할당하는 작업의 단위이다. 노드나 웹 브라우저 같은 프로그램은 개별적인 프로세스이다. 프로세스 간에는 메모리 등의 자원을 공유하지 않는다
- 스레드 : 스레드는 프로세스 내에서 실행되는 흐름의 단위이다. 프로세스는 스레드를 여러 개 생성해 여러 작업을 동시에 처리할 수 있다. 스레드들은 부모 프로세스의 자원을 공유한다. 같은 주소의 메모리에 접근 가능하므로 데이터를 공유할 수 있다.
- Node.js는 싱글스레드, 논 블로킹 모델로 싱글 스레드가 혼자서 일을 처리하지만 들어오는 요청 순서가 아닌 논 블로킹 방식으로 이전 작업이 완료될 때까지 대기하지 않고 다음 작업을 수행한다.
- 즉, 동시에 많은 요청들을 비동기로 수행함으로써 싱글 스레드일지라도 논 블로킹이 가능하다.
참고