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

1. 핵심 개념

1. 서버

  • Node.js: 크롬 V8 자바스크립트 엔진으로 빌드된 자바스크립트 런타임
  • 노드를 통해 다양한 JS 애플리케이션 실행 가능하지만, 서버 애플리케이션을 실행하는데에 가장 많이 사용

2. JS 런타임

  • 노드 내부 구조: Node.js core library & Node.js Bindings & V8 & libUV

    • libUV: 이벤트 기반, 논블로킹 I/O 모델 구현

3. 이벤트 기반

  • 이벤트기반: 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식 (이벤트 발생시 무엇을 할지 이벤트 리스너에 콜백을 등록)

    • 예: 클릭 이벤트 리스너에 경고창 띄우는 콜백 등록 ➡ 클릭 이벤트 발생 ➡ 콜백함수 실행되어 경고창 ➡ 처리해야할 이벤트 없으면 대기
  • 이벤트 루프: 이벤트 발생시 호출할 콜백 함수를 관리 & 여러 이벤트 동시에 발생시 콜백의 호출 순서 결정. 노드가 종료될 때까지 이벤트 처리를 위한 작업 반복

    • 콜스택이 비면 이벤트루프가 태스크 큐의 콜백을 꺼내 콜스택으로 올림. 만약 콜스택에 함수가 많으면 setTimeout으로 지정한 delay가 지나도 콜백이 실행되지 않을 수도 있다.

4. 논블로킹 I/O

  • I/O의 예: 파일시스템 접근(파일 읽기, 쓰기, 폴더 만들기 등), 네트워크 통한 요청 등
  • 노드는 libUV 사용해서 I/O 작업을 논블로킹으로 처리(이전 작업 완료될 때까지 기다리지 않고 다음 작업 수행)

    • 콜스택, 백그라운드, 태스크 큐 중 백그라운드에 I/O 작업을 넘겨서 동시에 처리 => 동시에 처리할 수 있는 작업들은 최대한 묶어서 백그라운드로 넘겨야 시간 절약 => setTimeout, setImmediate 등 이용
  • I/O 작업이 없어도, 논블로킹 통해 실행 순서 바꾸어서 간단한 작업들이 대기해야하는 상황 방지 가능

5. 싱글스레드

  • 프로세스: 운영체제에서 할당하는 작업의 단위/ 노드나 웹 브라우저 등의 프로그램은 개별적인 프로세서

    • 프로세서 간에는 자원 공유 X
    • 멀티프로세싱: I/O 요청이 많을 때에 사용
  • 스레드: 프로세스 내에서 실행되는 흐름의 단위/ 프로세스는 스레드를 여러개 생성해서 여러 작업 동시에 처리 가능

    • 같은 주소의 메모리에 접근 ➡ 자원 공유 O
    • 멀티 스레딩: CPU 작업이 많을 때 사용
  • 노드 실행 ➡ 1개의 프로세스와 그 프로세서 내부의 여러 개의 스레드 생성/ 이 중에서 내가 직접 제어할 수 있는 스레드는 하나 뿐 => 노드가 싱글스레드라고 여겨짐

    • 노드가 싱글 스레드로 동작하지 않는 경우
    • Thread pool: 노드가 특정 동작 수행시 멀티스레드 사용(예: 암호화, 파일 입출력, 압축 등)
    • Worker Thread: 내가 직접 멀티스레드를 다룰 수 있다.(예: CPU 작업이 많은 경우)

2. 서버로서의 노드

  • 스레드 하나가 많은 I/O 처리 가능. 하지만 싱글스레드이기에 CPU 부하가 큰 작업에는 부적합
  • 노드는 크기 작은 많은 수의 데이터 주고받을 떄 적합

    • 예: 네트워크, DB, 디스크 작업 등의 I/O (채팅, 주식차트, JSON 데이터 제공하는 API 서버)
    • 워커 스레드로 멀티스레드 가능해졌지만, 다른 언어에 비해 느리고 그 분배가 어렵다. ➡ 비디오, 대규모 데이터처리에는 부적합

3. 노드가 서버 외의 기능으로 사용된 예

  • React, Electron, Slack, Discord 등의 애플리케이션


출처

  • 조현영, Node.js 교과서(2021, 길벗)


Written by
Sunmin
어제보다 나은 오늘을 만들기 위해 배우고, 기록하고, 회고합니다. Maker. Reader. Realistic optimist.