노드는 js 런타임.
전반적으로 노드로 서버를 실행하는 방법 다룸.
노드는 js 프로그램이 서버로서 기능하기 위한 도구를 제공.
왜 노드? -> 노드의 특성 알아야 함.
기존에는 js프로그램을 웹 브라우저 에서만 실행할 수 있었음.
브라우저는 js 런타임을 내장하고 있으므로 js 코드 실행 가능.
브라우저 외의 환경에서 사용하기 위해 노드 사용
노드는 V8, libuv 라이브러리 사용
libuv 라이브러리는 노드의 특성인 이벤트 기반, 논 블로킹 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 사용하므로 한 언어로 웹 사이트 개발 할 수 있음