Node.js

gjeon·2021년 10월 3일
0

Node.js

목록 보기
1/3

Node.js란?

Node.js®는 Chrome의 V8 JavaScript 엔진을 기반으로 하는 JavaScript 런타임 입니다.
비동기식 이벤트 기반 JavaScript 런타임인 Node.js는 확장 가능한 네트워크 애플리케이션을 빌드하도록 설계되었다. -node.js
Node.js는 확장성 있는 네트워크 애플리케이션(특히 서버 사이드) 개발에 사용되는 소프트웨어 플랫폼이다. 작성 언어로 자바스크립트를 활용하며 논블로킹(Non-blocking) I/O와 단일 스레드 이벤트 루프를 통한 높은 처리 성능을 가지고 있다.
내장 HTTP 서버 라이브러리를 포함하고 있어 웹 서버에서 아파치 등의 별도의 소프트웨어 없이 동작하는 것이 가능하며 이를 통해 웹 서버의 동작에 있어 더 많은 통제를 가능케 한다. -위키백과

특징

V8 JavaScript 엔진을 기반으로 하는 JavaScript 런타임

V8

V8은 웹 브라우저를 만드는 데 기반을 제공하는 오픈 소스 자바스크립트 엔진이다. 구글 크롬 브라우저와 안드로이드 브라우저에 탑재되어 있다. V8로 줄여 불리기도한다.
V8은 자바스크립트를 바이트코드(bytecode)로 컴파일하고 실행하는 방식을 사용한다.추가적인 속도향상을 위해 인라인 캐싱(inline caching)과 같은 최적화 기법을 적용하였다. -위키백과
구글에서 제작한 자바스크립트 엔진이다.

런타임

프로그래밍 언어가 구동되는 환경. 즉 "어떤 프로그래밍 언어가 동작 할 수 있는 프로그램"

non-blocking I/O 이벤트 기반 비동식 방식

논블로킹

다른 주체의 작업과 관계없이 자신의 작업을 계속한다.

비동기

동시에 일어나지 않는다를 의미한다. 요청과 결과가 동시에 일어나지 않을거라는 약속이다.
노드 사이의 작업 처리 단위를 동시에 맞추지 않아도 된다.

  • 장점
    결과가 주어지는데 시간이 걸리더라도 그 시간 동안 다른 작업을 할 수 있으므로 자원을 효율적으로 사용할 수 있다.
  • 단점
    동기보다 복잡하다.

이벤트 루프

  • 이벤트 루프는 여러 이벤트가 동시에 발생했을 때 어떤 순서로 콜백함수를 호출 할지를 이벤트 루프가 판단한다.
  • 노드는 이벤트가 종료될 때까지 이벤트 처리를 위한 작업을 반복하므로 루프 라고 부른다.
  • 태스크가 들어오길 기다렸다가 태스크가 들어오면 이를 처리하고, 처리할 태스크가 없는 경우엔 잠드는, 끊임없이 돌아가는 자바스크립트 내 루프이다.

글만 봐서는 이해가 잘 가지 않아 따로 정리를 해야겠다.

단일 스레드

  • 하나의 프로세스에서 하나의 스레드 실행
  • 하나의 레지스터와 스택으로 표현

    단일 스레드 이벤트 루프 기반 비동기방식(Non-blocking)
    하나의 스레드가 request를 받으면 바로 다음 처리에 요청을 보내놓고 다른 작업을 처리하다가 먼저 요청한 작업이 끝나면 이벤트를 받아서 응답을 보낸다.
    동시 request가 오더라도 처리가 완료될때까지 기다리지 않아도 되기 때문에 서버 부하가 적다.

