Node.js 대표이미지

어디에나 보이는 Node.js 웹과 관련한 서비스라면 Node.js 어디에나 보인다.

그렇다면


Node.js는 무엇인가?

Node.js는 크롬 V8 자바스크립트 엔진으로 만들어진 JavaScipt 런타임이다. 

[여기서 런타임(runtime)은  프로그램이 실행되고 있는 동안의 동작을 이야기 한다.

JavaScript 런타임은 자바스크립트가 구동되는 환경을 이야기한다. 그러므로 Node.js를 활용해서 자바스크립트를 구동시킬 수 있는 환경을 만들어주는 것이다.]

 

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

 

그래서 Node.js를 활용한 서버 구동이라는 말이 많이 나오게 되는 것이다. 

[한마디로 노드는 서버사이드 자바스크립트로써 많이 사용된다. - Node.js가 백엔드라고 오해하면 안된다. ]

Node.js를 통해 서버를 구현할 수 있을 뿐이다. 

* 그래도 Node.js는 확장성 있는 네트워크 애플리케이션을 위해 설계되었으며, 서버를 위해 설계된 플랫폼이다.

* JavaScript를 쓰면 브라우저에 종속적인데, Node.js를 쓰게 되면 컴퓨터 내부에 있는 File System등 System Call도 가능해진다.  - 이러한 부분을 Node.js는 libuv를 통해 처리한다.

 

물론 Node.js가 유일한 서버사이드 자바스크립트는 아니다. 여러 서버사이드 자바스크립트가 존재하며, 요즘 Node.js 가 많이 사용되고 있을 뿐이다.     

 

* 결국 Node.js가 많이 쓰이는 이유는 자바스크립트라는 하나의 언어를 통해 프론트 엔드와 백엔드 둘 다 다룰 수 있게 해주기에 생산성의 향상으로 이어진다. (솔직히, 서버를 위해 추가적인 언어를 사용하기에는 많은 공부와 더불어 인내가 필요하다. 결과를 빨리 보고 싶지만 느려서 짜증이 난다!  이를 해결해준 것은 Node.js이다. 그렇기에 Node.js가 인기를 끌고 있다고 생각한다.)

 

 


Node.js의 장점은 그 동작 원리에 의해 나온다.

Node.js는 기본적으로 이벤트 기반 ( Event-Driven ), 논블로킹 I/O( Non - Blocking I/O), 싱글 스레드 라는 특성을 갖는다. 

[ 다른 특징적인 장점은 구글 V8 자바스크립트 엔진을 채용해서 빠른 코드 실행과 더불어 단일 스레드와 확장성을 가지며, 버퍼링이 없으며, 데이터를 Chunk로 출력한다. ]

 

* 빅데이터를 사용하기에는 적합하지 않으며, 많은 데이터 처리용으로는 파이썬의 장고(Django)가 더 적합하다.

 

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

그렇다면 나머지 두 가지는 나중에 알아보도록 하고 논블로킹 I/O에 대해 살펴보도록 하자.

 

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

* 블로킹과 논 블로킹은 호출된 함수가 언제 return 하는 가에 대한 차이로 나누어 진다.

 

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

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

* 자세한 사항은 [JavaScript]자바스크립트는 어떻게 동작하는가? 를 통해 확인하면 된다. 

 

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

  • 동기(Synchronous) : 호출하는 함수가 호출된 함수의 작업 완료 후 리턴을 기다거나, 호출된 함수로부터 리턴을 받더라도 작업 완료 여부를 호출하는 함수 자체가 계속 체크하는 경우이다. 
  • 비동기(Asynchronous) : 호출되는 함수에게 CallBack을 전달해서, 호출되는 함수가 작업이 완료되면 호출되는 함수가 이전에 전달받은 CallBack을 실행한다. 호출하는 함수는 작업 완료 여부를 체크하지 않는다.

 

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

 

* 더 자세한 내용은 homoefficio.github.io/2017/02/19/Blocking-NonBlocking-Synchronous-Asynchronous/

 

Blocking-NonBlocking-Synchronous-Asynchronous

꽤 자주 접하는 용어다. 특히나 요즘들어 더 자주 접하게 되는데, 얼추 알고는 있고 알고 있는게 틀린 것도 아니지만, 막상 명확하게 구분해서 설명하라면 또 만만치가 않은.. 그래서 찾아보면

homoefficio.github.io

  동기/비동기, 블럭/논블럭의 차이점은 동기/비동기의 경우 작업의 결과물을 CallBack인 메시지를 통해 주고 받는데, 작업 완료 여부를 신경쓰는지 안 쓰는지에 따라 차이점이 있으며, 블럭/논블럭의 경우 함수 호출이후에 넘어오는 제어권에 따라 블럭이냐 논블럭이냐를 나누는 것이다. 그렇기에

동기(Synchronous) - 블럭(Blocking), 동기(Synchronous) - 논블럭(Non - Blocking), 비동기(Asynchronous) - 블럭(Blocking), 비동기(Asynchronous) - 논블럭(Non - Blocking)

형태로 4가지로 볼 수 있다. 

 

싱글스레드(Single Thread)?

  프로그램은 실행하지 않으면 메모리에 탑재(Load)되지 않은 상태로 저장만 되어 있다. 저장된 상태에서 프로그램을 실행하게 되면 메모리에 탑재(Load)되며 이제부터는 프로세스로써 실행되게 된다. 스레드란 프로세스 상에서 하나의 실행 흐름을 이야기한다. 스레드가 1개 일수도 있고 여러개가 될 수도 있다. 각각의 스레드마다 독자적인 스택영역을 가지지만 힙 영역을 공유한다. (한 마디로, 여러개로 작업 처리를 하지만 줄을 서는 대기열은 1줄이라는 소리이다.) 멀티 프로세스의 경우 스택 영역과 힙 영역을 따로 가지는게 일반적이다. 

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

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

 

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

 

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

 

그런고로 다음 시간에는 Node.js를 입문해보도록 하자.

 

'Web(웹) > Node.js' 카테고리의 다른 글

npx란 무엇일까?  (0) 2021.01.19
[Node.js] 1강 - Node.js를 시작해보자!  (0) 2020.12.31

+ Recent posts