[221212] Node.js 개념 정리

경진·2022년 12월 12일
0

JavaScript 역사

  • JavaScript 존재 존재 이전의 웹페이지 - HTML, CSS로 간단한 스타일만 적용. (Static)
  • NetScape라는 웹 브라우저를 통해 상호작용을 강조하기 위해 간단한 기능을 넣어 동적으로 표현. (Dynamic)
  • 이후 웹 개발자들이 각 브라우저에서 개발을 해야했기 때문에 복잡한 문제들 존재. (브라우저 전쟁)
  • 표준화 작업을 위해 노력했고 그 결과 ECMA International 에서 ECMAScript(ECMA-262)라는 이름으로 현재의 JavaScript 표준을 제정.



Node.js 란

  • Chrome V8 JavaScript 엔진으로 빌드 된 JavaScript 런타임.
    • 런타임(runtime) : 프로그램이 실행되고 있는 동안의 동작.
    • V8 엔진 : Google에서 만들어 기존의 JavaScript가 브라우저 내에서만 작동이 가능했던 것을 브라우저가 없어도 작동할 수 있도록 만든 것
    • 결론 : Node.js는 구글이 만든 것이 아닌 JavaScript를 컴퓨터에서 브라우저 없이 실행하게 도와주는 환경

  • Node.js는 이벤트 기반, 논 블로킹 I/O 모델을 사용해 가볍고 효율적.
    • I/O : Input(입력)/Ouput(출력) 한 프로세스 내에서 입력과 출력이 이루어지는 과정.
      • I/O"는 주로 libUV가 지원하는 시스템 디스크나 네트워크와 상호작용하는 것을 가리킴.
        • libUV란 C++로 작성된, Node.js가 사용하는 비동기 I/O 라이브러리.
        • libUV는 운영체제의 커널을 추상화한 Wrapping 라이브러리로 커널이 어떤 비동기 API를 지원하는지 알고있다.
    • 제어권 : 자신(함수)의 코드를 실행할 권리 같은 것. 제어권을 가진 함수는 자신의 코드를 끝까지 실행 후, 자신을 호출한 함수에게 돌려줌.
    • 결과값을 기다림 : A 함수에서 B 함수를 호출했을 때, A 함수가 B 함수의 결과값을 기다리는지의 여부.
    • Blocking & Non-Blocking : A 함수가 B 함수를 호출했을 때, 제어권을 어떻게 처리하는지에 따라 달라짐.
    • Blocking I/O : A 함수가 B 함수를 호출하면, 제어권을 A 함수가 B 함수에게 넘긴 후 B 함수 실행이 끝날 때까지 잠시 멈춘 다음 B 함수 실행이 끝나면 다시 함수 A 에게 제어권을 돌려줌.
    • Non-Blocking I/O : A 함수가 B 함수를 호출해도 제어권은 그대로 A 함수가 가지고 있음. B 함수를 실행해도 A 함수는 자신의 코드 실행

  • Node.js는 싱글 스레드(Single Thread) 기반
    • 싱글 스레드(Single Thread) : 스레드를 하나 사용함. 하나의 작업만을 처리 가능.
      • 일반적으로 1개의 프로그램은 1개의 스레드 사용 가능.
      • 1개의 프로그램에서 여러 개의 스레드를 사용 가능하면 연산시간 단축
    • 스레드(Thread) : 프로그램이 동작할 때, CPU 또는 프로세서를 사용하는 단위

  • Node.js가 싱글 스레드를 사용하는 이유
    • 싱글 스레드의 이점
      • 연결 요청마다 스레드를 생성하는 체계에 비해, 스레드 생성 부하 및 스레드 유지에 대한 부담이 적어 컴퓨팅 리소스를 조금 더 효율적으로 사용 가능.
      • 스레드가 하나면 스레드들이 공유하는 자원에 대한 동시접근 문제, 즉 Race condition 상황 미 발생.
        • Race condition : 둘 이상의 입력 또는 조작의 타이밍이나 순서 등이 결과값에 영향을 줄 수 있는 상태.
      • 새로운 프로세스를 생성해 확장을 도모. 프로세스는 여러개라도 서로에 대해 스레드에 비해 독립적이므로 하나의 프로세스가 문제를 일으키더라도 다른 프로세스까지 종료될 확률은 상대적으로 낮음.
      • 이러한 특징 때문에 연결 요청의 부하에 따른 서버 확장이 매우 자유로움.

  • Node.js의 단점
    • 멀티 스레드의 연산 효율에 비춰보면 싱글 스레드는 CPU intensive한 작업에는 효율적이지 못함.

  • 극복 방법
    • 실제로 스레드를 추가하는 방법.
    • 이벤트 루프(Event Loop)를 통해 효율적으로 작업을 처리 하는 특성을 이용하여 싱글 스레드의 약점을 극복.

  • 결론
    • Node.js는 I/O 작업을 자신의 메인 스레드가 아닌 다른 스레드에 위임함으로써 싱글 스레드로 논 블로킹 I/O를 지원한다. 다르게 말하면 Node.js는 I/O 작업을 libUV에게 위임함으로써 논 블로킹 I/O를 지원하고 그 기반에는 이벤트 루프가 있다.



ES6(ECMAScript 6)

  • 초기 JavaScript는 NetScape라는 웹브라우저에서 사용하기 위해 만들어진 언어 (동적인 요소를 추가하기 위함)
  • 추후 Internet Explorer 등 다른 브라우저도 비슷한 언어 개발 시작
  • 브라우저마다 개발하는 방식이 달라 표준화 시키는 작업이 필요하였고, 그렇게 ECMAScript가 만들어짐.
  • 이 표준은 매년 꾸준히 변경되고 새로운 기능이 추가되면서 새로운 버전이 나옴.
  • ES6 : ECMAScript의 6번째 버전. (2015년에 발표, ECMAScript 2015라고도 함)



REPL

  • 일반적인 REPL 환경 설명
    • 입력 받은 코드를 읽어(Read)들여 메모리에 저장하고, 평가(Evaluate)된 값을 출력(Print).
    • 특정 신호를 입력받기 전까지 위의 과정을 반복(Loop).
  • 입력하는 코드의 결과 값을 즉시 확인 할 수 있기 때문에 간단한 문법 테스트 등 테스트에 적합한 개발 환경으로 볼 수 있음.
  • Node.js는 REPL 환경 제공
profile
항상 처음 세웠던 목표 처럼

0개의 댓글