장점

  • 자바스크립트를 동일하게 사용해서 서버단 로직을 처리할 수 있다.
  • Non-blocking I/O와 단일 스레드 이벤트 루프를 통한 높은 처리 성능
  • 이벤트 기반 비동기방식이라 서버 무리가 적다.
  • 다양한 모듈(패키지) 제공
  • npm 을 이용해 자신이 필요한 라이브러리와 패키지를 검색해서 설치하고 사용할 수 있어 효율성이 좋다.
  • 구글이 만드는 JavaScript 엔진을 사용하는데 구글은 V8 엔진 성능 업그레이드를 계속 하고있다.
  • 데이터를 실시간으로 다루는 애플리케이션이나 싱글페이지 애플리케이션, 입출력이 잦은 애플리케이션을 개발할 때 뛰어난 효율성을 발휘한다.

단점

  • 이벤트 기반 비동기방식이라 서버단 로직이 복잡한 경우 콜백함수의 늪에 빠질 수 있다.
    예를 들어, 한번의 요청에 대해 DB에서 조회한 결과값에 따라 다른 로직을 처리해야 하며, 이런 로직이 여러개인 경우 콜백함수 늪 (Callback Hell) 에 빠진다.
  • 단일 스레드이기 때문에 하나의 작업 자체가 시간이 많이 걸리면 전체 시스템의 성능이 아주 급격하게 나빠지므로 CPU사용률이 높은 애플리케이션에서 Node.js사용을 권장하지 않는다.
  • 코드가 수행되어야 코드에 에러가 있는지 알 수 있으며, 에러가 날 경우 프로세스가 내려가기 때문에 테스트가 엄청 중요하다. 반드시 모든 케이스에 대해 소스코드를 검증해야 한다.

주의

  • V8 엔진을 기반으로 하는데, 이 V8 엔진은 Garbage collection 기반의 메모리 관리를 하기 때문에, GC시 CPU 사용률이 Spike를 치면서 순간적으로 서버를 멈추게할 수 있다는 문제점을 가지고 있다.
  • node.js를 사용한 사람들에게서 들려오는 가장 많은 경험담은 자바스크립트 자체를 배우는 것보다는 프로그래밍 컨셉을 기존의 컨셉에서 Event 기반의 프로그래밍 컨셉으로 전환하는데 많은 시간이 걸렸다고 한다. 코드를 순차적으로 실행하는 것이 아니라, 비동기 방식으로 이벤트를 보내놓고, 그 응답에 대한 이벤트가 오면 핸들러를 통해서 처리 하는 형식이기 때문에, 기존 서버 프로그래밍 모델과는 많은 차이를 보인다.
  • 개발 관점에서는 빠르고 쉬운 장점이 있지만, 반대로 운영 관점에서는 테스트, 장애 대응, 디버깅등에 대해서는 신경써야 할 부분이 훨씬 더 많다.
    -조대협의 블로그

정리

  • 이전에는 JavaScript 런타임이 브라우저 밖에 없었지만, Node.js 라는 새로운 JavaScript 런타임이 나온것이다.JavaScript 가 브라우저가 아닌 곳에서 실행될 수 있으니, JavaScript 를 이용해서 웹페이지 뿐만 아니라 서버와 같은 다른 프로그램을 만들 수 있다.
  • Node.js는 백엔드, 웹 서버, 서버 사이드 스크립트 언어가 아니라 JavaScript 실행 환경에 불과하다.
  • 다양한 모듈을 사용할 수 있고 간단한 로직과 빠른 개발을 할 수 있는 등 다양한 장점이 있지만, 운영 관점에서는 테스트, 장애 대응, 디버깅등 약점이 있다.

Reference

https://nodejs.org/en/about/
https://ko.wikipedia.org/wiki/Node.js/
https://junspapa-itdev.tistory.com/3/
https://ko.wikipedia.org/wiki/V8_(%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8_%EC%97%94%EC%A7%84)/
https://xhwogusxh.tistory.com/88/
https://perfectacle.github.io/2017/06/18/what-is-node-js/
https://hanamon.kr/nodejs-%EA%B0%9C%EB%85%90-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0/
https://meetup.toast.com/posts/89/
https://ko.javascript.info/event-loop/
https://private.tistory.com/24/
https://medium.com/@yeon22/node-js-node-js%EB%9E%80-410ae3749c56/
https://deveric.tistory.com/99/
https://bcho.tistory.com/876/

profile
개발자 되기

0개의 댓글