[Node.js 교과서] 노드 시작하기

Hailey Park·2022년 3월 23일
0

Node.js

목록 보기
1/1
post-thumbnail

이 게시물은 Node.js 교과서 책을 읽고 정리한 내용입니다.


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

이벤트 기반

이벤트 기반(event-driven) : 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식

  • 이벤트 : 클릭, 네트워크 요청 등

노드도 이벤트 기반 방식으로 동작하므로, 이벤트가 발생하면 이벤트 리스너에 등록해둔 콜백 함수를 호출한다. 발생한 이벤트가 없거나 발생했던 이벤트를 다 처리하면, 노드는 다음 이벤트가 발생할 때까지 대기한다.

ex) 클릭 이벤트 리스너에 경고창을 띄우는 콜백 함수를 등록해두면 클릭 이벤트가 발생할 때마다 콜백 함수가 실행되어 경고창이 뜬다.

여러 이벤트가 동시에 발생했을 때 어떤 순서로 콜백 함수를 호출할지를 이벤트 루프가 판단한다.

  • 이벤트 루프 : 이벤트 발생 시 호출할 콜백 함수들을 관리하고, 호출된 콜백 함수의 실행 순서를 결정하는 역할을 담당한다. 노드가 종료될 때까지 이벤트 처리를 위한 작업을 반복하므로 루프(loop)라고 부른다.

  • 백그라운드 : setTimeout같은 타이머나 이벤트 리스너들이 대기하는 곳. 자바스크립트가 아닌 다른 언어로 작성된 프로그램이라도 봐도 된다. 여러 작업이 동시에 실행될 수 있다.

  • 테스크 큐 : 이벤트 발생 후, 백그라운드에서는 테스크 큐로 타이머나 이벤트 리스너의 콜백 함수를 보낸다. 정해진 순서대로 콜백들이 줄을 서 있으므로 콜백 큐라고도 부른다. 콜백들은 보통 완료된 순서대로 줄을 서 있지만 특정한 경우에는 순서가 바뀌기도 한다.

논 블로킹 I/O

I/O 작업 시 노드는 논 블로킹 방식으로 처리하는 방법을 제공한다.

  • 논 블로킹 : 이전 작업이 완료될 때까지 대기하지 않고 다음 작업을 수행함
  • 블로킹 : 이전 작업이 끝나야만 다음 작업을 수행함

노드는 I/O 작업을 백그라운드로 넘겨 동시에 처리한다. 따라서 동시에 처리될 수 있는 작업들은 최대한 묶어서 백그라운드로 넘겨야 시간을 절약할 수 있다.

  • setTimeout(콜백, 0)
    밀리초를 0으로 설정했으므로 바로 실행되는 것으로 착각할 수 있다. 하지만 브라우저와 노드에서는 기본적인 지연 시간이 있으므로 바로 실행되지 않는다. HTML5 브라우저에서는 4ms,노드에서는 1ms의 지연 시간이 있다.

싱글 스레드

노드는 엄밀히 말하면 싱글 스레드로 동작하지는 않는다.

노드를 실행하면 먼저 프로세스가 하나 생성되고, 그 프로세스에서 스레드들을 생성하는데, 이 때 내부적으로 스레드를 여러 개 생성한다.
그 중에서 우리가 직접 제어할 수 있는 스레드는 하나 뿐이다.
그래서 흔히 노드가 싱글 스레드라고 여겨지는 것.

I/O 작업을 처리할 때는 멀티 스레딩보다 멀티 프로세싱이 효율적이므로 노드는 멀티 프로세싱을 많이 한다.

스레드풀과 워커 스레드

노드가 싱글 스레드로 동작하지 않는 두 가지 경우 : 스레드풀과 워커 스레드

  • 스레드풀(Thread Pool) : 노드가 특정 동작을 수행할 때 스스로 멀티 스레드를 사용한다. 대표적인 예로 암호화, 파일 입출력, 압축 등이 있다.
  • 워커 스레드 : 노드 12 버전에서 안정화된 기능으로 이제 노드에서도 멀티 스레드를 사용할 수 있게 되었다. CPU 작업이 많은 경우 워커 스레드를 사용하면 된다.

서버로서의 노드

서버에는 기본적으로 I/O 요청이 많이 발생하므로, I/O 처리를 잘하는 노드를 서버로 사용하면 좋다.

스레드 하나가 많은 수의 I/O를 혼자서도 감당할 수 있다.
하지만 노드는 CPU 부하가 큰 작업에는 적합하지 않다.
(CPU 연산을 많이 요구하면 스레드 하나가 혼자서 감당하기 어렵다.)

노드의 사용

  • 개수는 많지만 크기는 작은 데이터를 실시간으로 주고받는 데 적합하다.
  • 네트워크나 데이터베이스, 디스크 작업 같은 I/O에 특화되어 있기 때문이다.
  • 실시간 채팅 애플리케이션이나 주식 차트, JSON 데이터를 제공하는 API 서버가 노드를 많이 사용한다.

이미지나 비디오 처리, 혹은 대규모 데이터 처리처럼 CPU를 많이 사용하는 작업을 위한 서버로는 권장되지 않지만, 그럼에도 굳이 노드로 하고 싶다면

-> AWS Lambda나 Google Cloud Functions 같은 서비스에서 노드로 CPU를 많이 사용하는 작업을 처리하는 것을 지원하므로 고려해볼 것.

노드에는 웹 서버가 내장되어 있어 입문자가 쉽게 접근할 수 있다.
노드 외의 서버를 개발하다 보면 Apache,nginx,IIS처럼 별도의 웹 서버를 설치해야 하는 경우가 많다. 심지어 Tomcat 같은 웹 애플리케이션 서버(WAS)를 추가로 설치하는 경우도 있다.

노드는 내장된 웹 서버를 사용하면 되므로 편리하지만, 나중에 서버 규모가 커지면 결국 nginx등의 웹 서버를 노드 서버와 연결해야만 한다.

노드의 장단점

  • 장점

    • 멀티 스레드 방식에 비해 적은 컴퓨터 자원 사용
    • I/O 작업이 많은 서버로 적합
    • 멀티 스레드 방식보다 쉬움
    • 웹 서버가 내장되어 있음
    • 자바스크립트를 사용함
    • JSON 형식과 쉽게 호환됨
  • 단점

    • 기본적으로 싱글 스레드라서 CPU 코어를 하나만 사용
    • CPU 작업이 많은 서버로는 부적합
    • 하나뿐인 스레드가 멈추지 않도록 관리가 필요
    • 서버 규모가 커졌을 때 서버를 관리하기 어려움
    • 어중간한 성능
profile
I'm a deeply superficial person.

0개의 댓글