서버란 네트워크를 통해 클라이언트에 정보나 서비스를 제공하는 컴퓨터 또는 프로그램
노드는 자바스크립트 어플리케이션이 서버로서 기능하기 위한 도구를 제공하므로 서버 역할을 수행할 수 있습니다.
노드는 자바스크립트 런타임이다.
런타임은 특정 언어로 만든 프로그램들을 실행할 수 있는 환경
따라서 노드는 자바스크립트 프로그램을 컴퓨터에서 실행 할 수 있게 해줍니다.
기존의 자바스크립트는 프로그램을 브라우저 에서만 실행 할 수 있었습니다.
2008년 구글의 v8 엔진을 통해 라이언 달(Ryan Dahl)이 2009년 v8 엔진 기반의 노드 프로젝트를 시작하였습니다.
이벤트기반(event-driven)이란 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식
이벤트로는 클릭이나 네트워크 요청 등이 있음.
노드도 이벤트 기반 방식으로 동작하므로 이벤트 발생시 이벤트 리스너에 등록해둔 콜백 함수를 호출.
이벤트 기반 모델에는 이벤트 루프라는 개념이 등장함.
논블로킹이란 이전 작업이 완료될 때까지 멈추지 않고 다음 작업을 수행함을 뜻함
블로킹 방식보다 같은 작업을 더 짧은 시간 동안 처리할 수 있음
하지만 node.js는 싱글 스레드이기 떄문에 모든 경우에서 시간적 이득을 볼 수 없음
노드는 파일 시스템 접근(읽기, 쓰기), 네트워크 요청 같은 작업을 논블로킹으로 동작함
노드는 싱글 스레드.
주어진 작업을 혼자서 처리해야 함을 의미.
언뜻보면 멀티스레드가 좋아 보이지만 각각의 장단점이 존재함.
음식점에 점원이 있습니다. 손님은 여러 명이고요. 점원 한 명이 주문을 받아 주방에 넘기고, 주방에서 요리가 나오면 손님에게 서빙을 합니다. 그 후 다음 손님의 주문을 받습니다. 이런 구조라면 다음 손님은 이전 손님의 요리가 나올 때까지 아무것도 못하고 기다리고 있어야 합니다. 이것이 싱글 스레드(점원), 블로킹 모델입니다. 매우 비효율적입니다.
점원이 한 손님의 주문을 받고, 주방에 주문 내역을 넘긴 뒤 다음 손님의 주문을 받습니다. 요리가 끝나길 기다리지 않고 주문이 들어왔다는 것만 알려주는 것입니다. 주방에서 요리가 완료되면 완료된 순서대로 손님에게 서빙합니다. 주문한 순서와 서빙하는 순서가 일치하지 않을 수도 있습니다. 이것이 노드가 채택한 싱글 스레드, 논블로킹 모델입니다.
실시간 채팅 어플리케이션이나 주식 차트, JSON 데이터를 제공하는 API 서버에는 노드를 많이 사용하나, 이미지나 비디오 처리, 대규모 데이터 처리 같이 CPU를 많이 사용하는 작업을 위한 서버로는 권장하지 않음.
웹, 모바일, 데스크톱 어플리케이션 개발에도 사용되기 시작.
노드를 사용하는 대표적인 웹 프레임 워크 -> angular, react, vue, meteor
모바일 개발 도구 -> React Native, Ionic
데스크톱 개발 도구 -> Electron