애플리케이션을 실행할 때 운영체제의 RAM, 환경 변수들과 같은 시스템 리소스에 액세스할 수 있도록 해줍니다.
런타임 환경은 프로그램이 실행되는 동안에만 존재하며 프로그램이 종료되면 사라집니다.
내부적으로 Stack, Heap, Queue 등을 설정하고 관리하는 책임을 가지고 있습니다.
즉 NodeJs는 Javascript의 실행 환경일 뿐이지 JavaScript 언어 자체가 아닙니다.
단지 JavaScript를 실행할 수 있는 환경을 제공해 주는 것으로 Javascript가 서버 사이드 환경에서 동작할 수 있도록 해줍니다.
NodeJs의 특징
Non-blocking I/O
NodeJs는 논 블로킹 I/O 모델을 사용합니다.
논 블로킹 I/O란?
논 블로킹 I/O는 I/O 작업이 완료될 때까지 기다리지 않고 다른 작업을 수행하는 방식입니다.
예시) A라는 작업 중 B작업을 실행시켜야 할 때 A작업이 끝나지 않더라도 기다리지 않고 B작업이 실행될 수 있도록 하는 방식
추후 설명할 이벤트 기반 아키텍처와 함께 사용되어 비동기 I/O를 지원합니다.
v8 엔진의 이벤트 루프를 활용하여 여러 이벤트가 동시에 발생했을 때 어떤 순서로 콜백 함수를 호출할지 결정합니다.
즉, 함수 호출시 바로 실행하는 것이 아닌 이벤트 루프에 등록하여 동시에 여러 요청을 처리하고 요청이 완료되는 순서대로 처리합니다.
I/O(파일 시스템 접근, 네트워크 요청)작업, 압축, 암호화 등의 작업을 스레드를 통해 처리
나머지 작업은 이벤트 루프를 통해 처리
이벤트 기반 아키텍처
NodeJs는 이벤트 기반 아키텍처를 사용합니다.
앞서 설명한 것과 같이 NodeJs는 Chrome V8 엔진을 사용합니다. V8 엔진의 이벤트 루프를 통해 여러 이벤트가 동시에 발생했을 때 어떤 순서로 콜백 함수를 호출할지 결정합니다. (이벤트 루프에 대한 자세한 설명은 추후 V8 엔진에 대한 글에서 다루겠습니다.)
이벤트 루프 동작방식
이벤트 루프는 이벤트 발생 시 호출할 콜백 함수를 관리합니다.
이벤트 발생 시 이벤트 루프에 등록된 콜백 함수를 호출합니다.
이벤트 루프는 호출된 콜백 함수를 실행합니다.
콜백 함수 실행이 완료되면 이벤트 루프는 다음 콜백 함수를 호출합니다. (요청이 없다면 대기 상태로 전환)
싱글 스레드
NodeJs는 싱글 스레드 기반의 비동기 이벤트 루프를 사용합니다.
스레드(Thread)
프로세스 내에서 실행되는 흐름의 단위
프로세스 내에서 여러 스레드가 동시에 실행될 수 있음
NodeJs는 싱글 스레드 기반으로 동작합니다. 이때 싱글 스레드는 NodeJs 자체가 싱글 스레드로 동작하는 것이지 NodeJs가 실행되는 환경이 싱글 스레드로 동작하는 것은 아닙니다.
NodeJs는 이벤트루프를 메인 스레드로 사용하고 I/O 작업은 다른 스레드로 처리합니다.
즉, NodeJs는 싱글 스레드 기반으로 동작하지만 내부적으로 멀티스레딩을 지원합니다. (추후 NodeJs는 왜 싱글 스레드인가?에 대해 다루겠습니다.)
장단점
장점
싱글 스레드 기반의 비동기 이벤트 루프를 사용하여 높은 성능을 제공합니다.
논 블로킹 I/O 모델을 사용하여 I/O 작업에 대한 처리 속도가 빠릅니다.
이벤트 기반 아키텍처를 사용하여 높은 확장성을 제공합니다.
단점
싱글 스레드 기반으로 동작하기 때문에 CPU 집약적인 작업에 대해 성능이 떨어질 수 있습니다. 만약 애플리케이션이 CPU 집약적인 작업을 많이 수행한다면, 다른 환경이 더 적합할 수 있습니다. (다만 최근에는 많이 개선되었다고 현업자분에게 들었는데 나중에 다시 한번 확인해보겠습니다.)
콜백 중첩으로 인해 코드가 복잡해 질 수 있습니다. (하지만 Promise, async/await를 사용하여 해결할 수 있습니다.)