node.js에 대하여 정리해보자

halloyun·2023년 12월 1일
post-thumbnail

node.js란

자바스크립트는 원래 웹 브라우저에서만 동작되던 스크립트 언어였다. 하지만 node.js라는 소프트웨어 플랫폼을 통해 자바스크립트가 단순한 스크립트 언어가 아닌 서버를 구축할 수 있는 명실상부한 프로그래밍 언어로 자리매김하였다.

이런 자바스크립트의 전성기를 불러일으킨 node.js에 대해 알아보자.

막간을 이용한 웹서버의 동작 원리

A씨의 컴퓨터에서 요청을 보낸다. DB로 도착해 해당 자료를 찾아 다시 A의 컴퓨터로 응답하기까지 5초가 걸린다고 치자.
그러면 5명의 컴퓨터에서 요청을 보내면 A,B,C,D,E... E씨는 앞 순번이 다 끝나고 25초가 지난 뒤에 요청이 시작되어 30초에 원하는 정보를 얻을 수 있을것이다.

기존의 자바에서는 tomcat 서버를 이용하는데 톰캣 서버는 멀티 스레드를 가진다. 스레드 하나당 하나의 요청을 수행한다치면, A,B,C,D,E의 요청에 5개의 스레드가 필요할 것이다. 은행 창구가 5개가 열려있고 5개의 요청상담을 동시에 수행할 수 있다는 것이다. 그렇다면 5초만에 5명의 손님들은 상담을 마치고 돌아갈 것이다. 다만, 창구가 5개인데 6번째 사람이 은행에 들어온다면?

이렇듯 자바의 톰캣은 200개의 멀티 스레드를 기본적으로 제공하며 200개 이상의 요청이 들어올 경우, 딜레이가 생긴다.

node.js는 싱글 스레드다!

바로 위에 tomcat은 멀티 스레드인데도 한계가 나타났는데 node.js는 싱글 스레드란다. 그러면 이걸 왜 쓰냐? 하는 의문이 생긴다.
당연히 좋은 점이 있으니 쓰겠지? 일단은 node.js는 싱글 스레드면서도 동시에 여러 요청을 처리할 수 있다. 이제부터 node.js의 차력쇼를 설명하겠다.

node.js의 특징

  1. none-blocking I/O
    • 하나의 요청을 처리하는 동안 다른 요청을 블로킹하지 않겠다.
    • A에게 요청이 들어온다 -> ???: 일이 들어왔으니까 이건 a씨가 가져가세요. 다음~
    • B에게 요청이 들어온다 -> ???: 새로운 일이 들어왔으니까 이건 b씨가 처리하세요. 다음~
    • 일꾼들은 계속해서 일을 하니 새로운 요청을 끊임없이 받을 수 있다.
  2. asynchronous
    • 앞서, 일꾼들은 계속해서 일을 하고 있다. 받은 요청에 대한 결과를 가져왔으면 콜백 함수를 실행하게 된다.

node.js는 싱글스레드인데 어떻게 일꾼을 여럿 부려??


node.js의 내부 구조를 보자.

구조 설명

  1. Node Standard Library
    node.js의 기본 라이브러리. node.js에서 기본적으로 제공하는 라이브러리(모듈)에는 HTTP, TCP, FS, OS, EVENT 모듈 등이 있다. 노드 기본 라이브러리는 require를 할때에 별도의 경로 지정없이 사용할 수 있음.

  2. Node Bindings
    네트워크 프로토콜 (http …)을 처리하는 socket, http 바인딩 모듈 등이 있다.

  3. Chrome V8 & libuv
    자바스크립트 엔진과 비동기 작업을 처리하는 libuv

V8의 내부를 살펴보자.

v8은 memory heap과 하나의 call stack으로 이루어져있다. 여기서 call stack이 하나인 것은 싱글 스레드와 같은 의미로 사용된다. memory heap에서 메모리 할당이 일어나고, call stack에 코드 실행에 따라 호출 스택이 쌓인다. call stack은 차례대로 실행되기 때문에 비동기 처리가 불가하다.

우리는 비동기 처리를 해야하는데? 그래서 libuv라는 라이브러리에서 앞서 말한 non-blocking IO 기능을 가능하게 하는 이벤트 루프를 제공한다.

  • libuv는 운영체제의 커널을 추상화해서 비동기 API를 지원한다.
  • libuv는 커널이 어떤 비동기 API를 지원하고 있는지 알고 있다.
  • 만약 커널이 지원하는 비동기 작업을 libuv에게 요청하면 libuv는 대신 커널에게 이 작업을 비동기적으로 요청해준다.
  • 만약 커널이 지원하지 않는 비동기 작업을 libuv에게 요청하면 livuv는 내부에 가지고있는 스레드 풀에게 이 작업을 요청해준다.(해당 스레드 풀은 디폴트 4개, 최대 128개이다.)


결국, 멀티 스레드가 아니냐? 하겠지만 node.js의 핵심인 이벤트 루프가 동작하는 메인스레드가 하나이기때문에 싱글 스레드라고 부른다.


도움된 글
kaitlin_k님 벨로그
Guppy님 깃헙
chltjdrhd777님 벨로그
쿠키님 블로그
이뇽의 세상

profile
안뇽! 자기소개는 밝게

0개의 댓글