[Node.js 훑어보기] #1 Node.js란??

mechaniccoder·2020년 7월 16일
1

Node.js 알아가기

목록 보기
1/7
post-thumbnail

정의


노드는 크롬 V8 자바스크립트 엔진으로 빌드된 자바스크립트 런타임입니다. 노드는 이벤트 기반, 논블로킹 I/O 모델을 사용해서 가볍고 효율적입니다.

그럼 런타임이 뭘까요? 런타임은 특정 언어로 만든 프로그램을 실행하기 위한 환경을 말합니다. 즉, 자바스크립트를 컴퓨터에서 실행하도록 하는 역할을 하는 것이 바로 노드입니다.

이벤트 기반


이벤트 기반이라고 하는 것은 특정 이벤트가 발생했을 때 미리 지정해둔 작업을 수행하는 것을 말합니다. 먼저 주요 개념에 대해 짚고 넘어가죠.

  • 이벤트 : 마우스 클릭, 키보드 입력, 네트워크 요청과 같은 것입니다.
  • 이벤트 리스너 : 콜백 함수를 등록해서 이벤트 발생 시 실행합니다.
  • 이벤트 루프 : 호출할 콜백 함수를 관리하며, 실행 순서를 결정합니다.
  • 태스크 큐 : 이벤트 발생 후에 호출될 콜백 함수들이 대기하는 공간입니다. 이벤트 루프가 정한 순서대로 줄을 서 있습니다.
  • 백그라운드 : 타이머, I/O 작업 콜백 혹은 이벤트 리스너가 대기하는 곳입니다.

자, 예제를 통해 이벤트 작동 방식에 대해 더 알아보죠. 아래의 코드를 확인해세요.

function callback() {
  console.log('I\'m callback');
}

setTimeout(callback, 2000);

2초 뒤에 callback 이라는 함수를 실행시키는 과정을 설명하자면 다음과 같습니다.

  1. 콜스택에 main() 함수 그 다음으로 setTimeout() 함수가 들어갑니다.
  2. setTimeout() 실행한 뒤에 callback 함수는 백그라운드로 보내집니다.
  3. 2초 뒤에 run 함수는 태스크 큐로 보내집니다.
  4. 콜스택의 실행이 모두 끝난 뒤 비워진 상태면
  5. 이벤트 루프가 태스크 큐에 들어있는 callback함수를 콜스택으로 올립니다.
  6. callback함수가 실행되고 콜스택이 비워집니다.
  7. 이벤트 루프는 태스크 큐에 콜백함수가 오기를 기다립니다.

만약 콜스택에 너무 많은 함수가 들어있다면 2초가 지났음에도 callback함수가 실행되지 않을 수 있습니다. (setTimeout 함수가 정확하지 않은 이유죠.)

논블로킹 I/O


동기, 비동기를 생각하면 논블로킹을 쉽게 이해할 수 있습니다. 이전의 작업이 완료되는 것을 기다리지 않고 다음 작업을 수행합니다. 이를 활용하면 더 빠르게 작업을 수행할 수 있겠죠?

그러나 자바스크립트의 엔진의 싱글스레드의 한계때문에 모든 상황에서 이득을 볼 수 있는 것은 아닙니다. 주로 I/O작업에서 이득을 얻을 수 있죠.

I/O는 입력, 출력을 의미하는데 파일 시스템 접근, 네트워크 요청과 같은 작업이 I/O의 일종으로 노드는 논블로킹 방식으로 작동합니다.

싱글 스레드


노드는 싱글 스레드로서 한 번에 하나의 일을 처리할 수 있습니다. 쉽게 말해서 일하는 사람이 한 명이라고 생각하면 됩니다. 용어만 들었을 때 멀티 스레드가 훨씬 좋아보이는데 꼭 그렇지만은 않은게 작업량이 늘어나면 일을 해야할 스레드를 늘려야하고 작업량이 적으면 노는 스레드도 발생하겠죠.

노드도 싱글스레드 여러 개를 사용해서 멀티 스레딩 비슷한 기능을 할 수 있습니다. 이는 멀티스레딩보다는 멀티프로세스에 가깝죠. 이쯤에서 스레딩과 프로세스의 차이에 대해서 알아봅시다.

  • 프로세스 : 운영체제에서 할당하는 작업의 단위입니다. 예를 들어 크롬 브라우저, 게임은 개별적인 프로세스이죠. 각 프로세스는 서로 메모리와 같은 자원을 공유하지 않습니다.
  • 스레드 : 프로세스 내에서 실행되는 흐름 단위입니다. 하나의 프로세스는 여러 개의 스레드를 가질 수 있습니다. 부모 프로세스의 자원을 공유받으며, 같은 메모리에 접근할 수 있죠.

사실 노드도 내부적으로는 여러 개의 스레드를 가지고 있지만 직접 제어할 수 있는 것이 하나이기 때문에 싱글 스레드라고 합니다.

스레드를 늘리는 대신에 같은 프로세스를 여러 개 복사해서 동시에 처리하는 멀티 프로세싱 방식을 사용합니다.

서버로 사용할 때 장단점


노드를 서버로 사용할 때 장단점은 싱글스레드의 장단점과 다르지 않습니다.

장점

  • 멀티스레딩 보다 자원을 적게 사용함
  • I/O작업이 많을 때 유리함 (네트워크 요청, 파일시스템 접근)
  • 웹 서버가 내장되어있어서 별도로 설치하지 않아도 됨
  • JSON 데이터 형식과의 호환성

단점

  • 싱글스레드라서 CPU 코어를 하나만 사용함
  • CPU 연산이 많은 작업에 부적합
  • 서버 규모가 커졌을 때 관리가 어려움
  • 성능이 어중간함

References


  • 조현영『Node.js 교과서』, (주)도서출판 길벗(2019년 2월 2일), p.14 ~ 22

https://namjackson.tistory.com/30 남잭슨의 개발 블로그

profile
세계 최고 수준을 향해 달려가는 개발자입니다.

2개의 댓글

comment-user-thumbnail
2020년 7월 16일

감사합니다!

1개의 답글