[Server]Nodejs란

2 minute read

NodeJs

NodeJs는 자바스크립트 기반 I/O NonBlocking 단일쓰레드 서버사이드 소프트웨어 플랫폼입니다.
단일 스레드 방식으로 Event Callback을 통해 한꺼번에 많은 작업을 할 수 있다는 것이 특징이죠.

NodeJs를 알아가기 전에 기본적으로 Non Blocking I/O, Blocking I/O와 Synchronous, Asynchronous에 대해 알아두는게 좋을 것 같습니다.

블록킹과 논블로킹, 동기와 비동기 관계

Image Alt 텍스트

흔히 Blocking, Synchronous로 엮고, Non Blocking와 Asynchronous와 엮어서 사용하고 있습니다. 각각에 용어에 대해서 살펴보죠.

Non Blocking I/O

입출력 처리는 시작된 상태에서 완료되지 않은 채 다른 작업이 가능한 I/O를 말합니다.
non Blocking I/O를 통해 I/O 작업이 일어남에도 다른 작업이 가능하도록 하였습니다. 즉 제어권을 넘기는 것을 말하죠.

Blocking I/O

기존 입출력 방식을 말합니다. 입출력 처리가 시작된 상태에서는 어떠한 작업도 할 수 없고 완료 될 때까지 기다려야 하죠.
이는 제어권을 넘기지 않고 계속 가지고 있는 것을 말합니다.

Synchronous

동기식 방식입니다. 사실 Blocking I/O와 비슷합니다. Synchronous는 함수의 작업완료가 끝날때까지 기다리는 것이고, Blocking은 제어권을 기다리는 것을 말합니다. Blocking의 경우 함수가 작업이 끝났는데 리턴하지 않으면 결국 계속해서 기다리는 상황이 발생하게 되는 것이죠.

Asynchronous

비동기식 방식입니다. 마찬가지로 Non Blocking I/O와 비슷한 관계입니다. Asynchronous는 함수를 Callback으로 넘겨버리고 작업완료여부 관계없이 다른 작업을 합니다. Non Blocking은 제어권을 바로 넘겨서 다른 함수를 호출하는 것을 말합니다. 미세한 차이가 있죠.

그 외 자세한 내용은 아래 링크를 통해서 확인하실 수 있습니다. Blocking NonBlocking 참고자료

NodeJs 비동기 웹서버

대표적으로 NodeJs는 비동기 웹서버로 불립니다.

  • 동기식 NodeJs 코드
    const fs = require('fs');
    const data = fs.readFileSync('/file.md'); // 파일을 읽을 때까지 여기서 블로킹 됩니다.
    
  • 비동기 NodeJs코드
    const fs = require('fs');
    fs.readFile('/file.md', (err, data) => {
    if (err) throw err;
    });  // 파일을 읽을 때 비동기 callback 방식으로 가져옵니다.
    

위 코드는 NodeJs 대표 홈페이지에서 블록킹, 논블록킹을 설명하는 페이지에서 가져온 코드입니다. NodeJs 대표사이트 대충 차이를 알겠나요?

동기식 방식은 fs.readFileSync() 함수가 끝날때 까지 이후의 코드가 실행되지 않습니다. 하지만 비동기식 방식은 callback fs.readFile()함수만 실행시키고 그 이후의 코드를 실행하게 되죠.

이는 엄청난 장점을 가집니다. 기존 웹서버의 문제는 바로 동기적으로 처리되는 프로세스가 때문이었는데요. 예를들어 메일을 1000명에게 보낸다고 했을 때, 기존 웹서버는 한명씩 메일을 보내고 기다리는 방식때문에 매우 오랜 시간을 기다려야 했습니다.

하지만 비동기처리는 한번에 1000명에게 서버에서 메일을 보낼수 있습니다. NodeJs에서는 바로 이러한 기능이 가장 큰 장점이라고 할 수 있죠.

NodeJs의 기본적인 구조

Event Callback방식의 NodeJs는 하나의 쓰레드 풀을 가지고 이벤트 큐를 처리합니다. 기존 웹서버는 멀티쓰레드 방식으로 프로세스를 처리하였습니다. 때문에 CPU부담이 증가되고 그로 인해 웹서버의 자원이 더 많이 들수 밖에 없었죠.

예를들어 최대 20개의 쓰레드풀을 수용하는 cpu에서 21번째의 작업이 발생하게되면 마지막 쓰레드가 작업이 끝날때까지 기다리게 됩니다. 이 때 대기시간이 발생하게 되고, 점차 작업이 지연되고 자원이 더 들수 밖에 없죠.

아래 그림은 NodeJs가 Event Callback이 어떻게 이루어지는지 보여주는 그림입니다.

Image Alt 텍스트

단일쓰레드로 처리되는 NodeJs는 이벤트 루프에 쌓여있는 작업들을 Event Callback방식으로 처리하면서 cpu 자원을 확 줄였습니다.

참고자료

https://tech.peoplefund.co.kr/2017/08/02/non-blocking-asynchronous-concurrency.html