본문 바로가기

Javascript/NodeJS

[NodeJs] 기본 개념

반응형

NodeJS를 시작하기 전 기본적인 개념을 이해하며, 관련 내용 정리를 위해 작성합니다.


 

노드는 자바스크립트 애플리케이션이 서버로서 기능하기 위한 도구를 제공하므로 서버 역할을 수행할 수 있습니다.

 

서버란? 서버는 네트워크를 통해 클라이언트에 정보나 서비스를 제공하는 컴퓨터 또는 프로그램을 말합니다.

여기서, 클라이언트는 요청을 보내는 주체로 브라우저일 수도 있고, 모바일 앱일 수도 있고, 다른 서버에 요청을 보내는 서버일 수도 있습니다. 서버는 클라이언트의 요청에 대한 응답을 하고, 그 대답은 YES 일수도 NO 일수도 있습니다.

 


 

공식 사이트에 게제된 노드 소개글은 다음과 같습니다.

" Node.js는 크롬 V8 자바스크립트 엔진으로 빌드된 자바스크립트 런타임입니다. 이는 이벤트 기반, 논블로킹 I/O 모델을 사용해 가볍고 효율적입니다. 이 패키지 생태계인 npm은 세계에서 가장 큰 오픈 소스 라이브러리 생태계이기도 합니다. "

 

노드는 자바스크립트 런타임입니다. 즉, 자바스크립트 프로그램을 컴퓨터에서 실행할 수 있게 해줍니다.

 

런타임이란? 특정언어로 만든 프로그램들을 실행할 수 있는 환경을 뜻합니다.

 


 

노드는 V8과 libuv 라이브러리를 사용합니다. 
libuv라이브러리는 노드의 특성인 이벤트 기반, 논블로킹 I/O 모델을 구현하고 있습니다.

 

이벤트 기반

이벤트 기반 시스템에서는 특정 이벤트가 발생할 때 무엇을 할지 미리 등록해야하는데, 이것을 이벤트 리스너에 콜백 함수를 등록한다고 표현합니다. 이러한 여러 이벤트가 동시에 발생했을 때 어떤 순서로 콜백 함수를 호출할지를 '이벤트 루프'가 판단하는데, 이 개념은 자바스크립트에서 중요한 개념입니다.

 

ex. 호출 스택

자바스크립트는 실행 시 기본적으로 전역 컨텍스트 안에서 돌아가는데, 함수의 실행이 완료되면 호출 스택에서 지워집니다.

function3()

main → function1 → function2 → function3 순으로 쌓이고, 

function3 → function2 → function1 → main 순으로 실행됩니다.

function2()
function1()
main()

 

  1. 이벤트 루프 : 이벤트 발생시 호출할 콜백 함수들을 관리하고, 호출된 콜백 함수의 실행 순서를 결정하는 역할
  2. 태스크 큐(=콜백 큐) : 이벤트 발생 후 호출되어야 할 콜백 함수들이 기다리는 공간
  3. 백그라운드 : 타이머나 I/O 작업 콜백 또는 이벤트 리스너들이 대기하는 곳

 

만약, 호출 스택이 꽉 차있는 상태에서는 원하는 이벤트가 원하는 시간에 실행이 되지 않을 수 있습니다.

즉, setTimeOut 이벤트를 원하는 시간에 호출했지만 원하는 시간에 실행이 안된다는 말과 같습니다.

 

 

논블로킹 I/O

오래 걸리는 함수를 백그라운드로 보내서 다음 코드가 먼저 실행되게 하고, 그 함수가 다시 태스크 큐를 거쳐 호출 스택으로 올라오기를 기라니느 방식을 '논블로킹 방식'이라고 합니다.

즉, 이전 작업이 완료될 때까지 멈추지 않고 다음 작업을 수행합니다.

단, 싱글 스레드라는 한계 때문에 자바 스크립트의 모든 코드가 이 방식으로 시간적 이득을 볼 수 있는 것은 아닙니다.

 


 

노드는 싱글 스레드이므로 주어진 작업을 혼자서 처리해야 합니다.

 

여기서 논블로킹이 중요한 이유는 싱글 스레드는 한 번에 한 가지 일밖에 처리하지 못하므로 어떠한 작업에서 블로킹이 발생하면 다음 일을 처리하지 못합니다.

따라서, 노드가 싱글 스레드, 논블로킹 모델을 채택하고 있는 방식입니다. 이 방식에서는 하나의 스레드(=싱글 스레드)에서 여러가지 처리를 진행하므로 요청한 순서에 상관없이 처리된 대로 전달(=논블로킹)합니다. 단, 스레드가 하나이기 때문에 서버 부하가 생기면 처리하는 시간이 오래 걸릴 수 있습니다.

그렇다면, 멀티 스레드로 모두 논블로킹 방식으로 진행하면 좀 더 나은 처리방식이지 않을까 싶을 수 있습니다. 이는 뒤에 나오는 cluster 모듈을 사용해 멀티 스레드를 사용한 것과 같은 방식을 보여줄 수 있습니다.

 

 

※ 참고 서적 : Node.js 교과서 (조현영 지음)


반응형

❥ CHATI Github