[TIL] 23.05.06

Minkyu Shin·2023년 5월 6일
0

TIL

목록 보기
23/44
post-thumbnail

오늘의 나는 무엇을 배웠을까?

Node.js

Node.js는 JS 런타임이다. 런타임이란, 프로그래밍 언어가 구동되는 환경을 말하는데 따라서 JS 런타임은 JS가 구동되는 환경을 말한다.
Node.js가 등장하기 이전에는 웹 브라우저가 유일한 JS 런타임이었다. 그래서 웹 브라우저 이외의 환경에서는 JS의 사용이 불가했는데 Node.js의 등장으로 어떤 환경에서도 JS의 실행이 가능해졌다. 웹 서버는 물론이고 모바일 애플리케이션의 개발에도 JS가 사용될 수 있게 해준 프로그램이다.

JS가 게임이라면 Node.js는 게임을 구동하는 게임기이다.

한입 크기로 잘라먹는 리액트 (이정환 저)에서...

Node.js를 사용하면 터미널 프로그램에서 웹 브라우저 없이도 JS를 실행할 수 있게 되었다. 따라서 앞서 말했듯 웹 브라우저와 무관한 다양한 프로그램을 JS로 만들 수 있게 된 것이다.

또한 지금 학습 중인 리액트로 만든 JS 애플리케이션은 Node.js를 통해 구동되기 때문에, 리액트를 잘 활용하기 위해서는 Node.js에 대한 이해가 선행되어야 함으로 Node.js에 대해 간단히 정리를 해보려고 한다.


Node.js는 싱글 스레드, 이벤트 기반, 논 블로킹 I/O 모델을 구현하고 있다.

싱글 스레드 (Single Thread)

스레드(Thread)는 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다. 여기서 프로세스란, 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램으로써, OS로부터 메모리 공간과 같은 시스템 자원을 할당 받는 작업의 단위를 의미한다.

Node.js는 싱글 스레드 방식을 채택하였다. 따라서 단일의 메인스레드가 JS를 모두 실행하게 된다. 식당과 비유하자면 종업원 한 명이 모든 일을 다 처리하게 되는 것이다. 그렇다면... 작업이 매우 비효율적으로 처리되지 않을까 하는 의문이 든다. 한 가지 일을 처리하고 나야 다음 일을 처리할 수 있을 것 같기 때문이다. 하지만, Node.js는 libuv 라는 라이브러리를 통해 이벤트 기반 논 블러킹 I/O를 구현함으로써 예상되는 문제를 해결한다.

이벤트 기반 (Event-driven)

이벤트 기반은 이벤트가 발생(e.g. 클릭, 네트워크 요청)했을 때 미리 지정해 둔 작업을 수행하는 방식을 의미한다. Node.js는 이벤트가 발생했을 때 이벤트 리스너에 등록한 콜백함수를 호출한다. 발생한 이벤트가 없거나 모든 이벤트가 다 처리되면 다음 이벤트가 발생할 때까지 Node.js는 대기한다.

만약 동시에 이벤트가 여러개 발생한다면 어떻게 될까? 물론 콜백함수를 어떤 순서로 호출할지 판단하는 '이벤트 루프' 를 가지고 있다. 이벤트 루프는 이벤트 발생 시 호출한 콜백 함수들을 관리하고, 그 실행 순서를 결정하는 역할을 한다. Node.js가 종료될 때까지 이벤트 처리를 위한 작업을 반복적으로 수행한다.

이벤트 루프는 위 사진과 같은 단계를 가지고 있다. JS에서 이벤트 루프는 반드시 이해해야 할 중요한 개념이기 때문에 따로 정리해 보려고 한다.

JS Visualizer - JS 내부의 동작을 확인할 수 있는 링크

논 블로킹 I/O (Non-Blocking I/O)

Node.js에서는 Input과 Output이 관련된 블로킹 작업(e.g. http, DB, CRUD 등등...)들을 백그라운드(OS 커널 or libuv 스레드 풀)에서 수행하고, 이를 비동기 콜백함수로 이벤트 루프에 전달하는 논 블로킹 I/O 모델을 활용한다. 백그라운드에서 수행한 작업이 완료되면 이를 이벤트루프에 알려주고, 콜백함수로 이벤트 루프에 등록하는 작업을 한다.
따라서 시간이 오래 걸리는 작업을 백그라운드에서 진행하고, 완료를 기다리지 않은채로 즉시 실행 가능한 다음 작업을 먼저 처리할 수 있게 된다.

이렇게 Node.js 는 이벤트 루프와 논 블로킹 I/O를 활용하여 I/O 등의 JS가 아닌 작업이 일어나는 동안 이벤트 루프가 계속 실행될 수 있게 해준다.

https://nodejs.org/ko/docs/guides/blocking-vs-non-blocking


오늘은 Node.js에 대해 간략히 정리를 해 보았다. Node.js의 동작을 정확히 이해하기 위해서는 이벤트 루프, 스레드 등 이해가 더 필요한 부분이 있다고 생각이 들었다. 빠른 시일 내로 정리를 해보아야 겠다.

profile
개발자를 지망하는 경영학도

0개의 댓글