[Node] 노드의 소개

Node.js 소개

1. 자바스크립트 인터프리터

자바스크립트 언어는 컴파일러가 실행 파일을 생성하는 컴파일 방식의 언어가 아니고 인터프리터가 소스코드를 읽으면서 실행하는 인터프리터 방식의 언어이다.

자바스크립트 인터프리터는 웹브라우저에 내장되어 있기 때문에 웹페이지에 포함된 자바스크립트 소스코드를 웹브라우저에 내장된 자바스크립트 인터프리터가 실행한다.

이와 마찬가지로 자바스크립트 소스코드를 서버에서 실행하려면 서버에도 자바스크립트 인터프리터가 필요하다.


2. 서버 사이드 자바스크립트 플랫폼

서버에서 자바스크립트를 실행하기 위해 필요한 것들은 다음과 같다.

  • 자바스크립트 인터프리터(자바스크립트 엔진)
  • 자바스크립트 라이브러리

서버에서 자바스크립트를 실행하기 위해 자바스크립트 인터프리터와 자바스크립트 라이브러리를 통합해 놓은 것이 Node.js이다.

여기에서 자바스크립트 인터프리터를 자바스크립트 엔진이라고도 부른다.

<결론>
Node.js는 서버에서 자바스크립트를 실행하기 위한 환경이다.
다시 말해서, Node.js는 서버 사이드 자바스크립트 플랫폼(Server Side JavaScript Platform)이다.


3. V8 Engine

V8 엔진은 구글이 만든 오픈소스 자바스크립트 인터프리터의 이름이다.

구글 크롬 웹브라우저에 내장된 자바스크립트 인터프리터도 V8 엔진이고 Node.js에 내장된 자바스크립트 인터프리터도 V8 엔진이다.


4. Node.js는 웹 서버가 아니다.

Node.js는 자바스크립트 인터프리터(엔진)와 자바스크립트 라이브러리를 결합한 것이다.

그런데 자바스크립트 라이브러리 중에 웹서버를 구현한 라이브러리도 있는데, 이 웹 서버를 구현한 자바스크립트 라이브러리를 Node.js에서 실행하면 웹 서버 기능이 실행되는 것이다.

그렇지만 Node.js가 웹 서버인 것은 아니다.


5. 비동기 I/O 처리

Node.js의 주요 특징은 비동기 I/O 처리이다.


I/O란?

입력/출력(Input/Ouput)을 짧게 I/O라고 부른다.

대표적인 I/O 작업은 다음과 같다.

  • 하드디스크에 읽기/쓰기
  • 네트워크 데이터 받기/보내기

대표적인 I/O 장치는 다음과 같다.

  • 하드디스크
  • 네트워크 카드

CPU의 지시에 의해서 I/O 작업이 시작되지만 I/O 작업을 직접 실행하는 것은 I/O 장치이다. I/O 작업이 완료되면 I/O 장치는 CPU에게 작업 완료를 통보한다. 이 통보를 I/O Interrupt라고 부른다.


동기 I/O 처리

아래의 예시를 보자.

1
2
3
String data = inputStream.read();
System.out.println(data);
System.out.println("완료");

위 코드는 동기 방식 I/O 작업을 Java로 구현한 것이다. 다음과 같은 순서로 실행된다.

  • inputStream.read() 읽기 작업을 실행한다.
  • 읽기 작업이 완료된 후에 read메소드가 리턴한다. 이 메소드의 리턴 값은 읽은 데이터이다.
  • 읽은 데이터가 화면에 출력된다. 출력이 완료된 후 println메소드가 리턴한다.
  • 완료문자열이 화면에 출력된다. 출력이 완료된 후 println메소드가 리턴한다.


비동기 I/O 처리

아래의 예시를 보자.

1
2
3
4
inputStream.readAsync(
data -> System.out.println(data)
);
System.out.println("완료");

위 코드는 비동기 방식 I/O 작업을 Java로 구현한 것이다.

비동기 방식의 메소드는 작업을 시작하자마자 작업이 완료되기도 전에 즉시 리턴한다. 위 코드에서 readAsync메소드가 비동기 메소드이기 때문에 읽기 작업을 시작하자마자 읽기 작업이 완료되기도 전에 즉시 리턴한다.

읽기 작업이 완료되기 전에 리턴하는 것이라서 readAsync메소드는 읽은 결과를 리턴할 수 없다.

위 코드는 다음과 같은 순서로 실행될 것이다.

  • inputStream.readAsync()읽기 작업이 시작된다.
  • 읽기 작업이 시작 되자마자 readAsync메소드가 리턴한다.
  • 완료 문자열이 화면에 출력된다. 출력이 완료된 후 println메소드가 리턴한다.
  • 읽기 작업이 완료되고 data -> System.out.println(data)부분이 실행된다.
  • 읽은 데이터가 화면에 출력된다.

위 실행 순서는 확실하지 않다. 만약 읽기 작업이 매우 빨리 완료된다면 읽은 데이터가 화면에 출력된 이후에 완료문자열이 화면에 출력될 수도 있다.


6. 비동기 I/O 방식의 장단점

장점

쓰레드 한 개가 비동기 방식의 I/O 메소드를 실행할 때, I/O 작업이 완료될 때까지 쓰레드가 기다리지 않고 작업이 시작되자마자 즉시 리턴한다. 따라서 I/O 장치에서 I/O 작업이 처리되는 동안 쓰레드가 정지 상태로 대기하지 않고 다른 작업을 할 수 있다.

비동기 방식의 I/O 작업들을 동시에 여러 개 처리해야 한다면 비동기 I/O 메소드들을 여러 개 순서대로 호출하여 비동기 I/O 작업들을 동시에 여러 개 시작하면 된다. 따라서 멀티 쓰레드가 필요없다.

즉, 비동기 I/O 처리 방식의 장점은 멀티 쓰레드가 필요 없기 때문에 메모리 사용량도 적어서 효율적이라는 것이다.


단점

비동기 메소드는 작업을 시작만 하고 즉시 리턴하기 때문에 작업 결과를 전달 받으려면 복잡한 프로그래밍 기법이 필요하며 비동기 작업이 완료된 시점에 처리할 작업을 구현할 때도 복잡한 프로그래밍 기법이 필요하다.

즉, 비동기 I/O 처리 방식의 단점은 어려운 프로그래밍 기법이 필요하다는 점이다.

Share