Skip to content

Latest commit

 

History

History
103 lines (56 loc) · 9.45 KB

NodeJS란?.md

File metadata and controls

103 lines (56 loc) · 9.45 KB

비동기 이벤트 주도 JavaScript 런타임으로써 Node.js 는 확장성 있는 네트워크 애플리케이션을 만들 수 있도록 설계되었습니다.

출처: Node.js®에 대해서 - 공식문서

공식문서에 나와있는 용어를 중심으로 Node JS를 이해해보자.

1. NodeJS 기초

nodeJS란 자바스크립트를 브라우저가 아닌 다른 환경에서 사용할 수 있게 해주는 것이라고 할 수 있다. ****다시 말하면, **V8 엔진으로 빌드된 JavaScript의 새로운 런타임**이다. 기존 런타임은 Web Browser만 존재했다.

백엔드(was)에 국한하는게 아니라 다른 도구와 결합된 Node.js를 사용하면 Word 또는 iTunes와 같은 데스크톱 응용 프로그램, Apache와 같은 서버 응용 프로그램, Curl과 같은 네트워크 응용 프로그램 또는 iPhone 또는 Android용 모바일 응용 프로그램을 작성할 수 있다.

1-1. 런타임이란? ( cf. 컴파일 타임)

위에서 말하는 런타임이란 무엇일까? 런타임이란 프로그래밍 언어가 구동되는 환경을 의미한다.

우리가 프로그램을 생성하기 위해 소스 코드를 작성해도 컴퓨터(기계)가 바로 이해할 수 없다. 우리가 작성한 소스코드(고급 언어)를 기계어로 변화하는 과정이 필요한데, 이 과정을 컴파일 타임이라고 한다. 컴파일 과정을 마친 프로그램은 사용자에 의해 실행되며, 이러한 응용프로그램이 동작되는 시점을 런타임이라고 한다.

1-2. 인터프리터 언어란?( cf. 컴파일 언어)

compile 언어와 interpreter 언어의 가장 큰 차이점은 pre-processing, 컴파일 유무다.

javascript는 인터프리터 언어라고 하는데, 그렇다고 컴파일 과정을 거치지 않는 뜻이 아니다. javascript도 컴파일 과정을 거치지만 javascript는 실행 중에 엔진 내부에서 컴파일이 필요한 경우에 내부에서 컴파일을 한다.

엔진 내부에서 컴파일 과정 거친다는게 무슨 의미일까? 대표적인 현대 javascript 엔진인 크롬인 v8을 보면 알 수 있다.

엔진이 작동하는 원리는 다음과 같다. 먼저 엔진이 실행할 JS 파일을 받게 된다. 파싱, AST(Abstract Syntax Tree)를 구축하는 과정을 거친다. 다음으로 Interpreter가 코드를 읽으며 실행한다. 코드를 수행하는 과정에서 프로파일러가 지켜보며 최적화 할 수 있는 코드를 컴파일러에게 전달해준다. 주로 반복해서 실행되는 코드 블록을 컴파일(최적화)한다. 그리고 원래 있던 코드와 최적화된 코드를 바꿔준다. 코드를 우선 인터프리터 방식으로 실행하고 필요할 때 컴파일 하는 방법을 Just-In-Time(JIT) 컴파일러 라고 부른다.

출처: JavaScript, 인터프리터 언어일까?

결론적으로 javascript는 실행되는 플랫폼에 따라 인터프리팅과 컴파일이 혼합되어 사용되며 이를 통해 성능을 크게 향상시켰다.

2. Node JS의 특징

단일 스레드 이벤트 루프 기반 Non-blocking I/O( 비동기)

2-1. 단일 스레드 이벤트 루프 기반

이벤트 루프는 javaScript가 싱글 스레드임에도 불구하고 가능하다면 언제나 시스템 커널에 작업을 떠넘겨서 Node.js가 논 블로킹 I/O 작업을 수행하도록 해준다.

javascript는 싱글 쓰레드 언어라고 부른다. 멀티스레드로 구현된 언어는 동시성 문제에 대해 신경을 많이 쓸 수 밖에 없다. javascript는 멀티 스레드 환경에서 발생할 수 있는 복잡한 시나리오를 신경쓸 필요가 없다. 그렇다면 javascript를 주로 사용하는 웹 사이트에서는 어떻게 한번에 여러 요청을 받을까?

정확하게 말하자면, javascript의 메인 쓰레드인 이벤트 루프가 싱글 쓰레드이기 때문에 javascript를 싱글 쓰레드 언어라고 부른다. 하지만 이벤트 루프만 독립적으로 실행되지 않고 웹 브라우저NodeJS같은 멀티 쓰레드 환경에서 실행된다. 즉, 자바스크립트 자체는 싱글 쓰레드가 맞지만 자바스크립트 런타임은 싱글 쓰레드가 아니다.

