[Node.js] 노드 시작하기

노드 시작하기

노드(Node.js)란 무엇인가?

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

** 런타임 : 컴퓨터 프로그램이 실행되는 동안의 동작

** 런타임 환경(Runtime Environment) : 컴퓨터가 실행되는 동안 프로세스나 프로그램을 위한 소프트웨어 서비스를 제공하는 가상머신의 상태

–> Node.js를 설치했을 때 런타임 환경이 갖춰지기 때문에 자바스크립트를 웹 브라우저 바깥에서 사용할 수 있는 것이다.

노드 버전 확인

  • node -v : 노드 버전 확인

  • npm -v : npm 버전 확인
  • npm i -g npm : npm을 최신 버전으로 업데이트

노드 설치 이후

cli 환경에서 node 를 입력하면 >가 생기면서 개발자 도구의 콘솔 처럼 JavaScript를 입력할 수 있게 된다.

–> 이러한 콘솔을 REPL(Read, Evaluate, Print, Loop) 이라고 한다.

–> 실제 개발을 할 때에는 CLI 환경에서 일일이 한줄씩 치면서 개발하지는 않는다…

–> TextEditer 또는 IDE 에서 JS 파일을 생성하고 JS 코드를 작성한 뒤 terminal을 열어서 node [파일명] 형태로 명령어를 입력하면 node.js에서 해당 파일을 읽고 JS 코드를 실행한 결과를 보여준다.

노드의 핵심 개념

  1. 이벤트 기반 (Event-Driven)
  2. 논 블로킹 I/O 모델 (Non-Blocking I/O Model)
  3. 싱글 스레드 (Single-Thread)

이벤트 루프

호출 스택(Call Stack)이 비워지면 태스크 큐(Task Queue)에서 작업(주로 콜백함수)을 꺼내오는 역할을 한다.

–> 이벤트 루프는 태스크 큐에 저장된 함수들을 어떤 순서로 꺼내와야 할 지 기억하고 있다가 순서에 맞춰서 태스크 큐를 꺼내서 다시 호출 스택에 넣어준다.

–> 하지만 태스크 큐에서 함수를 꺼내는 우선순위는 함수가 어떻게 작성되었는지에 따라 바뀔 수 있다. (즉, 태스크 큐에서 작업을 순서대로 꺼내는 중에 다른 이벤트 리스너의 콜백이 새치기를 해서 다른 작업들보다 먼저 호출 스택으로 꺼내질 수도 있다.)

** 그렇다면 언제 태스크 큐에 들어가는가?

  • setTimeout, setInterval, setImmediate(노드에만 있는)
  • Promise - resolve / reject
  • async / await

  • 이벤트 리스너의 콜백(이벤트 리스너가 실행될 때 콜백이 태스크 큐로 들어간다.)

이벤트 기반

노드 서버는 수많은 이벤트 리스너로 구성되어 있고, 해당 이벤트가 발생했을 시 이벤트 리스너에 등록된 콜백을 태스크 큐에 등록하고, 태스크 큐에서 이벤트 루프가 우선순위대로 호출스택에 작업(콜백함수)을 넘겨서 실행시킨다.

논 블로킹 I/O

호출 스택에서 콜백 함수를 태스크 큐로 보내버리는 것을 논 블로킹 이라고 한다. (눈에 보이는 실행 순서와 달라진다.) –> 즉, 논 블로킹은 코드의 실행순서와 관련이 있다.

I/O (=== Input / Output) 는 파일 시스템 I/O 와 네트워크 I/O 로 구분된다. 노드 서버에 대한 I/O는 자체적으로 자동으로 논 블로킹으로 실행된다. (파일 시스템 I/O의 경우에는 논 블로킹 + 멀티 스레드로 작동하고, 네트워크 I/O의 경우에는 논 블로킹으로 실행된다.)

싱글 스레드

한 번에 한 가지 일 밖에 못한다. –> 그래서 블로킹이 발생한다. (하나가 실행되는 동안 나머지는 기다린다.)

** 노드는 싱글 스레드의 단점을 멀티 프로세스로 극복한다.

댓글남기기