Node.js

박지훈·2021년 1월 14일
0

Node.js

보통 Node.js를 백엔드(서버) 언어라고 생각한다. 물론 나도 그러했다... 하지만 사용에 따라 프론트엔드, 백엔드 구현이 모두 가능한 언어이다! --> 클라이언트단 JavaScript와 같은 언어를 서버사이드로 쓰는 언어이다.

위키에서는 Node.js를 아래와 같이 정의한다.

Node.js는 확장성 있는 네트워크 애플리케이션 (특히 Server 사이드)개발에 사용되는 소프트웨어 플랫폼이다. JavaScript를 활용하며 Non-blocking I/O와 단일 쓰레드 이벤트 루프를 통한 높은 처리 성능을 가지고 있다. 내장 HTTP 서버 라이브러리를 포함하고 있어 웹 서버에서 아파치 등 별도의 소프트웨어 없이 동작하는 것이 가능하며 이를 통해 웹 서버의 동작에 있어 더 많은 통제를 가능하게 한다.


정리

  • Server Side JavaScript이며 Google의 JavaScript 엔진인 v8을 기반으로 한 소프트웨어 시스템이다.

  • 이벤트 기반으로 개발이 가능하고 Non-blocking I/O를 지원하기 때문에 비동기식(앞의 task 완료를 기다리지 않고 다음 task를 수행하는 방식) 프로그래밍이 가능하다. --> I/O 부하가 심한 대규모 서비스를 개발하기에 적합!

  • JavaScript의 표준 라이브러리 프로젝트인 CommonJS의 스펙을 따르고 있다.


특징

  • 싱글 쓰레드 : 문맥교환으로 인한 Overhead가 없다.

  • 위에서도 언급했던 비동기 I/O : CPU time loss를 피함. I/O 요청이 있을 시 워커한테 던져놓고 쓰레드는 다른 일을 처리한다.

  • 경량 프레임워크이다.

  • 라이브러리가 풍부하다.

  • 서버와 클라이언트에서 사용하는 언어가 같다. (JavaScript)

  • 이벤트 기반 : epool / kqueue



탄생 배경

2009년 Ryan Dahl이 고안해 낸 언어이다. Node.js가 개발된 배경과 목적은 다수의 연결을 효율적으로 관리하고 비용을 최소화할 수 있는 네트워크 소프트웨어를 개발하는 편리한 방법을 제공하기 위함이였다.



기존 웹 서버와 차이

기존의 JSP, PHP와 같은 언어로 웹 애플리케이션을 개발할 때 발생하는 문제가 많았다. Client는 아파치와 같은 웹 서버에 연결을 요청하게 되는데, 이 때 일정한 메모리 공간을 사용하여 새로운 쓰레드를 생성하게 된다. 이러한 형태의 웹 서비스는 서버에 문제를 일으켰는데 서비스 규모와 Client의 수가 커질수록 더 많은 서버를 추가해야 했고, 이는 서버 구매 비용뿐만 아니라 운영, 트래픽, 인건비 등 여러 비용과 시간을 지불해야하는 문제를 발생시켰다. 또한, 여러 대의 서버에 같은 데이터를 동기화해야 하는 문제가 있었다. (실제 서버는 여러 대 이지만 사용자 입장에서는 마치 하나의 서버에 접속한 것처럼 느끼게 해주어야 하기 때문이다.)

위 문제들을 Node.js가 해결해준다!! Node.js는 서버에서 클라이언트의 요청을 새로운 컨셉으로 변경하여 위 문제를 해결한다. 즉, 기존에는 각 연결에 대해 새로운 쓰레드를 생성하고 그에 따라 메모리를 할당하여 Client의 요청을 처리했으나, 각 연결이 하나의 이벤트로서 노드 엔진에서 처리된다.

글을 정리하면서 이해가 어려운 부분이 있었다. JSP, PHP의 방식과 문제는 이해하였으나 Node.js의 Client 요청 처리방식이 기존의 웹 서버와 무엇이 다른지 이해가 가지 않았다...

좀 더 이해해보려 노력해보자.

아파치와 같은 웹 서버는 웹 리소스가 요청될 때마다 요청을 처리하기 위해 매번 별도의 스레드를 생성하거나 새 프로세스를 호출한다.
요청이 많은 경우 병목구간이 흔하게 발생--> 자세히 보면 로직보다는 I/O에서 문제가 발생!! (서버에서 I/O를 처리하다가 지연되어 다른 요청이 처리되지 않음) 따라서 동기 방식에서는 멀티 쓰레드에 스케일아웃과 로드밸런싱을 한다.


BUT Node.js의 비동기 방식은 요청 처리가 완료되기전에 제어권을 다음 요청으로 넘긴다. Non-blocking(I/O 작업이 진행되는 동안 유저 프로세스의 작업을 중단시키지 않는 방식)으로 요청들을 처리할 수 있게 된다. (이전 요청도 처리하면서 이후 요청도 처리한다고 생각하면 쉽다!)

Node.js는 싱글쓰레드 위에서 비동기로 동작한다. url_A가 들어오면 이벤트를 수행하고, 그 다음 url_B를 받아 이벤트를 수행하고, 그 와중에 A가 완료되면 콜백해주는 방식이다. 싱글쓰레드이기 때문에 Overhead가 적어 애플리케이션 확장성을 쉽게 얻을 수 있다. 또한 리소스 사용량을 최소화하였기 때문에 멀티쓰레드로 굳이 만들 필요가 없다.



출처 : https://la-stranger.tistory.com/entry/understanding-node-js-event-loop
https://okky.kr/article/546877
https://ko.wikipedia.org/wiki/Node.js
https://sjh836.tistory.com/79
https://ju3un.github.io/network-basic-1/

profile
Computer Science!!

0개의 댓글