Node.js 개념 및 동작 원리

김맥스·2023년 3월 25일
0

자바스크립트

목록 보기
4/5
post-thumbnail

용어

  • 런타임(runtime) : 프로그램이 실행되고 있을 때, 그 프로그램이 존재하는 장소 또는 프로그래밍 언어가 구동되는 환경 -> Node.js는 자바스크립트가 구동되는 환경
  • I/O (Input/Output) : 어떤 디바이스를 통해 입력과 출력이 이뤄지는 모든 작업을 일컫는 말
    네트워크를 통해 다른 서버로 데이터를 전송하거나 받거나, 콘솔 출력도 포함
  • 프로세스 : 운영체제에서 할당하는 작업의 단위
    노드나 웹 브라우저 같은 프로그램은 개별적인 프로세스
    프로세스 간에는 메모리 등의 자원을 공유하지 않는다.
  • 스레드 : 프로세스 내에서 실행되는 흐름의 단위
    프로세스는 스레드를 여러 개 생성해 여러 작업을 동시에 처리할 수 있다.
    스레드들은 부모 프로세스의 자원을 공유한다.
    같은 주소의 메모리에 접근 가능하므로 데이터를 공유할 수 있다.

Node.js

Chrome V8 JavaScript 엔진으로 빌드 된 JavaScript 런타임

싱글스레드 논 블로킹 I/O 모델로 구성

등장배경 및 개념

  • node.js보다 가 먼저 등장해서 사용되고 있었음
  • 자바스크립트는 등장 초기에 웹브라우저를 조작하기 위해서만 사용되는 프로그래밍 언어였음.
    즉, 웹브라우저가 자바스크립트의 유일한 실행환경이었고,
    자바스크립트는 웹사이트를 만들때만 사용되는 언어였음.
    자바스크립트는 독립적인 언어가 아닌 특정한 프로그램 안에서만 동작하는 스크립트 언어이기 때문에 웹 브라우저(크롬, 익스플로러 등)이 없으면 사용할 수 없는 프로그램이었다
  • 2000년대 중반 이후 자바스크립트의 활용도가 높아짐에 따라 웹브라우저가 아닌 다른 곳에서 사용하게 하자는 의견이 많아짐
  • 이에 개발자 Ryan dahl이 CommonJS라는 문법 표준과 V8엔진을 기반으로 Node.js를 개발함
  • Node.js는 웹 브라우저와 무관한 프로그램을 만들 수 있게 해주었고 서버를 만들 수 있게 되었다 => 결국 자바스크립트라는 하나의 언어로 서버를 포함한 전체 웹 페이지를 만들 수 있게 되었다.
  • Node.js는 데이터를 보관하거나 주고 받는 확장성 있는 서버 사이드 어플리케이션 개발에 사용할 수 있는 소프트웨어 플랫폼
  • Non-blocking I/O싱글스레드 이벤트 루프를 통한 높은 처리 성능을 가지고 있는 것이 특징

구성 및 동작 원리

  • Node.js = V8(자바스크립트 엔진) + libuv(비동기 작업을 처리하는 라이브러리)
  • Node.js는 이벤트 기반의 플랫폼이기 때문에 이벤트가 발생할 때, 미리 지정해준 작업을 수행하는 방식으로 동작한다.
  • 즉, Node.js에서 일어나는 모든 처리는 일련의 콜백을 처리하는 것과 같다고 할 수 있다.


이벤트 기반 & 이벤트루프

  • Node.js는 V8엔진libuv 라는 라이브러리를 사용
  • libuv 라이브러리는 노드의 특성인 이벤트 기반, 논 블로킹 I/O 모델을 구현하고 있다.
  • 이벤트 기반(Event-driven) : 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식.
    즉, 이베트 기반 시스템에서는 특정 이벤트가 발생할 때 무엇을 할지 미리 등록해두고, 이를 이벤트 리스너에 콜백함수를 등록한다. 이후 이벤트가 발생하면 리스너에 등록해둔 콜백함수를 호출하며, 이베트가 끝난 후 노드는 다음 이벤트가 발생할 때까지 대기한다.
  • 이벤트 루프(Event loop)는 여러 이벤트가 동시에 발생했을 때 어떤 순서로 콜백함수를 호출 할지를 이벤트 루프가 판단
  • 노드는 이벤트가 종료될 때까지 이벤트 처리를 위한 작업을 반복하므로 루프(loop)라고 부른다

논 블로킹 I/O (Non Blocking Input/Output)

  • 작업에는 비동기 처리 작업과 동기 처리 작업 두 종류가 있다.
  • 네트워크를 통한 요청 작업은 입력과 출력 작업의 일종이며 이러한 작업을 실행할 때 노드는 비동기 방식으로 블로킹을 만들지 않게 끔(논 블로킹)처리한다.
  • 자세하게 풀어서 아야기하면 함수 호출 시 당장 실행하는 것이 아니라(동기→블로킹) 일단 어느 곳에 쌓아 놓고 동시에 요청을 처리하고(비동기→논 블로킹) 요청이 완료된 순서대로처리(스택 이용) 한다는 말

싱글스레드

  • 자바스크립트 코드는 동시에 실행될 수 없는데, 그 이유는 노드가 싱글스레드 기반이기 때문이다.
  • Node.js는 싱글스레드 + 논 블로킹 I/O 모델이기 때문에 싱글 스레드가 혼자서 일을 처리하지만 들어오는 요청 순서가 아닌 논 블로킹 방식으로 이전 작업이 완료될때까지 대기하지 않고 다음 작업을 수행한다.
  • 엄밀히 말하면 Node.js는 여러 개의 스레드를 가지고 있지만, 자바스크립트를 실행하는 스레드는 단 하나이므로 Node.js를 싱글스레드라고 하며, 그 싱글스레드가 바로 이벤트루프이다.

정리

  • Node.js는 싱글스레드 논 블로킹 I/O 모델이기 때문에 I/O 요청이 많다면 노드를 서버로 사용하는 것이 좋다.
  • CPU 부하가 큰 작업에는 적합하지 않다. 우리가 작성하는 코드는 모두 하나의 스레드에서 처리되기 때문에 코드가 CPU 연산을 많이 요구하면 스레드 하나에 부하가 커진다.
  • I/O 요청의 개수는 많지만 크기가 작은 데이터를 주고받는 상황에 노드가 적합하다.
    ex) 네트워크, 데이터베이스 작ㅇ업, 실시간 채팅 애플리케이션 등
  • 노드는 멀티스레드 방식에 비해 적은 컴퓨터 작원을 사용한다.
  • 웹 서버가 내장되어 있어서 별도의 웹 서버를 설치할 필요가 없다.
  • 자바스크립트를 사용하기 때문에 JSON 형식과 쉽게 호환된다.

출처

profile
3년차 백엔드 개발자의 공부 기록

0개의 댓글