Skip to content

Instantly share code, notes, and snippets.

@jeffminsungkim
Last active August 8, 2019 01:20
Show Gist options
  • Save jeffminsungkim/18d8d9e64692245e78859106c7cb45ad to your computer and use it in GitHub Desktop.
Save jeffminsungkim/18d8d9e64692245e78859106c7cb45ad to your computer and use it in GitHub Desktop.
Node.js에 대해 이해하기

Node.js란?

Highly-scalable, data-intensive and real-time apps

Node.js는 프로그래밍 언어도 아닐뿐더러 자바스크립트 프레임워크 또한 절대 아니다!

Node.js는 서버와 데스크탑 애플리케이션에서 자주 사용되는 빠르고, 가벼운 크로스 플랫폼 자바스크립트 런타임 환경이다.

  • 근본적으로 Node.js는 JS 코드를 실행시키기 위해 서버에서 실행되는 자바스크립트라고 생각하면 된다

  • Node.js는 event-driven, non-blocking I/O model을 사용한다

  • Chrome(크롬)은 C++로 작성된 V8 엔진을 사용

  • Firefox는 C로 작성된 SpiderMonkey라는 자바스크립트 엔진을 사용

  • Internet Explorer는 Chakra라는 자바스크립트 엔진을 사용

  • 2009년 까지만 해도 자바스크립트는 브라우저에서만 실행이 가능했고, 클라이언트 사이드(client-side) 언어라고 취급받아왔다

2009년 Node.js의 창시자인 Ryan Dahl이 JS 코드를 브라우저 밖에서 실행시킬 수 있으면 좋겠다고 생각하였고, 앞서 언급한 구글의 V8 엔진을 가져와 C++ 프로그램 안에 끼워 넣었고 (embeded) 그것을 "Node (Node.exe)" 라고 부르기 시작하였다.


👀 조금 더 자세히 들여다보기

앞서 언급한대로 Node.js는 싱글 스레드 기반의 non-blocking I/O 모델을 사용하며 실행된다. 이벤트 루프(Event Loop)라고 불리는 곳에서 동시다발적으로 양산되는 커넥션을 한 번에 처리가 가능하고, 입출력 처리는 시작만 해둔 채 완료되지 않은 상태에서 다른 처리 작업을 계속 진행할 수 있도록 멈추지 않고 입출력 처리를 기다리는 방식으로 동작하게 된다. 반대로, 전통적인 I/O 처리 방법은, 작업을 시작하면 완료될 때까지 기다리는 방식이다.

조금 더 피상적인 예시로 쉽게 이해해보자

당신은 음식을 먹기 위해 레스토랑을 방문했다. 그 식당에는 한 명의 종업원이 (A single thread) 존재하고 당신으로부터 주문을 받아 주방에 전달하였다. 그리고 요리사가 당신의 음식을 조리하는 동안 종업원은 다른 손님의 테이블을 방문하여 또 다른 주문(요청)을 받게 되었다.

다시 말해 한 명의 직원이 여러 개의 테이블을 서브(serve)함으로써 요리사가 손님 A의 음식이 준비되기까지 다른 N명의 손님은 기다릴 필요가 없는 것이다.

반대로 Blocking 혹은 동기식 아키텍처에서는 어떻게 될까?

하나의 요청이 수행되는 동안 다른 요청은 무작정 기다려야만 하는 상황에 놓이게 된다. 예를 들어, 서버가 request를 받게 되면 해당 요청을 핸들링하기 위하여 하나의 스레드가 할당된다. 해당 요청의 핸들링의 일환으로, 데이터베이스에 쿼리를 날리는 것으로 생각해보면 가끔 우리는 결과를 받기까지 시간이 조금 소요되는 경험을 한 적이 있을 것이다.

데이터베이스가 해당 쿼리를 실행하는 동안 요청을 핸들링 하기 위해 존재했던 스레드는 기다리는 것 외에는 아무것도 할 수 없게 된다. (Cannot be used to serve another client.)

예를 들어, PHP 혹은 Rails 등의 애플리케이션을 아파치 서버에서 실행한다고 가정해보았을 때 추가로 들어온 요청을 수행하려면 새로운 thread를 낳게(spawn) 되고, 시스템 메로리 사용에도 영향을 미치는 결과가 초래되거나, 어느 시점에서는 더는 클라이언트를 서브할만한 스레드를 할당할 수 없게 되어 새로운 클라이언트들은 thread를 사용할 수 있기 전까지 기다려야만 한다.


event-loop

이벤트 루프는 다음과 같은 방식으로 동작한다.

  • Single-threaded

  • EventEmitter 클래스를 사용해서 이벤트를 이벤트 리스너에 바인드 하는 용도로 사용된다

  • 이벤트가 발견되면 비동기로 Callback을 작동(trigger)시킨다

🤔 왜 Node.js를 사용해야 하는가?

  1. 시작하기가 쉽고! 프로토타이핑(prototyping)과 애자일 소프트웨어 개발(Agile development)에 적합하다

  2. 정말 정말 빠르고 확장성이 매우 뛰어나다 (PayPal, Uber, Netflix 그리고 LinkedIn 등이 Node.js를 사용하고 있다.)

일례로, PayPal에서 Java와 Spring 기반의 애플리케이션을 노드로 새롭게 개발하였는데 다음과 같은 이점을 확인할 수 있었다고 한다.

  • 적은 인원으로 2배 더 빠르게 개발

  • 33% 감소한 코드 라인

  • 40% 감소한 파일 양

  • 2x 요청/sec

  • 35% 빠른 평균 응답 시간

  1. Node 애플리케이션은 자바스크립트를 사용한다. 다시 말해, 당신이 프론트엔드 개발자고 자바스크립트를 사용할 줄 안다면, 당신의 자바스크립트 스킬을 사용해서 노드 애플리케이션을 보다 편안하고 쉽게 개발할 수 있다

  2. 프론트엔드와 백엔드 모두 자바스크립트 코드를 사용하므로, 더 깨끗하고 일관성 있는 코드베이스

ex) Use the same naming convention, the same tools and the same best practices.

  1. 가장 큰 오픈소스 라이브러리 생태계를 가지고 있다

👍 Node.js를 사용하면 얻을 수 있는 이점

다시 한번 강조하지만, 노드는 자바스크립트 엔진을 포함 하고있는 JS 코드를 실행시키기 위한 런타임 환경이다. 또한, 자바스크립트 환경을 위한 특정한 객체를 제공하는데, 이 객체는 브라우저 환경에서 사용할 수 있는 객체와는 다르다.

예를 들면, document.getElementById(''); 같은 객체는 존재하지 않는다. 대신, 브라우저에서는 할 수 없는 더욱 더 흥미로운 다음과 같은 기능을 제공한다.

  • fs.readFile()

  • http.createServer()

노드를 한줄 요약 하자면!

V8 JavaScript 엔진을 포함한 + 브라우저 내에서 이용할 수 없는 추가 능력을 제공하는 모듈로 이루어진 프로그램이다.


👌 Node.js로 개발할 수 있는 것들

사실 CPU-intensive한 것들만 아니면 모든것을 Node로 빌드할 수 있다. 대표적으로 몇가지만 열거해보자면,

  • REST API & Backend Applications

  • Real-Time Services (Chat, Games, etc)

  • Blogs, Content Management System, Social Applications

  • Utilities & tools



Written by JeffMinsungKim

덧붙이고 싶은 내용이나 수정이 필요한 부분 모두 feedback 받습니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment