Node.js는 Chrome V8 JavaScript 엔진으로 빌드 된 JavaScript 런타임
너무 포괄적인 설명은 이해하기에 더 독이되기 때문에 자세하게 탐구 해보겠다.
- Node.js는 JavaScript를 서버에서도 사용할 수 있도록 만든 프로그램이다.
- Node.js는 V8이라는 JavaScript 엔진 위에서 동작하는 자바스크립트 런타임(환경)이다.
- Node.js는 서버사이트 스크립트 언어가 아니다. 프로그램(환경)이다.
- Node.js는 웹서버와 같이 확장성 있는 네트워크 프로그램을 제작하기 위해 만들어졌다.
JavaScript를 아는 사람들은 대부분 Node.js를 들어봤을것이다.
Node.js는 확장성이 있는 네트워크 어플리케이션 개발에 사용되는 소프트웨어 플랫폼! 이다.
웹 구현을 해본 독자라면 Spring 자체 서버를 이용하거나 Apach Tomcat등 서버를 구성해서 작업을 했을 것이지만
Node를 쓰면 별도 소프트웨어 없이 동작하는 것이 가능하며 이것이 웹 서버의 동작에 있어 더 많은 통제에서 벗어나 여러가지 기능을 가능하게 한다.
⚡️Node.js 사용이유
- JavaScript를 웹에서 독립시킨 것으로 Node.js 를 설치하게 된다면 터미널 프로그램(Iterm,cmd)등에서 Node.js 를 입력하여 브라우저 없이 바로 실행 가능하다.
- Node.js를 이용하여 서버를 만들 수 있다.
- 한가지 언어로 전체 웹페이지를 만들 수 있다.
⚡️Node.js 특징
- Node.js를 사용하려면 먼저 JavaScript를 배워야한다
- Node.js는 JavaScript를 사용하기 위해 만들어진 것이기 때문
- 스크립트 언어는 특정한 프로그램 안에서 동작하는 프로그램이기 때문에 웹 브라우저 프로그램 안에서만 동작을 한다.
- 웹 브라우저(크롬, 사파리, 익스플로러, 파이어폭스 등)가 없으면 사용할 수 없는 프로그램이다.
- JavaScript와 Node.js 는 동일한 문법이다.
⚡️JavaScript Runtime
- 런타임이란 특정 언어로 만든 프로그램을 실행할 수 있는 환경을 뜻한다.
- Node.js는 JavaScript 프로그램을 컴퓨터에서 실행할 수 있게 하는 자바스크립트 실행기이다.
⚡️이벤트 기반
- 노드는 v8과 더불어 Libuv라는 라이브러리를 사용한다.
- libuv 라이브러리는 노드의 특성인 이벤트기반,논 블로킹I/O 모델을 구현하고 있다.
- 이벤트 기반(Event-driven)이란 이벤트가 발생할때 미리 지정해둔 작업을 수행하는 방식을 의미합니다.!
즉, 이벤트 기반 시스템에서는 특정 이벤트가 발생하면 리스너 등록해둔 콜뱀 함수를 호출 하며 이벤트가 끝난후 노드는 다음 이벤트가 일어나기까지 대기합니다.
근데 V8이라는건 뭐지?
- 구글에서 개발된 오픈 소스 자바스크립트 엔진
- 크롬 브라우저와 안드로이드 브라우저에 탑재되어 있음
- C++로 작성되어 실행전 기계어로 컴파일하여 성능을 향상하고 인라인 캐싱 같은 최적화 기법을 적용하여 성능을 상향함
- 서버사이드는 동일한 로직을 반복 수행하는 경우가 많기 때문에 컴파일된 기계어 코드를 반복수행 하게되면 성능을 향상 시킬 수 있다.
⚡️이벤트 루프
- 이벤트 루프(event loop)는 여러 이벤트가 동시에 발생했을 때 어떤 순서로 콜백 함수를 호출할지를 이벤트 루프가 판단합니다.
- 노드는 이벤트가 종료될 때까지 이벤트 처리를 위한 작업을 반복 하므로 루프(loop)라고 부릅니다.
⚡️논 블로킹I/0
- 이벤트 루프를 잘 활용하면 오래 걸리는 작업 효율적으로 처리할 수 있다.
- 작업에는 두 가지 종류가 있는데 동기와 비동기작업이다.
- 특히 파일 시스템 접근,네트워크를 통한 요청 작업은 Input/Output의 일종이고
- 이러한 작업을 할 때 노드는 비동기 방식으로 블로킹을 만들지 않게 끔( 논 블로킹 ) 처리한다.
- 반대로 동기는 이전 작업이 다 끝나야만 다음 작업을 수행한다
- 마무리로 함수 호출 시 당장 실행하는 것이 아니라(동기→블로킹) 일단 어느 곳에 쌓아 놓고 동시에 요청을 처리하고(비동기→논 블로킹) 요청이 완료된 순서대로처리(스택 이용) 한다는 말이다.
동기? 비동기?
- 동기 (Synchronous)와 비동기(Asynchronous)
- 동기는 서버에서 요청을 보냈을때 바로 응답이 돌아와야 다음 동작을 수행할수 있다 즉, a 작업이 모두 진행될 때 까지 b작업은 대기해야한다.
- 비동기는 반대로 요청을 보내자마자 응답하건 안하건 바로 다음 동작을 수행 할 수 있다. 즉, a작업이 시작하면 동시에 b작업도 시작하고 a작업의 결과값이 나오는대로 바로 출력된다.
- 예시) 동기: 잠을 자고 일어나서 (a작업) 세수를 한다(b작업).
- 예시) 비동기 : 세수를 하면서(a작업) 양치를 한다(b작업).
⚡️싱글 스레드
- 이벤트 기반, 논블로킹 모델과 더불어 노드를 대하는 키워드중 하나는 싱글스레드 이다.
- 자바스크립트 코드는 동시에 진행될 수 없는데 그이유는 바로 노드가 싱글 스레드 기반이기 때문이다.
- 프로세스 : 운영체제에서 할당하는 작업의 단위이다. 노드나 웹 브라우저 같은 프로그램은 개별적인 프로세스이다. 프로세스 간에는 메모리 등의 자원을 공유하지 않는다.
- 스레드 : 스레드는 프로세스 내에서 실행되는 흐름의 단위이다. 프로세스는 스레드를 여러 개 생성해 여러 작업을 동시에 처리할 수 있다. 스레드들은 부모 프로세스의 자원을 공유한다. 같은 주소의 메모리에 접근 가능하므로 데이터를 공유할 수 있다.
- Node.js는 싱글쓰레드,논 블로킹 모델로 싱글 스레드가 혼자서 일을 처리하지만 들어오는 요청 순서가 아닌 논 블로킹 방식으로 이전 작업이 완료될 때까지 대기하지 않고 다음작업을 수행한다.
❗️결론
- 노드는 기본적으로 싱글 스레드, 논 블로킹 모델을 채용하므로 I/O 요청이 많이 발생하면 노드를 서버로 사용하는 것이 좋다.
- 하지만 노드는 CPU 부하가 큰 작업에는 적합하지 않다.
- 우리가 작성하는 코드는 모두 스레드 하나에서 처리되기 때문에 코드가 CPU 연산을 많이 요구하면 스레드 하나가 혼자서 감당하기 어렵워염
- 즉, 개수는 많지만 크기는 작은 데이터를 실시간으로 주고받는데 노드는 적합하다. 예를 들어 네트워트나 데이터베이스, 디스크 작업 같은 I/O에 특화되어있다. 실시간 채팅 애플리케이션, 주식 차트도 포함된다.
노드의 장점은 첫 째, 멀티 스레드 방식에 비해 적은 컴퓨터 자원을 사용한다.
둘 째, I/O 작업이 많은 서버로 적합하다
셋 째, 웹 서버가 내장되어 있어 별도의 웹서버를 설치할 필요가 없다
넷 째, 자바스크립트를 사용하기 때문에 JSON 형식과 쉽게 호환된다. 이상!
참고
https://hanamon.kr/nodejs-%EA%B0%9C%EB%85%90-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0/
https://velog.io/@kimkevin90/Nodejs-%EA%B0%9C%EB%85%90-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0Nodejs-%EB%9E%80
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=scw0531&logNo=220886725791