공부하는 블로그

Node.js | Introduction 본문

Node.js

Node.js | Introduction

치킨닮은닭 2019. 12. 16. 00:02

Node.js

 Node.js는 Chrome V8 엔진으로 빌드된 이벤트 기반 JavaScript 런타임으로 대부분의 JavaScript가 웹 브라우저에서 실행되는 것과는 달리 서버측에서 실행된다. Non-blocking I/O와 단일 스레드 이벤트 루프를 통한 높은 처리성능을 가지고 있다. 내장 HTTP 서버 라이브러리를 포함하고 있어 웹 서버에서 아파치 등의 별도의 소프트웨어 없이 동작하는 것이 가능하며 이를 통해 웹 서버의 동작에 있어 더 많은 통제를 가능하게 한다.

* Chrome V8 : 웹 브라우저를 만드는데 기반을 제공하는 오픈 소스 자바스크립트 엔진

 

node.js의 작동 원리 출처 : https://codeburst.io/the-only-nodejs-introduction-youll-ever-need-d969a47ef219

 

 

Non-blocking  I/O & Single-Thread

 서버는 중앙집중형태로 클라이언트의 요청을 받아 병목현상이 발생하기 쉬우며 처리 성능에 항상 주목해야한다. 클라이언트의 요청이 많은 경우 발생하는 병목구간을 분석해보면 대부분 프로그램 로직보다는 입출력(I/O)에서 발생하게 된다. 이와 같이 서버에서 I/O를 처리하다가 지연이 발생하면 다른 요청들은 처리되지 못하고 계속 대기하는 현상이 발생한다. 그래서 대부분의 기업형 서버 플랫폼들은 이 문제를 해결하기 위해 사용자의 요청을 쓰레드(Thread)로 처리하고 있다.

* Thread : 서버 CPU 자원을 시분할 형태로 나누어 가짐으로써 독립실행이 가능하며 다른 요청을 동시에 받을 수 있게 한다.

 

 그러나 Multi-Thread 방식은 클라이언트의 요청마다 쓰레드를 발생시켜 동시 접속자 수가 많을 수록 많은 쓰레드가 발생하게 되어 메모리 자원을 많이 소모하게 된다. 서버의 자원은 제한되어 있으므로 일정 수 이상의 쓰레드는 발생시킬 수 없고 이를 해결하기 위해 서버를 업그레이드 하거나 분산처리를 해주어야 한다.

 

 동기 방식의 처리는 하나의 요청이 처리되는 동안 다른 요청이 처리되지 못하며 요청이 완료되어야만 다음 처리가 가능한 방식이다. 따라서 동기 방식은 I/O 처리를 Blocking하게 되고 이 문제를 Thread로 처리하거나 비동기 방식으로 처리할 수 있다. 비동기 방식은 하나의 요청 처리가 완료되기 전에 제어권을 다음 요청으로 넘긴다. 따라서 비동기방식은 I/O 처리가 Blocking 되지 않으며 다음 요청을 처리할 수 있다. Node.js는 바로 이와 같은 방식으로 병렬처리를 한다.

 

 Node.js는 비동기 I/O를 지원하며 Single-Thread를 기반으로 동작하는 서버이다. Node 서버는 비동기 방식으로 요청을 처리하므로 요청을 처리하는 동시에 다음 요청을 받을 수 있다. 또한 병렬처리를 Thread로 처리하지 않으므로 Multi-Thread가 갖는 메모리 문제에서 자유롭다. 


※ Synchronous vs Asynchronous

 

동기적 처리의 예
동기적 처리 결과

 동기적 처리의 경우에는 코드를 진행함에 있어서 이전의 처리가 모두 끝나야 다음 처리로 넘어간다.

 

비동기적 처리의 예
비동기적 처리 결과

 비동기적 처리의 경우에는 코드를 진행함에 있어서 이전의 처리가 모두 끝나지 않아도 다음 처리로 넘어가며 Callback 함수로 처리 결과를 받을 수 있다.


Event Loop

 Node.js의 비동기 처리는 이벤트 방식으로 풀어낸다. 클라이언트의 요청을 비동기로 처리하기 위해서 이벤트가 발생하며 서버 내부에 메세지 형태로 전달된다. 서버 내부에서는 이 메세지를 이벤트 루프(Event Loop)가 처리한다. 이벤트 루프가 처리하는 동안 제어권은 다음요청으로 넘어가고 처리가 완료되면 CallBack을 호출하여 처리완료를 호출측에 알려준다. 즉, 이벤트 루프는 이벤트를 기다렸다가 전송해주는 프로그램이다.


※ Node.js의 약점?

 

 Single-Thread로 이루어져 있으므로 처리작업 자체가 오래걸린다면 전체 서버 처리에 영향을 주게 된다. 따라서 처리 작업이 CPU를 많이 소모한다든지 대용량 파일을 처리하는 작업이라면 Node.js에 부적합하다.

Comments