1. Node.js란 무엇인가?
위는 Node.js의 홈페이지로 메인 화면에 자신들을 하단의 내용으로 소개하고 있다.
Node.js®는 Chrome V8 JavaScript 엔진으로 빌드된 JavaScript 런타임입니다.
runtime(런타임)이란 : 특정 프로그래밍 언어가 구동될 수 있는 환경 및 동작
즉, Node.js는 자바스크립트가 구동되는 환경 및 동작을 말한다.
Javascript는 이름에서 알 수 있듯 스크립트 언어인데 이는 독립 언어가 아니라는 뜻으로 특정 프로그램 안에서만 동작이 가능하며 Javascript의 경우엔 웹 브라우저에서만 동작한다.
그래서 탄생하게 된 Node.js는 Javascript를 웹 브라우저로부터 독립적으로 사용하기 위해 만들어진 것으로 서버에서 사용하며, Javascript에서 분리된 것이기에 문법이 동일하다. 즉, 한 가지 언어로 전체 웹 페이지를 만들 수 있다(생산성 향상).
2. Node.js의 특징
(1) Event-Driven : 이벤트 기반
Event-Driven : 이벤트가 발생할 때 미리 지정한 작업을 수행하는 것
Node.js는 V8와 libuv 라이브러리를 사용하는데, 그 중에서도 libuv는 Node.js의 특성인 Event-Driven과 Non-blocking를 구현한다.
이러한 이벤트 기반 시스템에서는 특정 이벤트 발생 시 무엇을 할지 미리 Event Listener에 CallBack 함수로 등록한다.
이벤트가 발생하면 등록했던 CallBack함수를 호출하고 다음 이벤트 발생까지 다시 대기한다.
(2) Non-blocking I/O : 논 블로킹
개발에는 두 가지 종류의 작업이 있다.
① 동시에 실행될 수 있는 작업
② 동시에 실행될 수 없는 작업
Node.js는 Asynchronous(비동기) - Non-blocking I/O(논 블로킹)을 사용한다.
Blocking I/O : 호출된 함수의 동작이 마무리 되기 전까지 다른 일을 처리할 수 없다.
Non-blocking I/O : 호출된 함수의 동작이 마무리 되기 전에도 다른 함수가 일을 진행할 수 있다.
Blocking/Non-blocking은 함수 호출 이후 제어권에 따라 구분
Synchronous(동기) : 호출된 함수가 완료된 후 return되기를 기다린다. return이 오더라도 호출된 함수의 작업이 완료가 되었는지 함수가 계속 체크한다.
Asynchronous(비동기) : 호출된 함수에게 CallBack을 요청해 완료된 후에는 CallBack을 실행한다. 작업이 완료되었는지 함수가 체크하지 않는다.
Synchronous/Asynchronous는 함수의 결과물을 CallBack을 통해 받는지, 작업 완료 여부를 체크하는지에 따라 구분
(3) Single-thread : 싱글 스레드
① thread의 개념
Process : 운영체제에서 할당하는 작업 단위. process간에는 메모리 등의 자원을 공유하지 않는다. Node.js나 웹 브라우저 등의 프로그램은 개별적인 process이다.
Thread : Process 내에서 실행되는 흐름 단위. Thread는 process 내에 여러 개 생성 가능하며 부모 process가 가진 자원을 공유한다. 같은 주소의 메모리에 접근이 가능해 데이터 공유가 가능하다.
② Single-thread / Multi-thread 란?
Node.js는 single-thread를 사용해 작업이 순차적으로 실행되지만,
Non-blocking I/O이기에 호출된 함수의 동작이 마무리 되기 전에 다른 함수가 일을 진행할 수 있다.
Javascirpt 자체는 single-thread 언어이다.
그렇다면 javascript가 실행되는 환경(runtime)인 Node.js도 single-thread일까?
엄밀히 따진다면, Node.js는 single-thread는 아니다.
그러나 javascript를 실행하는 thread가 Event loof 하나이므로 single-thread라고 불리는 것이다.
'Programming > node.js' 카테고리의 다른 글
[node.js] \node_modules\node-sass command failed 해결 (0) | 2022.06.03 |
---|