노드는 chrome V8 자바스크립트 엔진으로 빌드된 자바스크립트 런타임 환경이다
노드를 서버 등 다양하게 사용할 수 있다
노드는 자바스크립트 실행기로 봐도 무방하다
자바스크립트를 모르면 아무것도 할 수 없다
기존 노드는 속도가 느려 문제가 되었지만 오픈소스 자바스크립트 엔진 V8을
사용하여 속도가 개선되어 노드에서 사용하게 되었다
노드의 이벤트기반, 논 블로킹I/O를 처리하는 라이브러리
노드가 이벤트로 동작하기 때문에 이벤트 루프 등을 관리한다
노드는 이벤트로 동작
싱글스레드라서 한번에 하나의 일 처리
호출스택 : 호출 함수 실행되는곳
태스크큐 : 콜백 대기하는곳, 콜백큐
백그라운드 : setTimeout 같은 논블로킹 함수가 처리되는곳
이벤트 발생 시 호출스택에 쌓이며 쌓인 함수들을 실행 후 콜백함수들을 태스크큐에 저장 호출스택이 비어있을때 태스크큐에 있는 콜백을 호출스택으로 전달 처리
setTimeout 같은 함수는 호출스택에서 백그라운드로 전달 콜백함수는 태스크큐로 전달
작업은 동시에 처리할 수 있는 작업(논블로킹)이 있고
동시에 처리 못하는 작업(블로킹)이 있음
논블로킹 작업을 모아서 처리하거나 순서를 바꾸는걸로 인해
실행시간이 빨라질수있음 그래서 논블로킹 방식으로 처리하는것을 지향해야함
자바스크립트 코드는 블로킹 작업
노드는 프로세스 내 여러 스레드가 만들어지지만 우리가 조작할 수 있는 스레드는 1개 이므로 노드는 싱글스레드라 부름, 싱글스레드라서 한번에 하나의 작업을 처리 가능
워커스레드로 멀티스레드 사용이 가능
멀티스레드 사용 시 작업 수에 따라 스레드가 증가하므로 마냥 좋다고 할수없고
사용하기도 어렵기 때문에 멀티스레드보다는 멀티프로세싱 방법을 사용
노드는 자바스크립트 기반으로 자바스크립트만 알고있으면 프론트, 백엔드 개발을 할수있어 생산성 향상
I/O 논블로킹 작업 처리가 가능하여 간단한 작업을 많이 실행하는 환경이라면 노드가 적합 ex) 실시간 채팅 프로그램
CPU를 많이 사용하는 작업은 싱글스레드 이므로 블로킹 될수있어 적합하지않음
워커스레드로 멀티스레드 처리 가능
내장웹서버가 존재하여 nginx 등 따로 서버가 필요하지않음
물론 서버가 점점 커지면 필요함
다른 서버에 비해 속도가 그렇게 빠르진 않음