분명 nodejs는 크롬의 v8엔진을 사용한 런타임이라고 배웠었다.
팀원의 “nodejs가 뭐에요?”라는 질문에 “자바스크립트를 기반의 크롬의 v8엔진을 탑재한 내pc에서 동작하는 서버입니다”라고 대답했다.

그리고 팀원의 “엄밀히 말하면 틀렸습니다” 라는 대답..다시공부하자..

1. nodeJs란?

nodejs를 한문장으로 말하자면 크롬 브라우저의 V8 javascript 엔진을 탑재한 server side 오픈소스 javascript runtime이다.
서버를 만드는 런타임 환경이지 nodejs가 서버는 아니다.

JavaScript

브라우저(크롬,사파리.웨일)에서 HTML의 생성부터 페이지의 기능을 동적으로 처리되도록 만들어주는 브라우저에서 실행되는 프로그래밍 언어이다.

V8 javascript Engine

V8? EcmaScript 표준과 webAssembly를 구현한 크롬에서 사용하는 자바스크립트 엔진이다. open source로 C++로 작성되어 높은 성능을 보여준다.

2008년, google이 주도하여 C++로 개발한 고성능의 자바스크립트 기반의 엔진이다.
Node.js에 사용된 C++로 작성된 V8 엔진은 인터프리터 방식이 아닌 JavaScript로 작성된 코드를 컴퓨터가 해석하기 쉬운 바이트 코드로 변환하는 JIT 컴파일 방식을 채택하고 있으며, V8의 최적화 기법으로 놀라운 속도로 작업을 수행한다. Google의 이 엔진에 막대한 투자를 하고있으며 덕분에 V8은 매년 성능 향상을 보여주고 있다.
V8엔진은 js언어로 작성된 코드를 컴퓨터가 해석하기 쉬운 바이트 코드로 변환하는 역할을 하여 빠른 처리속도로 js를 브라우저가 아닌곳에서도 실행할 수있게 만들고자하는 말에 불을 붙였다.
v8엔진을 구글이 개발하였다면 모질라는 Rhino, 파이어폭스는 spiderMonkey 사파리는 JavaScriptCore를 만들었다.

Server Side

서버사이드란 서버쪽으로 보내 처리하는 것을 말하며, 사용자에게 보낼 웹페이지를 만들며, 인증인가, DB같은 중요한 작업을 수행한다.

javascript Runtime

Runtime이란? 자바스크립트 또는 컴퓨터가 실행되는 환경을 말한다.

위에서 말했듯이 nodejs는 주로 API(HTTP)서버를 구축하는데 활용된다. nodejs의 어떤점이 서버개발을할때 좋은 걸까?

Single Thread

자바스크립트는 싱글스레드언어이기 때문에 멀티쓰레드 작업을 할 수 없다. nodejs의 어플리케이션은 single thread로 어플리케이션에 필요한 함수들을 처리한다. nodejs의 api는 이벤트가 발생했을때 함수들을 콜백형태로 전달해주는데 nodejs는 병렬적으로 처리해준다. 싱글스레드인데 어떻게 멀티쓰레드로 그렇개 빠르게 작업할 수 있을까? 이유는 nodejs의런타임환경때문이다.

Non-Blocking I/O

Input/Output은 데이터르 읽고 쓰는것을 말한다. Blocking은 하나의 작업이 끝나기를 기다렸다가 끝나고 넘어가는 것을 말한다.(동기) Non-Blocking은 기다리지않고 작업을 수행하고 완료를 기다리지않고 콜백만던지고 다음 작업으로 넘어간다.(비동기)

Event-Driven

위의 작업이 끝나면 event를 통해서 콜백을 호출하게 한다.

