포시코딩

[Node.js] with 논 블로킹, 싱글 스레드, 이벤트 루프 본문

Node.js

[Node.js] with 논 블로킹, 싱글 스레드, 이벤트 루프

포시 2022. 12. 12. 11:48
728x90

Node.js란?

크롬 v8 Javascript 엔진으로 빌드된 Javascript 런타임.

즉, Javascript를 컴퓨터에서 브라우저 없이 실행하게 도와주는 환경을 의미한다.

 

Node.js의 특징 세가지

  • 논 블로킹(Non-blocking) I/O
  • 싱글 스레드(Single Thread)
  • 이벤트 루프(Event Loop)

논 블로킹(Non-blocking)

기존의 블로킹(Blocking) I/O는 프로그램 내부에서 함수를 호출하면

호출된 함수가 작업을 마칠 때까지 대기하는 방식인 반면, 

논 블로킹(Non-blocking) I/O는 함수가 실행되는 중에도 다른 작업을 동시에 진행할 수 있는 장점이 있다.

싱글 스레드(Single Thread)

싱글 스레드(Single Thread)스레드 하나를 사용하는 것이며, 동시에 하나의 작업만을 처리할 수 있다.

스레드(Thread)란?

-> 프로그램이 동작할 때, CPU 또는 프로세서를 사용하는 단위.

     일반적으로 1개의 프로그램1개의 스레드를 사용할 수 있다.

     하지만 1개의 프로그램에서 여러개의 스레드를 사용할 수 있다면 연산할 수 있는 시간을 단축 시킬 수 있다.

그럼에도 Node.js가 싱글 스레드를 고집하는 이유

더보기

사실 싱글 스레드는 많은 이점을 제공한다. 

연결 요청마다 스레드를 생성하는 체계에 비해 스레드 생성 부하스레드 유지에 대한 부담이 없어 

같은 컴퓨팅 리소스라도 조금 더 효율적으로 사용할 수 있는 특징이 있다.

또한 스레드가 하나라는 것은 스레드들이 공유하는 자원에 대한 동시접근 문제. 즉, Race condition(경쟁 상태) 상황이 

발생하지 않는다는 것을 의미한다.

공유자원이 없으니 여러 스레드가 하나의 오류로 인해 모두 문제를 일으키는 상황도 발생하지 않는다.

 

Node.js는 차라리 새로운 프로세스를 생성해 확장을 도모한다. 

프로세스는 여러개라도 서로에 대해 스레드에 비해 독립적이므로 하나의 프로세스가 문제를 일으키더라도

다른 프로세스까지 모두 종료될 학률은 상대적으로 낮다.

 

이러한 특징 때문에 연결 요청의 부하에 따른 서버 확장이 매우 자유롭다.

즉, Node.js는 특히 웹 서버에 특화된 철학이 녹아있는 언어라는 것.

 

하지만 아무리 싱글 스레드만의 장점이 있다고 해도 멀티 스레드의 연산 효율에 비춰보면 단점이 드러나는 것은

싱글 스레드 설계 자체가 가지고 있는 문제이다.

이 때문에 Node.js는 CPU intensive한 작업에는 효율적이지 않다.

물론 이러한 약점을 극복하기 위한 방법들도 제공되고 있으며, 실제로 스레드를 추가로 생성할 수 있는 방법들도 존재하지만(!)

Node.js의 철학은 싱글 스레드에 기반하고 있다는 사실을 기억해야 한다.

이벤트 루프(Event Loop)

이벤트 루프(Event Loop)는 Javascript가 가지고 있던 싱글 스레드의 약점을 극복하기 위해 효율적으로 작업을 처리할 수 있는 특성

[링크](이벤트 루프에 대해)

[링크](이벤트 루프 공식 문서)

[링크](이벤트 루프 이해하기)

 

Node.js의 REPL

REPL이란?

  • 일반적으로 'REPL 환경'이라 함은 아래와 같다.
    • 입력 받은 코드를 읽어(Read)들여 메모리에 저장하고, 평가(Evaluate)된 값을 출력(Pinrt)한다.
    • 특정 신호를 입력받기 전까지 위의 과정을 반복(Loop)한다.
  • 쉽게 말하자면 입력하는 코드의 결과 값을 즉시 확인 할 수 있기 때문에 간단한 문법 테스트, 테스트 등으로
    아주 적합한 개발 환경으로 볼 수 있다.
  • Node.js는 REPL 환경을 제공하고 있으며, 우리는 그것을 쉽게 이용할 수 있다.

웹 브라우저의 콘솔과 다른점

웹 브라우저의 개발자 도구에 보이는 콘솔 창에서 자바스크립트 코드를 바로 작성할 수 있는데, 

이것도 REPL이 맞지만 Node.js에서의 REPL 환경과 다르게 Node.js가 제공하는 API를 사용할 수 없고

브라우저의 API를 사용해 DOM을 제어할 수 있다는 차이가 있다.

 

추가로 공부할 키워드

  1. Node.js의 장단점
  2. Node.js의 동작 원리는 어떻게 구성되어 있는지
  3. 이벤트 루프(Event Loop), libuv는 Node.js와 어떤 관계가 있는지

 

+추가 자료들

[링크](Node.js에 대해 - 공식문서)

[링크](Node.js의 작동원리, 싱글스레드, 논블로킹I/O, 이벤트기반)

728x90