본문 바로가기

#기본개념

Node.js란 무엇인가? (+ 블로킹,논블로킹,I/O Model이란?)

반응형

Node.js란 무엇인가? (+ 블로킹,논블로킹,I/O Model이란?)

 

 

 

 

 

 

 

 

[작성자의 다른 글 보러가기: 'JSON / XML 이란 무엇일까? (부제: literal / property란 무엇일까?)']

 

 


 

개요

 

오늘은 어디에서나 흔히 보게 되는 Node.js 에 대해서 알아보기로 하자.

Node.js란 무엇인지, 이해하기 위해서 어떠한 것들을 부가적으로 더 알아야하는건지 정리해보고 공부해보기

위해 이번 피드를 작성해본다.

 

 

 

 

목차

 

1. Node.js란?

2. Node.js의  주요 특징 + Node.js가 어울리는 어플리케이션

3. 블로킹(Blocking), 논블로킹(Non_Blocking), I/O Model이란?

4. 동기(Synchronous)와 비동기(Asynchronous)란?

5. 싱글 스레드란?

 

 

 

 

 

 

 


 

# Node.js란?

 

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

<출처: 위키백과>

 

 

Node.js는 크롬 V8 자바스크립트 엔진으로 만들어진 JavaScript 런타임이다. 여기서 런타임(runtime)은 프로그램이 실행되고 있는 동안의 동작을 이야기 한다. JavaScript 런타임은 자바스크립트가 구동되는 환경을 이야기한다. 그러므로 Node.js를 활용해서 자바스크립트를 구동시킬 수 있는 환경을 만들어주는 것이다.

 

Node.js가 나오기 전에는 자바스크립트를 구동하려면 웹 브라우저를 통해서 실행시킬 수 밖에 없었는데, Node.js는 이를 극복시켜주었다. 그래서 브라우저의 엔진을 사용하는 것이 아니라 서버에 Node.js를 설치하고 서버 쪽에서 자바스크립트를 구동할 수 있게 만들어 준 것이 Node.js가 되는 것이다.

 

그래서 Node.js를 활용한 서버 구동이라는 말이 많이 나오게 되는 것이다. (한마디로 노드는 서버사이드 자바스크립트로써 많이 사용된다. -Node.js가 백엔드라고 오해하면 안된다. Node.js를 통해 서버를 구현할 수 있을 뿐이다.)

 

  • Node.js는 확장성 있는 네트워크 애플리케이션을 위해 설계되었으며, 서버를 위해 설계된 플랫폼이다.
  • JacaScript를 쓰면 브라우저에 종속적인데, Node.js를 쓰게 되면 컴퓨터 내부에 있는 File System 등 System Call도 가능해진다. 
  • 물론 Node.js가 유일한 서버사이드 자바스크립트는 아니다. 여러 서버 사이드 자바스크립트가 존재하며, 요즘 Node.js가 많이 사용되고 있을 뿐이다.
  • 결국 Node.js가 많이 쓰이는 이유는 자바스크립트라는 하나의 언어를 통해 프론트 앤드와 백앤드 둘다 다룰 수 있게 해주기에 생산성의 향상으로 이어진다. (서버를 위해 추가적인 언어를 사용하기에는 많은 공부와 인내가 필요하다. 이를 해결해준 것이 Node.js라고 할 수 있다.)

 

 

 

 

 

 


 

 

 

# Node.js의 주요 특징

 

 

 

1. 자바스크립트 언어 사용

 

- 자바스크립트를 사용할 줄 아는 개발자들에게는 러닝 커브가 낮다. 또한, 자바스크립트로 백앤드 로직까지 개발할 수 있다는 엄청난 장점으로 점유율이 높아지고 있다.

 

 

 

2. 빠른 속도

 

- 구글에서 개발한 자바스크립트 엔진을 사용하기 때문에 빠른 속도를 자랑한다.

 

 

 

3. 이벤트 기반 비동기 방식 (Non-Blocking) 

 

- Node.js에서는 모든 API가 비동기 방식이므로, 호출 후 응답을 기다리지 않고 다른 API를 호출한다. 이전에 호출했던 API의 응답이 오면 이벤트 루프가 확인하여 처리한다.

 

 

 

4. 단일 쓰레드

 

- 복잡한 비동기 I/O 응용 프로그램을 싱글 스레드 JavaScript로 작성하여 결과물의 실행 속도와 개발 편의성 측면에서 좋다는 것이 Node.js의 근간을 이루는 개념이며, CPU의 높은 연산력을 요구하는 프로그램을 Node.js로 짜면 영 좋지 않은 성능이 나온다. 

 

 

 


 

 

 

# Node.js가 어울리는 애플리케이션

 

- SPA 구조의 웹애플리케이션

- 데이터 스트리밍 서비스

- 입출력이 잦은 서비스

 

 

 

 

 


 

 

# 블로킹 (Blocking), 논블로킹 (Non-Blocking) I/O Model

 

 

