EtoC

Nodejs 본문

BackEnd/NodeJs

Nodejs

게리드 2023. 7. 31. 23:42

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

그리고 팀원의 "엄밀히 말하면 틀렸습니다. 서버가 아닙니다" 라는 대답.

다시공부하자..


0. 등장 배경

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를 사용하여 멀티쓰레드를 돌릴 수 있게 되었다.

nodejs의 서버

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

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


2. NPM 과 Yarn

프로그램을 개발할때 아예 기초부터 설정하는것이 아닌 다른사람이 작성하여 공유한 코드를 가져오거나 다운로드 받아서 사용하게된다.
JAVA에는 Maven,Gradle(최근)이 있고 Python에는 PyPi가 있다.
Node.js도 다른사람들이 작성한 라이브러리들을 모아둔 것이 있는데
그게바로 NPM(Node Package Manager)이다.

과거에는 npm도 다운 받아서 설치해야했지만 근래에는 node.js를 설치하면 npm도 자동적으로 설치되기때문에 따로 다운받을 필요가 없다.

1.npm?

- npm publish 기능명 : 내가만든 기능을 npm에 올리는 명령어

- npm install 기능명 : 다른사람들이 만든 기능을 다운받는 명령어

하지만 npm의 다운로드 속도가 느리다고 생각하여 더 빠르게 동작가능한 기술이 바로 facebook에서 개발한 yarn이다.

2.yarn?

yarn을 사용하기 위해서는 npm이 설치되어있어야한다.
왜냐하면 facebook이 yarn을 만들어서 npm에 publish 했기때문에 yarn을 npm으로 설치해야한다.

npm i -g yarn
sudo npm install -g yarn

설치후 아래의 명령어를 통해서 yarn이 설치되었는지 확인할 수 있다.

yarn --version

npm i yarn을 입력하고 버전을 확인하면 zsh: command not found: yarn 오류가 뜨는데, 글로벌 설치를 하지 않았기때문에 시스템 경로에 인식되지 않는것이다.

npm i -g yarn

을 입력하고 다시 yarn --version을 입력하면 잘 뜨는것을 확인할 수 있다.
yarn을 설치했다면 아래의 명령어를 사용해서 npm보다 빠르게 받을 수 있다.

yarn add 기능명

3. nodejs의 장점

✅ Frontend와 Backend 기술 스택 통합

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

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

  • 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. 노드로 백엔드를 시작한 이유

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

4. 요약

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