Node.js - node.js의 특성

리문·2022년 9월 6일
0

node.js


  • Chrome V8 Javascript 엔진으로 빌드된 Javascript 런타임.

서버


  • 네트워크를 통해 클라이언트에 정보나 서비스를 제공하는 컴퓨터 또는 프로그램.
    • 클라이언트
      • 요청을 보내는 주체.
      • 브라우저, 데스크톱 프로그램, 모바일 앱, 다른 서버에 요청을 보내는 서버일 수도 있음.
  • 서버는 요청에 응답을 함. -> 다른 서버에 요청을 할 수도 있음.(이 때는 이 서버가 클라이언트임)
  • 요청에 대하여 항상 YES라는 응답을 하지는 않는다.

자바스크립트 런타임


  • 특정 언어로 만든 프로그램들을 실행할 수 있는 환경.
  • 노드 또한 자바스크립트 런타임이므로 자바스크립트 프로그램을 컴퓨터에서 실행할 수 있다.
  • 브라우저에도 자바스크립트 런타임이 내장되어 있으므로 자바스크립트 코드를 실행할 수 있다.
  • 브라우저 외의 환경에서도 실행시키려 시도했으나 실행 속도 문제로 잘 사용되지 않았다.
  • 구글의 V8엔진은 매우 빨랐으며, 이를 바탕으로 노드 프로젝트가 시작되었음.
  • 노드는 libuv라는 라이브러리를 사용함.
    • V8엔진과 libuv는 C와 C++로 구현되어 있다.
    • 자바스크립트 코드를 노드가 V8과 libuv에 바인딩해준다.
    • libuv 라이브러리는 노드의 특성인 이벤트 기반, 논 블로킹 I/O 모델을 구현함.

이벤트 기반


  • 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식.

  • 특정 이벤트가 발생할 때 무엇을 할지 미리 등록해두어야함. -> Event listener에 Callback 함수를 등록.

  • 노드는 이벤트가 발생하면 이벤트 리스너에 등록해둔 콜백함수를 호출. -> 다음 이벤트가 없으면 발생까지 대기.

  • 이벤트 루프

    • 여러 이벤트가 발생했을 때, 어떤 순서로 콜백 함수를 호출할지 판단.
    • 노드가 종료될 때까지 반복함 -> 루프.
    • 코드의 맨 윗줄부터 실행 -> 함수 호출이 있을 경우 호출 스택에 넣음.
    • 호출 스택에 들어있는 함수는 LIFO 형식으로 실행이 완료됨.
    • 실행이 완료된 함수는 순서대로 호출 스택에서 지워짐.
    • anonymous함수 : 처음 실행시의 전역 컨텍스트.
      • 컨텍스트 : 함수가 호출되었을 때 생성되는 환경.
  • 백그라운드

    • 타이머나 이벤트 리스너가 대기하는 곳.
    • 여러 작업이 동시에 실행될 수 있음.
  • 태스크 큐

    • 이벤트 발생 후, 백그라운드에서 타이머나 이벤트 리스너의 콜백함수를 받음.
    • 완료된 순서대로 들어오나, 특정한 경우에는 순서가 바뀌기도함.
    • 하나가 아닌 여러개의 큐로 이루어져 있음.

  • 이벤트 루프

논 블로킹 I/O


  • 이전 작업에 완료될 때까지 대기하지 않고 다음 작업을 수행하는 것.
  • 자바스크립트 상의 작업은 동시에 처리할 수 없으나, I/O 작업은 동시에 처리될 수 있음.
  • 노드는 백그라운드에 I/O작업을 넘겨 동시에 처리함. -> I/O 작업을 한번에 묶어서 백그라운드로 넘기는 것이 시간 상으로 효율적임.
  • 논 블로킹동시 가 같은 의미가 아님.

  • 블로킹과 논 블로킹 방식의 차이

  • 동시 처리 가능한 작업을 묶어서 작업해야 시간상의 효율을 볼 수 있음.


싱글 스레드


  • 스레드가 하나인 것.

    • 스레드

      • 프로세스 내에서 실행되는 흐름의 단위.
      • 프로세스는 스레드를 여러개 생성하여 여러 작업을 동시에 처리.
      • 스레드들은 부모 프로세스의 자원을 공유.
      • 같은 주소의 메모리의 접근 가능하므로 데이터를 공유할 수 있음.
    • 프로세스

      • 운영체제에서 할당하는 작업의 단위.
      • 프로세스 간에는 메모리 등의 자원을 공유하지 않음.
  • 노드는 하나의 프로세스를 생성하고, 프로세스가 스레드를 여러개 생성하는 데, 직접 제어할 수 있는 스레드는 하나 뿐임 -> 싱글스레드.

    • 노드가 싱글 스레드로 동작하지 않는 경우
      • 스레드 풀 : 특정 동작을 수행할 때, 스스로 멀티 스레드를 사용.
      • 워커 스레드 : CPU작업이 많은 경우, 직접 멀티 스레드를 사용할 수 있음.
  • CPU 작업이 많을 때멀티 스레드가 효과적이나, 프로그래밍이 어렵고, I/O 작업이 많을 때는 비교적 쉬운 멀티 프로세싱이 효율적이므로, 노드는 이것을 사용한다.


  • 스레드는 프로세스 내에서 실행되는 흐름

서버로서의 노드


  • 노드는 싱글 스레드, 논 블로킹 모델을 사용. -> 장단점도 이와 비슷함.

  • 장점

    • I/O 작업이 많은 서버로 적합.
    • 웹 서버가 내장되어 있어, 쉽게 접근이 가능.
    • 자바스크립트를 사용. -> 웹 브라우저도 자바 스크립트를 사용하므로, 하나의 언어로 웹 사이트를 개발 할 수 있음.
  • 단점

    • CPU 작업이 많은 서버로는 부적합.
    • 서버 규모가 커졌을 때 서버를 관리하기가 어려움.
    • 싱글 스레드이므로, 에러를 제대로 처리하지 못하여 스레드가 멈추면 서버 전체가 멈춤.
    • Go, nginx, 웹 서버에 비하여 속도가 느림.
profile
개발자되기 대작전

0개의 댓글