앞서 언급되었던 블로킹, 논 블로킹 I/O란 뭘까? 이에 대해 알아보도록 하자.

 


*여기서 I.O란?

 

I/O는 입력(Input)/출력(Output)의 약자로, 컴퓨터 및 주변장치에 대하여 데이터를 전송하는 프로그램, 운영 혹은 장치를 일컫는 말입니다. 대개의 경우 입력에 함께 출력이 발생하게 됩니다. 단, 키보드와 마우스처럼 입력을 위한 기기, 프린터처럼 출력에만 사용되는 기기도 있습니다. 프로세서와 메모리, 확장 슬롯, 마더보드에서 일어나는 데이터 전송도 I/O라고 일컬어집니다. 


 

 

  • 블로킹(Blocking) I/O는 동작하고 있는 동안에는 다른 일을 처리하지 못하는 상태가 된다. 프로그램의 제어권이 호출된 함수가 일을 모두 마무리 될 때까지 넘어가지 않는 것을 이야기한다.
  • 논블로킹(Non-Blocking) I/O의 경우, 동작을 한 뒤에 바로 다음 제어가 돌아옴으로써 다음 처리로 넘어갈 수 있게 해준다. (앞서 호출된 함수가 일을 마무리 짓지 않아도 다른 함수가 다른 일을 진행할 수 있도록 해주는 것이다.)
  • 블로킹과 논블로킹은 호출된 함수가 언제 return 하는가의 차이로 나뉘어 진다.

 

블로킹 I/O에 비해 논블로킹 I/O가 일반적으로 효율적으로 사용할 수 있다. 특히, 웹에서 사용되는 자바스크립트의 경우 싱글 스레드를 사용하므로 블로킹으로 진행되게 되면 사용자는 특정 요청을 보내놓은 상태로 무한정 대기해야 한다. (한마디로 클릭 한번 했다가 홈페이지에서 아무것도 못하는 상태로 기다려야 하는 것이다.)

그래서 이러한 상태를 막기 위해 비동기(Asynchronous) 방식을 채택한다. 백그라운드에서 돌아가야할 함수는 Web-API를 호출하면서 해결해버린다. (Web-API와 Event-Loop를 활용해서 케어한다.)

 

 

 

 

 

 

 


 

 

# 동기 (Synchronous)와 비동기 (Asynchronous)

 

 

  • 동기(Synchronous) : 호출하는 함수가 호출된 함수의 작업 완료 후 리턴을 기다리거나, 호출된 함수로부터 리턴을 받더라도 작업 완료 여부를 호출하는 함수 자체가 계속 체크하는 경우이다.

 

  • 비동기(Asynchronous) : 호출되는 함수에게 CallBack을 실행한다. 호출하는 함수는 작업완료 여부를 체크하지 않는다.

 

동기와 비동기의 차이점은 호출되는 함수의 완료 여부를 누가 체크하냐에 따라 달라진다. 작업 완료를 호출하는 함수 스스로가 계속 체크하면 동기(Synchronous)이며, 작업 완료 여부를 체크하지 않는다면 비동기(Asynchronous) 방식이다.

 

 

 

 


 

 

# 싱글스레드 (Sing Thread)란?

 

프로그램은 실행하지 않으면 메모리에 탑재(Load)되지 않은 상태로 저장만 되어 있다. 저장된 상태에서 프로그램을 실행하게 되면 메모리에 탑재(Load)되며, 이제부터는 프로세스로써 실행되게 된다.

스레드란 프로세스 상에서 하나의 실행 흐름을 이야기한다. 스레드가 1개 일수도 있고 여러개가 될 수도 있다. 각각의 스레드마다 독자적인 스택영역을 가지지만 힙 영역을 공유한다. (한마디로, 여러개로 작업 처리를 하지만 줄을 서는 대기열은 1줄이라는 소리이다.) 멀티 프로세스의 경우 스택 영역과 힙 영역을 따로 가지는게 일반적이다.

싱글 스레드는 이러한 스레드가 1개인 것을 이야기한다. 1개의 스택 영역과 1개의 힙 영역을 가지는 상태를 의미한다.

그래서 직접적인 다중처리가 불가능하지만 이를 외부함수 libuv를 통해 비동기적 처리를 넘긴다. 그렇게 싱글스레드이지만 효율적인 처리를 통해 NGINX, 아파치(Apache)와 비슷한 성능을 얻게 되었다. 물론 데이터양이 많이 늘어남에 따라서 기존에 사용하던 서버가 더 좋은 경우도 생길 수 있다. 

 

 

*근본적으로 자바스크립트는 Block하지 않는 것을 원칙으로 한다. 대부분의 I/O처리는 이벤트와 콜백으로 처리함으로써 콜백을 기다리는 상황에서도 계속 가동될 수 있도록 두는 것이다. (효율적으로 가동한다)

 

* 싱글 스레드라고는 하지만 실제로는 몇 개의 스레드가 더 있는 상황이라 봐도 좋다. 내부적으로 싱글스레드일뿐이다.