node.js

  • 크롬 V8 자바스크립트 엔진으로 빌드된 자바스크립트 런타임입니다.
    • (런타임 - 특정 언어로 만든 프로그램들을 실행 할수 있는 환경)
  • node.js는 이벤트 기반, 논블로킹 I/O모델을 사용해 가볍고 효율적입니다.
  • 노드는 V8과 더불러 libuv라는 라이브러리를 사용
    • V8, libuv(C, C++ 로 구현되어 있음)
  • libuv 라이브러리는 노드의 특성인 이벤트 기반, 논블로킹 I/O 모델을 구현
  • 자바스크립트는 실행 시 기본적으로 전역 컨텍스트안에서 돌아간다 생각하는게 좋다

이벤트 기반 (중요중요))

  • 이벤트가 발생 할 때 미리 지정해둔 작업을 수행하는 방식, ex: 클릭, client요청, etc..
  • 특정 이벤트가 발생할때 무엇을 할지 등록-> 이벤트 리스너에 콜백 함수를 등록
  • 이벤트 루프(중요중요?) 여러 이벤트가 동시에 발생했을 때 어떤 순서로 콜백 함수를 호출할지는 이벤트 루프가 판단!
1
2
3
4
5
6
7
8
9
10
11
12
function one(){
two();
console.log('1번');
}
function two(){
three();
console.log('2번');
}
function three(){
console.log('3번');
}
one();

당연하지만 3번,2번,1번 호출되어짐

다른 예

1
2
3
4
5
6
function start(){
console.log('2초 후 실행');
}
console.log('시작');
setTimeout(start, 2000);
console.log('끝');

result

1
2
3
시작

2초 후 실행

이벤트 루프

이벤트 발생 시 호출할 콜백 함수를 관리, 호출된 콜백 함수의 실행 순서를 결정하는 역할을 담당. 노드가 종료 될 때까지 이벤트 처리를 위한 작업을 반복하므로 루프라 불려진다.(태스크 큐에 콜백 함수가 들어올때까지 계속 대기하게 된다.)

http://latentflip.com/loupe/ 를 보자

태스트 큐 또는 콜백 큐

이벤트 발생 후 호출되어야 할 콜백 함수들이 기다리는 공간.

백그라운드

타이머나 I/O 작업 콜백 또는 이벤트 리스너들이 대기하는 공간

논블로킹 I/O

이전 작업이 완료될 때까지 멈추지 않고 다음 작업을 수행함을 뜻합니다.

싱글 스레드

자바스크립트와 노드에서 논블로킹이 중요한 이유는! 바로 싱글 스레드이기 떄문이다. 한번에 한가지 일밖에 처리하지 못하기 때무넹 어떠한 작업에서 블로킹이 발생하면 다음 일을 처리하지 못한다.

server로서 노드

  1. 노드 서버는 I/O가 많은 작업에 적합
  2. CPU부하가 큰 작업에는 적합히지 않음 -> 싱글 스레드에서 일이 처리되는데 개발자가 작업한 코드가 CPU연산을 많이 요구하면 블로킹이 발생해 스레드하나가 감당하기 힘듬
  3. 에러처리 잘해야함(모든 서버는 예측할수 있는 에러는 잘 던지자)

(node.js 교과서 참조)