🤔 그래서 nodejs는 싱글쓰레드야 멀티쓰레드야? 우리가 만든 어플리케이션은 메인 싱글 쓰레드에서 동작한다. 이벤트루프를 통해 호출된 콜백들은 싱글쓰레드에서 실행되기때문에 무한으로 이벤트루프를 돌리거나 오래걸리는 작업을 실행할경우 멈추게된다.

그런데 node 12버전에서 worker threads를 사용하여 멀티쓰레드를 돌릴 수 있게 되었다.

2. nodejs의 서버

현재까지도 사용되고있는 nodejs를 사용하지않는 서버는 요청이 들어오면 요쳥별로 쓰레드를 할당하여 처리하였다. 이경우 다수의 요청이 들어올경우 할당가능한 쓰레드가 없을 경우 대기해야하는 문제가 있다.

nodejs 서버의 경우 이 요청을 받아서 처리하는 대기표를 주는 기능이있다. 때문에 다수의 요청을 받고 비동기방식과 이벤트드리븐을 통해 빠르게 처리할 수 있다.

2. nodejs의 장점

✅ Frontend와 Backend 기술 스택 통합

  • 프론트엔드와 백엔드 양쪽이 동일한 언어를 사용하여 서로에게 도움을 줄 수 있다.
  • 개발에 사용한 코드를 모듈로 만들어서 재사용할 수 있다.
  • Javascript를 공부한 개발자의 서버 프로그래밍 진입장벽을 낮출 수 있다.
  • 개발팀의 전반적인 생산성이 향상된다.

✅ 빠른 처리 속도와 동시 요청 처리 성능

  • C++로 작성된 V8엔진의 최적화로 빠른 속도로 작업을 수행한다.
  • V8 엔진과 더불어 libuv라는 비동기 I/O에 중점을 둔 오픈 소스 라이브러리를 사용함으로써 이벤트 기반(Event Driven), Single Thread, non-blocking I/O 모델을 구현한다.
    덕분에 Node.js는 지연(blocking) 없이 동시 요청을 빠르게 처리할 수 있습니다.
  • MSA(Micro Sewrvice Architecture)에 적합하다.

🤔 Monoilthic Architecture?

기존에 하나의 서버에서 결제,인증,스트리밍 등의 모든 기능이 포함되어 있는 구조

🤔 MSA(Micro Service Architecture)?

서비스별로 독립적으로 나누어서 구성되는 아키텍쳐로 결제 기능, 인증기능을 분리하여 하나의 시스템에서 하나의 기능만 하도록 만들어진 구조로 하나의 시스템에 문제가 발생해도 다른 시스템은 정상적으로 작동 가능하다. nodejs의 속도는 빠르기 떄문에 이런 마이크로 서비스 단위의 애플리케이션을 구축하는데 큰 생산성을 가져다 준다.

3. 노드의 장점

  1. client와 server를 javascript로 개발 할 수 있다.
  2. npm을 사용하여 다양한 라이브러리를 사용할 수 있다.

4. 노드로 백엔드르 시작한 이유

  • 자바스크립트만으로 프론트엔드와 백엔드를 모두 도전할 수 있다.
  • 웹에서는 크롬이다보니 자바개발자분들도 node를 공부해야 한다고한다. (개발자의 50%는 노드를 사용해본적이 있다고함)
  • 쉽고 간단하지만 강력하고 유연하다.

.요약

  • nodejs는 네트워크 동시 요청에대한 이슈를 해결하기위해 고안된 기술이다.
  • node.js에는 node.js Core Libray Node.js Bindings, V8 Engine, Libuv로 구성되어있다.
  • 브라우저에서 할 수 없는 다양한 일들이 가능하며 운영체제의 파일 시스템에 접근하여 파일 을 조작하거나 데이터베이스 시스템에 접근할 수 있다.
  • 때문에 서버프로그래밍, 모바일 앱, 데스크탑 애플리케이션의 개발이 가능해졌다.
  • 또한 네트워크 서버 구축에 특화되어있다.

태그:

카테고리:

업데이트:

댓글남기기