Node.js의 이해

노드는 js 런타임.
전반적으로 노드로 서버를 실행하는 방법 다룸.

  • 서버
    노드는 서버 애플리케이션 실행에 제일 많이 사용.
    서버는 네트워크 통해 클라이언트에 정보 제공하는 프로그램.
    클라이언트 --요청--> 서버
    클라이언트 <--응답-- 서버

노드는 js 프로그램이 서버로서 기능하기 위한 도구를 제공.
왜 노드? -> 노드의 특성 알아야 함.

  • js 런타임
    런타임이란 특정 언어로 만든 프로그램들을 실행할 수 있는 환경
    == 프로그래밍 언어가 구동되는 환경
    == 프로그램이 실행되고 있을 때 존재하는 곳
    쉽게 말해 노드는 js 실행기로 봐도 무방.

기존에는 js프로그램을 웹 브라우저 에서만 실행할 수 있었음.
브라우저는 js 런타임을 내장하고 있으므로 js 코드 실행 가능.
브라우저 외의 환경에서 사용하기 위해 노드 사용
노드는 V8, libuv 라이브러리 사용
libuv 라이브러리는 노드의 특성인 이벤트 기반, 논 블로킹 I/O 모델을 구현하고 있음

  1. 이벤트 기반
    이벤트(클릭, 네트워크 요청 등) 발생 시 미리 지정해둔 작업 수행
    특정 이벤트 발생 시 무엇을 할 지 미리 등록해두어야 함. == 이벤트 리스너에 콜백 함수를 등록
    ex) 클릭 이벤트 리스너에 경고창 띄우는 콜백 함수 등록해두면 콜백 함수 실행되어 경고창 뜸
  • 이벤트 루프: 이벤트 발생 시 호출할 콜백 함수들 관리하고 실행 순서 결정. 노드 종료까지 작업 반복하므로 loop.
  • 백그라운드: setTimeout 같은 타이머나 이벤트 리스너들이 대기하는 곳. js 아닌 다른 언어로 작성된 프로그램.
  • 태스크 큐: 이벤트 발생 후, 백그라운드에서 테스크 이벤트 리스너의 콜백 함수 보냄. 정해진 순서대로 줄 서있으므로 콜백 큐라고도 부름.
  1. 논 블로킹 I/O
    I/O는 입출력(input, output)을 의미
    파일 접근이나 네트워크 요청 등이 I/O의 일종.
    이러한 작업을 할 때 노드는 논 블로킹 방식으로 처리하는 방법을 제공.
    블로킹: 이전 작업 끝나야만 다음 작업 수행.
    논 블로킹: 이전 작업이 완료될 때까지 기다리지 안고 다음 작업을 수행함. 더 짧은 시간에 처리할 수 있지만 모두 동시에 처리가능한 작업 전제.

배치 순서에 따라 성능 크게 달라짐. 따라서 논 블로킹 방식으로 코딩하지 않으면 의미 퇴색됨.

// 블로킹 방식의 코드
function longRunningTask() {
  // 오래 걸리는 작업
  console.log('작업 끝');
}

console.log('시작');
longRunningTask();
console.log('다음 작업');
// setTimeout 사용해 코드를 논 블로킹 방식으로
function longRunningTask() {
  // 오래 걸리는 작업
  console.log('작업 끝');
}
console.log('시작');
setTimeout(longRunningTask, 0);
console.log('다음 작업');

setTimeout(콜백, 0)은 코드 논 블로킹으로 만드는 기법중 하나.
ㄴ 사실 노드에서는 다른 방법 주로 사용하긴 함
ㄴ 3.4.3절의 setImmediate 참조

이벤트 루프 이해했다면 setTimeout의 콜백 함수(longRunning)가 태스크큐로 보내지므로 순서대로 실행되지 않음.

  • 논 블로킹과 동시가 같은 의미가 아님
    동시성은 동시 처리 가능한 작업을 논 블로킹 처리해야 얻을 수 있다.

  • 싱글 스레드

    • 프로세스
      프로세스는 운영체제에서 할당하는 작업의 단위.
      노드나 웹 브라우저는 개별 프로세스. 프로세스 간에는 메모리 등 공유x

    • 스레드
      스레드는 프로세스 내에서 실행되는 흐름의 단위
      스레드는 부모 프로세스의 자원(데이터) 공유

    노드가 싱글 스레드라는 말은? 엄밀히 말하면 스레드 1개 아님
    노드 실행 시 먼저 프로세스 하나 생성됨
    프로세스에서 여러개 스레드 생성하는데 사용자가 하나만 직접 제어 가능
    그래서 싱글 스레드라고 여겨짐.

  • 서버로서의 노드
    노드는 싱글 스레드, 논 블로킹 모델을 사용하므로 노드 서버도 동일한 모델.
    서버에는 I/O요청이 많이 발생
    노드는 libuv 라이브러리 사용해 I/O작업을 논 블로킹 방식으로 처리
    따라서 스레드 하나가 많은 수의 I/O를 혼자 감당 할 수 있다
    but 노드는 cpu부하가 큰 작업에는 적합x. 작성한 코드가 모두 한 스레드에서 처리되기 때문

이러한 특성 => 개수 많지만 크기는 작은 데이터 주고받는데 적합

노드의 큰 장점은 언어로 js를 사용한다는 것
웹 브라우저도 js 사용하므로 한 언어로 웹 사이트 개발 할 수 있음

좋은 웹페이지 즐겨찾기