[Node.js] 노드란?

[Node.js] 노드란?

비동기 이벤트-기반

노드 환경에서 이벤트는 하나의 요청과 같다고 볼 수 있다. 여기서의 요청은 백엔드 서버를 구현할 우리에게 하나의 HTTP Request와 같다고 봐도 무방하다.

즉, 노드 입장에서 이벤트는 프론트엔드(클라이언트)에서 받는 요청이다.

노드가 비동기적으로 이벤트를 처리한다는 것은 앞선 클라이언트의 요청이 끝나기 전에 다음 클라이언트의 요청을 받는다는 의미이다.

따라서, 한 시점에 여러 요청을 수행할 수 있게 되는 것이다. 여기서 주요 핵심인 싱글 스레드(Single-Thread)라는 것을 알아야 한다.

싱글 스레드(Single-Thread)

싱글 스레드는 client의 요청을 비동기적으로 수행하는 노드의 핵심 요소이다.

예를 들어, 노드로 인스타그램 백엔드 API를 구현했다고 가정해보자. 클라이언트(유저)가 인스타그램 앱에 접속하면, 게시물을 조회하는 API를 통해 노드 서버에 요청을 보낸다. 인스타그램 앱을 켜는 유저들은 모두 같은 API에 요청을 보낸다.

먼저 하나의 요청이 들어와서 응답이 다시 클라이언트에게 전해지는 과정을 이해할 필요가 있다. 요청과 응답 사이에는 사실 수많은 일들이 일어난다. 한 가지 예로, 데이터베이서에 저장되어 있는 데이터를 꺼내오는 작업이 필요하다. 게시물을 조회하려면 데이터베이스에서 게시글에 담긴 사진, 유저의 정보, 댓글 정보를 조회해야 하고 추가로 여러 게시물을 조회해야 한다. 이것을 Heavy Load한 일이라고 한다. 즉, 자원이 많이 드는 일이라는 말이다. 이렇게 컴퓨터의 자원이 많이 들고 시간이 오래 걸리는 일은 싱글 스레드에서 처리하지 않는다.

노드의 싱글 스레드는 C++로 짜인 쓰레트 풀에 무거운 일을 맡긴다. 싱글 스레드는 그저 이벤트(요청)를 처리(응답) 해 주는 역할을 할 뿐이다. 앞선 클라이언트의 요청이 완료될 때까지 기다리지 않고 다음 요청을 처리할 수 있는 것은 무거운 일을 뒷 단의 내부 C++ 쓰레드 풀이 감당하고 있기 때문이다. 따라서 노드의 싱글 스레드는 여러 요청을 한 시점에 처리할 수 있게 되는 것이다.

JavaScript 런타임 환경(Chrome V8 엔진)

JavaScript 런타임 환경은 JavaScript로 짜여진 소스코드를 CPU가 이해할 수 있는 기계어(0과 1로 이루어진 bytecode)로 변환시키고, 프로그램의 메모리를 관리하는 시스템이다.

이런 환경을 가능하게끔 하는 것이 바로 Chrome V8 엔진이다. Chrome V8 엔진은 우리가 알고 있는 구글의 크롬 웹브라우저에서 작동하는 엔진이다. 이 엔진이 브라우저 없이 작동할 수 있도록 만든 환경이 바로 노드이다.

비동기 이벤트-기반의 처리를 이 Chrome V8엔진이 담당한다. 메모리 관리, 스케쥴 관리 등의 일들을 V8 엔진이 감당하게 된다. 즉, 싱글 스레드 기반의 동작 원리를 이해하고 JavaScript로 코드를 작성하면 뒷단의 일들(Heavy Load)을 Chrome V8 엔진이 알아서 처리해 준다.

from http://dev-taeyeong.tistory.com/19 by ccl(A) rewrite - 2021-12-26 15:00:49