본문 바로가기

Frontend Study - 2/Node.js

Node.js : node js란? node js의 특징.

개발을 하다보면 이것 저것 궁금한게 많다. 모르는게 많아서 그런가.. 알고 싶고 배우고 싶은 것들이 많아진다. 

프론트에서 서버로 요청만 해봤지 백엔드에서 뭐가 어떻게 돌아가는지에 대해서는 잘 모른다. 

얕게라도 이해하면 개발에 도움이 될 수 있을 것 같아서 시작하게 되었다.

 

Node.js

Node.js는 Chrome V8 JavaScript 엔진으로 빌드된 JavaScript 런타임. 

즉 Node.js는 자바스크립트를 브라우저가 아닌 다른 곳에서도 실행할 수 있게 하는 실행환경이다.

 

 

Node.js의 특징

기본적으로 자바스크립트는 싱글쓰레드 언어이다. 한번에 하나의 요청만 처리한다.

그 요청이 처리되는 동안 다른 요청을 할 수 없는 모델이 싱글쓰레드 블로킹 모델이다.

node js는 특별하다. 하나의 요청이 처리 되는 동안에도 다른 요청들을 수행할 수 있는 싱글쓰레드 논 블로킹 모델이다.

node js는 싱글쓰레드 논 블로킹 모델이다.

 

그렇다고 멀티쓰레드는 아니다.

node js의 쓰레드는 하나이다. (다만 libuv의 쓰레드 풀은 멀티쓰레드. 아래서 설명) 

다른 요청들을 비동기로 수행함으로써 논 블로킹이 가능한 것.

 

 

이게 어떻게 가능하지? 를 알기 위해서는 node js의 구성에 대해 알아야 한다.

 

 

node js의 구조

node js는 위와 같이 구성되어 있다.

V8엔진은 알고 있었는데 그 옆에 libuv 라는 녀석이 생소했다. 

라이브러리라고 하는데, 노드의 특징인 이벤트기반, 논블로킹 I/O 모델은 모두 이 녀석에게서 구현된다고 한다.

 

Event-driven(이벤트 기반)

node를 구성하는 대부분의 코드들은 콜백함수로 구성되어 있다. '이벤트 기반'이기 때문이다.

ex)

- get이라는 이벤트가 일어나면 이러이러한 일(콜백함수)을 실행해 ! 

- 누군가 /home 이라는 주소로 들어와 post 요청을 했다면 (이러한 이벤트가 일어나면) / 이 페이지를 출력해! (콜백함수)

처럼 어떠한 이벤트가 일어났을 때 콜백함수를 호출하는 구조로 되어 있다는 것.

 

이러한 콜백함수들은 libuv 안에 위치한 이벤트 루프에서 라운드 로빈(Round-Robin) 방식으로 관리, 처리된다. 

라운드 로빈 방식이란 쉽게 말하면 우선 여러 요청들을 다 받은 뒤에, 빨리 완료된 것 먼저 처리해 주는 것이다.

보통 여러개의 요청들이 있을 때, 순차적으로 하나 완료되면 그 다음 요청, 완료되면 그 다음 요청을 처리해 주는 방식과 다르다.

 

 

Non-Blocking I/O

논블로킹 I/O 모델은 Input과 Output이 관련된 작업(http, Database CRUD, third party api 등)의 블로킹 작업들을 백그라운드에서 수행하고, 이를 비동기 콜백함수로 이벤트 루프에 전달하는 것을 말한다. 여기서 말하는 백그라운드는 OS커널과 Thread pool 이다.

 

 

 

I/O 관련 요청이 들어오면 libuv라이브러리는 요청 작업의 종류에 따라 Thread pool 과 OS 커널로 나누어 분배한다. (쓰레드 풀은 OS커널에서 지원하지 않는 일을 담당하는데 대표적으로 파일시스템 작업이 있다.)  각각 분배된 작업이 완료되면 이벤트 루프에 콜백함수를 전달하는 것.

 

 

이벤트 루프는 여러 개의 페이즈(Phase)들을 갖고 있고, 각각의 페이즈들은 각자의 큐(Queue)를 갖는다. 

이벤트 루프는 라운드 로빈(round-robin) 방식으로 노드 프로세스가 종료 될 때까지 규칙에 따라 페이즈들을 계속 순회한다.

 

 

참고사이트

https://codingapple.com/

https://medium.com/@vdongbin/node-js-%EB%8F%99%EC%9E%91%EC%9B%90%EB%A6%AC-single-thread-event-driven-non-blocking-i-o-event-loop-ce97e58a8e21