Server/Node.js (Express)

Node.Js란?

ooeunz 2019. 10. 8. 22:47
반응형

Node.js 는 크롬 V8 자바스크립트 엔진으로 빌드된 자바스크립트 RunTime(특정 언어로 만든 프로그램들을 실행할 수 있는 환경)이다. Node.js는 이벤트 기반, 논블로킹 I/O 모델을 사용해 가볍고 효율적이며, Node.js의 생태계인 npm이나 yarn은 세계에서 가장 큰 오픈 소스 라이브러리 생태계이다.

 

서버와 클라이언트의 관계

서버란 네트워크를 통해 클라이언트에 정보나 서비스를 제공하는 컴퓨터 또는 프로그램을 말한다. 서버의 대비되는 개념으로 클라이언트(client)라는 개념이 있다. 이 둘의 관계는 요청과 응답으로 볼 수 있는데, 클라이언트는 서버에게 요청하고, 서버는 이에 응답한다. 예를 들어 우리가 검색창에 www.naver.com이라고 입력을 했다고 치자. 그다음 동작으로 우리는 웹 브라우저에 Naver의 홈 화면이 나타나는 것을 기대할 수 있다. 이러한 웹 사이트의 화면(html)은 어디에서 오는 걸까?

 

우리가 검색창에 네이버의 url을 요청하면 브라우저는 그 주소에 해당하는 naver의 컴퓨터 위치를 파악한다. 그리고 그 컴퓨터에서 naver의 웹사이트를 받아와 브라우저에 응답해준다.

 

웹이나 앱을 이용할 때 우리의 데이터와 서비스들을 저장하고 그것을 관리해 주는 곳이 바로 서버이다.

 

 

 

이벤트 기반

이벤트 기반이란 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식을 의미한다. 이벤트로는 클릭이나 네트워크 요청 등이 있을 수 있다. 이벤트 기반 시스템에서는 특정 이벤트가 발생할 때 무엇을 할지 미리 등록해두어야 한다. 이것을 이벤트 리스터에 콜백 함수를 등록한다고 표현한다.

 

논블로킹 I/O

논블로킹이란 이전 작업이 완료될 때까지 멈추지 않고 다음 작업을 수행하는 것을 뜻한다. 우리 컴퓨터의 실행 상태 프로세스는 크게 3가지로 나누어진다.

 

1. 실행 (running) : 명령어가 실행되는 상태, 즉 프로세스가 프로세서를 점유한 상태.

2. 대기 또는 분류 (waiting) : 프로세서가 이벤트 (입출력 종료와 같은 외부 신호)가 일어나길 기다리는 상태.

3. 준비 (ready) : 프로세스가 프로세서를 할당받기 위해 기다리는 상태. cpu만 할당되면 바로 일할 수 있는 상태.

 

하나의 프로세스가 running 될 때, 단순히 cpu의 자원을 사용하는 것뿐만 아니라 i/o 작업을 하는 시간 역시 포함한다. 이러한 시간 동안은 cpu는 i/o 작업이 끝나길 기다리는데 이러한 때에 다음 명령어를 수행함으로써, 즉 cpu가 쉬지 않고 일하게 함으로써 시간적 이득을 보게 된다.

 

 

싱글 스레드

하지만 노드는 싱글 스레드 기반의 런타임이다. 스레드(Thread)란 컴퓨터의 작업을 처리하는 논리적인 단위이다. 쉽게 이해하자면 컴퓨터의 작업을 처리하는 일손인데 노드는 싱글 스레드라서 주어진 작업을 혼자서 처리해야만 한다. 반대로 멀티 스레드인 시스템에서는 여러 개의 스레드가 일을 나누어서 한다.

 

자바스크렙트와 노드에서 논블로킹 i/o가 중요한 비중을 차지하는 것은 바로 싱글 스레드 때문이다. 한 번에 하나의 일 밖에 처리하지 못하기 때문에 블로킹이 발생하면 다음 일을 처리하지 못한다.

 

또한 논블로킹이기 때문에 가볍고 빠르지만, 싱글 스레드이기 때문에 서버가 터지게 되면 전체 시스템이 마비되는 risk를 갖고 있다. 때문에 Node.js는 크기가 작지만 개수가 많은 데이터를 실시간으로 주고받는 데 적합하다.

반응형