1. Node.js 란?

Hyun·2023년 4월 27일
0

nodejs

목록 보기
1/19

1. Node.js 소개

JS로 서버 만드는거요

Node.js의 공식 사이트에서는 Node.js를 다음과 같이 정의합니다
'Node.js는 크롬 V8 Javascript 엔진으로 빌드된 Javascript 런타임'

런타임은 특정 언어로 개발된 프로그램을 해석하고 실행 할 수 있는 환경인데 JavaScript 런타임은 JS로 구현된 프로그램을 해석하고 실행 할 수 있는 환경을 말합니다. 즉 흔히 아는 프레임워크나 서버가 아니에요.

2. Node.js 특징

특징을 이야기 하기전 3가지 시나리오에 대해 살펴봅시다

시나리오 1)
스레드(Thread)라는 청년이 분식집을 개업했습니다.
자본금은 충분하지 않았지만 자신감은 뿜뿜인 스레드는 혼자서도 잘할거라고 생각해서 혼자 일하기로 결심했습니다.

가게를 오픈하고 첫 손님을 받아 요리를 하던 도중, 2번째 손님이 왔습니다.
스레드는 요리를 하고 있어서 2번째 손님의 주문을 받지 못했고 2번째 손님은 스레드의 요리가 끝날때까지 기다리다가 요리가 끝나고서야 주문을 받을 수 있었습니다. 그로 인해, 2번째 손님은 스레드의 가게에 대해 안좋은 인상을 갖게 되었습니다.

시나리오 2)
금수저 A씨는 김밥천국에 버금가는 엄청 큰 분식집을 개업했습니다.
동시에 여러명이 와도 여러개의 주문을 받아 처리 할 수 있도록 여러명의 직원을 채용했는데 이들을 스레드(Thread)라고 불렀습니다.
여러 직원을 둔 덕분에 주문이 우다다 드러와도 문제없이 주문을 받고 음식을 제공 할 수 있었습니다.

장사가 아주 잘 되었지만 어느날, 물가도 오르고 불경기가 찾아왔습니다.
가게에 손님이 줄고 직원들이 할 일이 없어 월급루팡을 하는 바람에 가게를 유지하는데 드는 비용이 커지게 되었고 가게는 적자에 시달리게 되었습니다.

시나리오 3)
혼자 가게를 운영하던 스레드(Thread)는 어떻게 해야 효율적으로 가게를 운영할 수 있을까 고민이 생겼습니다. 그러던 중 논블로킹(Non-Blocking)이라는 요리 로봇을 구매하게 되었습니다.

이제 논블로킹이 있기때문에 손님이 여러명 오더라도 주문을 받아 기계에게 지시만 내리고 주문을 받을 수 있게 되었습니다.
손님들은 이제 주문을 하기위해 대기할 필요가 없었고, 스레드 역시 라면이 만들어지는 동안 가만히 기다릴 필요가 없게 되어 기계값만 들고 최대의 효율을 얻게 되었습니다.

만약 금수저라면 성능면에서는 시나리오2가 제일 좋다!
하지만 가진 자원이 한정적이라면 최소비용으로 최대효율을 내는 시나리오3이 좋을 것이다.

프로그래밍 언어마다 차이점이 있지만 대표적으로 자바(JAVA)가 시나리오2에 해당하고 우리의 Node.js는 시나리오3에 해당이된다.

즉, Node.js는 적은 자원으로도 최대한의 효율을 올릴 수 있다는 특징을 가지고 있고 가볍고, 빠르고, 성능도 좋다!

이제 Node.js가 가진 3가지 특징에 대해 살펴보자.

3. 논블로킹(Non-blocking) I/O

JS는 한번에 하나의 착업을 처리하지만 I/O 작업의 경우는 JS도 동시에 처리를 할 수 있다.

  • I/O : 파일 읽기/쓰기와 같은 파일 시스템 처리와 DB로 데이터를 전송/조회하는 일과 같은 네트워크를 통한 요청

먼저, 블로킹(Blocking)과 논블로킹(Non-Blocking)에 대해 알아보자

  • 블로킹 : 함수를 호출하면 호출된 함수가 작업을 마칠 때까지 제어권을 돌려주지 않고 함수가 종료될 때까지 대기하는 방식
  • 논블로킹: 함수를 호출하면 호출된 함수에게 바로 제어권을 넘겨줘서 다른 작업을 바로 진행할 수 있도록 하는 방식
  • 블로킹 I/O로 파일 쓰기할 때의 작업 프로세스 과정
    1) 함수를 호출해서 파일 쓰기를 요청
    2) 파일 쓰기를 실행
    3) 파일 쓰기가 완료될 때까지 다음 코드를 실행하지 않고 대기(block)
    4) 파일 쓰기가 완료 되면 다음 코드 실행
  • 논블로킹 I/O로 파일 쓰기할 때의 작업 프로세스 과정
    1) 함수를 호출해서 파일 쓰기를 요청
    2) 바로 다음 코드를 실행
    3) 파일 쓰기가 실행
    4) 파일 쓰기가 완료되면 콜백(call-back) 함수를 통해 파일 쓰기 완료 되었다고 알려줌
    5) 파일 쓰기 완료 후 실행해야 할 프로그램 실행