javaScript 엔진에는 외부 요청(입력)에 대한 처리를 하는 단일 호출 스택이 존재하는데, 이 단일 호출 스택과 Node.js의 다양한 쓰레드를 연동하기 위해 사용하는 장치가 이벤트 루프이며, 이 이벤트 루프가 단일 쓰레드다.

이벤트 루프는 javaScript가 싱글 스레드임에도 불구하고 가능하다면 언제나 시스템 커널에 작업을 떠넘겨서 Node.js가 논 블로킹 I/O 작업을 수행하도록 해준다. 백그라운드에서 다수의 작업을 실행하다가 이러한 작업 중 하나가 완료되면 커널이 NodeJS에게 알려주어 적절한 콜백을 poll 큐에 추가하여 실행되게 한다.

2-2. Non-blocking I/O(비동기)

NodeJS에서 블로킹 메서드는 동기로 실행되고 논블로킹 메서드는 비동기로 실행된다.

blocking은 Node.js 프로세스에서 추가적인 javaScript의 실행을 위해 javaScript가 아닌 작업이 완료될 때까지 기다려야만 하는 상황을 의미한다. 이벤트 루프가 blocking작업을 하는 동안 javascript 실행을 계속할 수 없기 때문이다.

Node.js에서 javaScript는 싱글 스레드에서 실행된다. 동시성은 다른 작업이 완료된 후에 javaScript 콜백 함수를 실행하는 이벤트 루프의 능력을 의미한다. 동시에 실행되어야 하는 모든 코드는 I/O 등의 javaScript가 아닌 작업이 일어나는 동안 이벤트 루프가 계속 실행될 수 있도록 해야 한다.

예를 들어, 웹서버로의 요청이 완료되기까지 50ms가 걸리고 50ms 중 45ms는 비동기로 실행될 수 있는 데이터베이스 I/O인 상황을 생각해보자. 논블로킹 비동기 작업을 사용하면 요청마다 45ms는 다른 요청을 처리할 수 있게 된다. 이는 블로킹 메서드 대신 논블로킹 메서드를 사용함으로써 확연히 다른 성능 차이가 난다.

따라서 프로그램의 흐름을 막지 않고(Non-blocking) 동시에 여러 작업을 수행하는게 가능하다. 동시 여러 request가 오더라도 처리가 완료될때까지 기다리지 않아도 되기 때문에 서버 부하가 적다.

3. Node JS로 만든 서버의 장단점

직접 만들어보고 비교해보는게 가장 좋지만, 우선 다른 사람들이 정리한 내용을 학습하는 정도로 정리해보겠다.

장점

  • 자바스크립트를 동일하게 사용해서 서버단 로직을 처리할 수 있다는게 가장 큰 장점이다. 새로운 언어를 습득하지 않고도 자바스크립트를 활용해 서버기술을 빨리 개발/응용할 수 있다.
  • Non-blocking I/O와 단일 스레드 이벤트 루프를 통한 높은 처리 성능
  • CPU 집약적이지 않고, 많은 Connection을 동시에 처리해야 하는 상황에서 성능이 좋다.
  • 이벤트 기반 비동기방식이라 서버 무리가 적다.
  • npm(node package manager)을 통한 다양한 모듈(패키지) 제공npm을 이용해 자신이 필요한 라이브러리와 패키지를 검색해서 설치하고 사용할 수 있기 때문에 개발속도와 효율성이 크게 향상

단점

  • 이벤트 기반 비동기방식이라 서버단 로직이 복잡한 경우 콜백함수의 늪에 빠질 수 있다. 예를 들어, 한번의 요청에 대해 DB에서 조회한 결과값에 따라 다른 로직을 처리해야 하며, 이런 로직이 여러개인 경우 콜백함수 늪 (Callback Hell) 에 빠진다.
  • 코드를 순차적으로 실행하는 것이 아니라 비동기 방식으로 이벤트를 보내고, 응답(이벤트)이 오면 처리하는 방식이기 때문에 흐름을 이해하기 쉽지 않다.
  • 단일 쓰레드(Single Thread)이기 때문에 하나의 작업 자체가 많이 걸리는 웹서비스에는 어울리지 않다. 게시판형태와 같이 가벼운 I/O가 많은 웹서비스에 어울린다.
  • 코드가 수행되어야 코드에 에러가 있는지 알 수 있으며, 에러가 날 경우 프로세스가 내려가기 때문에 테스트가 엄청 중요하다. 반드시 모든 케이스에 대해 소스코드를 검증해야 한다.

참고자료

Node.js®에 대해서 - 공식문서

JavaScript, 인터프리터 언어일까?

런타임이란? 컴파일타임 과의 차이는?

자바스크립트는 왜 싱글 쓰레드일까?

what is node?

Node.js로 백엔드를 구성한다는 것은.

블로킹과 논블로킹 살펴보기- nodejs공식문서

Node.js 이벤트 루프, 타이머, process.nextTick()- nodejs 공식문서

빠르게 서비스를 개발할 수 있는 Node.js

node js 란? 장점, 단점, 어떤 웹서비스에 사용해야할까?