Node.js란?

2020. 10. 30. 16:59Project-Review

1. Node.js의 정의

개발자들이 처음 사용해야하는 기술을 알기 위해 가장 처음하는 것이 해당 사이트의 공식문서를 보는일이다. 하지만, 이제 갓 프로제트를 시작한 나에게 Node.js의 정의는 아래와 같이 너무 어렵게 나와있었다.

 

비동기 이벤트 주도 JavaScript 런타임으로써 Node.js 는 확장성 있는 네트워크 애플리케이션을 만들 수 있도록 설계되었습니다. 

이는 오늘날 OS 스레드가 일반적으로 사용하는 동시성 모델과는 대조적입니다. 스레드 기반의 네트워크는 상대적으로 비효율적이고 사용하기가 몹시 어렵습니다. 게다가 잠금이 없으므로 Node.js 의 사용자는 프로세스의 교착상태에 대해서 걱정할 필요가 없습니다. Node.js 에서 I/O를 직접 수행하는 함수는 거의 없으므로 프로세스는 결과 블로킹 되지 않습니다. 아무것도 블로킹 되지 않으므로 Node.js 에서는 확장성 있는 시스템을 개발하는 게 아주 자연스럽습니다.

 

물론 사용을 하는데 있어서 이것을 모른다고 해서 큰 문제가 생기지는 않는다. 하지만, 사용자로써 조금은 Node.js가 어떤 것인지 살펴볼 필요는 있다고 생각해 다음과 같이 주관적으로 생각하기에 키워드를 우선 정리했다.

 

  • Javascript 런타임

    : 런타임이란 '프로그래밍이 구동되는 환경 '이다. 간략하게 Node.js가 실행되는데 있어 환경을 Javscript로 설정한다고 이해했다.

  • 비동기 이벤트 주도

    : 이 말 뜻을 쉽게 풀자면, 예를 들어 2개의 작업이 있다고하자(task1, task2). 만약 task1을 실행하다가 서버에 데이터를 요청하는 상황이 오면 잠시 task1은 대기 상태가 되며 이 동안 task2가 실행되는 것이다. 쉬는 시간 없이 계속 실행을 시킨다는 뜻으로 받아들이면 되겠다. 그러다가 서버에서 요청이 도착하면 task2 작업을 중단 시키고 task1의 작업을 완료 시킨 뒤, task2를 실행한다.

  • 스레드(thread)

    : OS에서 인식하고 실행하는 작업단위
      예를 들어, 작업할 것이 5개가 있다고 하자. 이런 경우에 1스레드라면 5개를 일렬로 줄을 세위 하나씩 처리를 한다. 그렇지만, 2스레드.        라면 2줄로 세워 일을 처리할 수 있다.

    (참고로 얘는 싱글 스레드이다.)

  • 교착상태

    : 두 개 이상의 작업이 서로 상대방의 작업이 끝나기 만을 기다리고 있는 상황으로, 결론적으로 둘 다 완료하기 못하고 기다리는 것. 이것도 싱글스레드이기 때문에 문제가 생기지 않는다!

  • 블로킹 | 논블로킹

    : 블로킹 메서드는 동기로 실행되고 논블로킹 메서드는 비동기로 실행됩니다. 아래의 작업은 동기와 비동기의 사례이다.
//동기
const fs = require('fs');
const data = fs.readFileSync('/file.md'); // 파일을 읽을 때까지 여기서 블로킹 됩니다.

//비동기
const fs = require('fs');
fs.readFile('/file.md', (err, data) => {
  if (err) throw err;
});

 

정리하자면, Node.js 는 '자바스크립트 환경'에서 돌아가면서 한 줄로 작업들을 세워 하나씩 처리를 해 가지만, 처리하고 있는 작업이 대기 상태에 머무른다면 대기 상태가 해결되기 전까지 다른 작업을 진행한다. 이런 작업 과정은 만약 연관된 두 작업이 서로의 작동을 기다리다가 계속 끝나지 않는 상황을 걱정하지 않아도 되며, 자연스레 확장성 있는 작업을 할 수 있게 된다.(걱정이 덜해진다는 뜻으로 보인다.) 라고 볼 수 있겠다.