결론) 논블로킹 I/O는 파일 쓰기를 요청한 후 바로 다른 작업을 할 수 있기에 좀 더 효율적이다.

4. 싱글 스레드(Single Thread)

  • Node.Js는 싱글스레드 방식 == 스레드 하나를 사용
    즉, 동시에 하나의 작업만을 처리한다든 뜻
  • JS같은 싱글 스레드 방식의 언어는 작성된 프로그램을 순차적으로 실행하고, 여러 작업을 동시에 처리X
  • 시나리오 2같은 경우는 여러 스레드를 두었기 때문에 동시에 여러작업을 진행할 수 있는 방식을 멀티 스레드라고 함
  • 컴퓨터의 작업처리 방식
    1) '프로세스'라는 작업 단위를 두고 프로그램을 실행함
    2) 컴퓨터에서 동작하는 Node.Js를 포함한 여러가지 프로그램은 개별적인 프로세스로 리소스를 할당받고 실행
    3) 스레드는 프로세스 안에서 작업을 처리하기 위해 실행되는 흐름의 단위
    4) 하나의 프로세스는 여러 개의 스레드를 생성해서 여러 작업을 동시에 처리 할 수 있다


    Node.Js를 실행한 컴퓨터도 여러 스레드를 생성을 하지만 직접 제어할 수 있는 스레드는 한 개여서 싱글 스레드라고 부르는 것이다.

그럼 멀티 스레드 쓰는게 제일 좋은거 아닙니까?
멀티 스레드를 쓰면 물론 동시에 여러 작업을 실행 할 수 있고, 성능 면에서 좋을 지 모르지만 굉장히 많은 자원이 필요하다.
자원을 제대로 쓰지 않으면 오히려 비효율적이다.

5. 이벤트 루프(Event Loop)

Node.Js는 V8 JS엔진과 libuv, llhttp, c-ares, OpenSSL, zlib라는 라이브러리로 구성되어있다.
libuv 라이브러리는 이벤트 루프를 통해서 JS가 가진 싱글 스레드의 약점을 극복하고 효율적으로 작업을 처리하기 위해 고안되었다.

V8 엔진은 2가지 주요 컴포넌트로 구성이 되어있다.

  • 메모리 힙 : 메모리 할당이 일어나는 컴포넌트
  • 콜 스택 : 코드 실행을 위한 컴포넌트

WebAPI : 브라우저 자체에서 제공하는 기능(DOM,AJAX,Timeout 등)

JS는 싱글 스레드 언어이고, 이것은 1개의 콜 스택을 가진다는 뜻
그래서 한 번에 하나의 작업만을 처리 할 수 있다.
JS는 처리해야 할 작업을 콜 스택에 쌓고 하나씩 처리함

작동방식

1) 콜 스택에서 실행한 비동기 함수는 WebAPI를 호출
2) WebAPI는 콜백 함수를 콜백 큐에 밀어 넣는다.
3) 이벤트 루프는 콜 스택과 콜백 큐의 상태를 체크하고, 콜 스택이 비어있으면 콜백 큐의 첫 번째 콜백을 콜 스택으로 이동시킴
4) 이러한 작업이 반복적으로 이루어지는데, 이를 '틱'이라 부름

6. 결론

  • Node.Js는 논블로킹 I/O, 싱글 스레드, 이벤트 루프를 통한 높은 처리 성능을 가짐
  • 그럼 Node.Js는 멀티 스레드 못 하나요?
    => Cluster 모듈이나 PM2를 사용해서 멀티 스레드 효과를 볼 수 있다!
    정확히는 CPU의 코어를 추가적으로 사용해서 작업을 병렬적으로 처리
    CPU 코어 하나당 프로세스 하나가 실행이 되는데, 여러 개의 코어를 사용해서 여러 개의 프로세스로 Node.js를 실행한다.
    이를 클러스팅(Clustering)이라 부른다.

    요청을 분산시키고 병렬로 처리 할 수 있기 때문에 멀티 스레드 언어로 동일한 효과를 볼 수 있다.

0개의 댓글