자바스크립트 런타임 환경 (자바스크립트를 실행할 수 있다.)
여러 OS에서 실행이 가능하다. (윈도우, 맥, 리눅스)
서버 구축에 정말 많이 사용되며, 마이크로서비스 아키텍처를 설계하는데 중요한 역할을 하는 엔진입니다.
싱글 스레드인 자바스크립트를 활용한 서버측 로직을 작성하기 위해 비동기 이벤트 기반 아키텍처를 사용합니다.
성능이 좋고 확장성을 제공합니다.
2009년에 NodeJS가 출시 되었고 이 때 npm도 같이 생성되었습니다.
npm에 대한 이야기는 밑에 가서 자세히 해보겠습니다.
자바스크립트로 서버 측 활용이 가능한 본격적인 시작은 Javascript V8엔진 부터 입니다.
2020년 github. npm을 인수 했고 NodeJS를 사용하는 기업, 시장이 커지고 있습니다.
정답은 아니다 입니다.
서버가 아니고 서버의 로직을 자바스크립트로 작성할 수 있게 도와주는 것입니다.
NodeJS는 웹 서버가 아니고 Javascript를 사용해서 서버 측 로직을 코드로 작성하고 서버를 구축할 수 있게 제공합니다.
개발의 생산성을 위해 npm을 통해 모듈을 설치 받거나 제공할 수 있습니다.
NodeJS에서
비동기 I/O (Input/Output)작업을 진행하는 동안 또 다른 작업을 실행할 수 있습니다.
블로킹 : 한 작업이 끝날 때 까지 다른 작업을 수행 하지 않는 것입니다.
블로킹 I/O 작업은 수행하는 동안 다른 코드의 중단을 진행할 수 있습니다.
논 블로킹 : I/O 작업을 수행하는 동안 다른 코드들을 실행할 수 있게 하는 것입니다.
NodeJS는 모든 I/O 작업을 비동기적으로 실행 하고 블로킹 하지 않는다.
NodeJS의 가장 큰 특징으로 이벤트 기반의 아키텍처가 있습니다.
이벤트 기반의 프로그래밍은 이벤트가 발생하면 콜백 함수를 실행 시키는 방식입니다.
이벤트 기반의 프로그래밍을 작성하면 비동기 처리가 가능하고 좋은 성능과 확장성을 가질 수 있습니다.
장점 : Node.js 서버로 구현하면 요청이 많거나 오래 걸리는 요청이 있어도
멈추거나 요청 대기 시간이 발생하지 않습니다.
이런 Non-blocking 특징 때문에 채팅 서비스나 SNS에 자주 사용됩니다.
또한 Node.js는 코드가 매우 짧고 쉬워서 빠른 개발이 가능합니다.
정리하자면, 개수는 많지만 크기는 작은 데이터를 실시간으로 주고 받는 데 적합해서
실시간 채팅이나 주식 차트 등에 노드를 많이 사용합니다.
그리고 안정성과 보안성 측면의 문제도 충분히 검증되었습니다.
규모가 큰 에어비엔비, 넷플릭스, 링크드인 등에서 노드를 사용하고 있고
페이팔이나 월마트 같이 결제 시스템을 사용하는 대기업에서도 노드로 서비스를 운영하고 있습니다.
단점 : Node.js는 싱글 스레드로 처리됩니다.
코드가 CPU 연산을 많이 요구하면 스레드 하나가 감당하기 어렵습니다.
그렇기 때문에 이미지나 비디오 처리, 대규모 데이터 처리 같이 CPU를 많이 사용하는 작업을 위한 서버로는
권장하지 않습니다. 노드보다 더 적합한 다른 언어들이 많기 때문입니다.
예를 들어 야구장이나 축구 경기 같은 티켓이 있어야만 입장이 가능한 곳에서
일반 서버 같은 경우에는 첫번째 입장 순서의 인원이 1명이라 티켓 1개만 확인하고 다음 순서로 넘어가는데
만약 두번째 입장 순서에서 인원이 50명이라 티켓 50장을 확인 해야 한다면 뒤에 세번째, 네번째 순서는
계속 50장 확인이 끝날 때까지 기다려야 하는데 NodeJS 서버 같은 경우에는 논블로킹 특징으로써
티켓 전체를 취합하여 기다리게 하지 않고 일찍 처리가 끝나는 순서 대로 처리 하기 떄문에 NodeJS를 많이 사용하게 되었습니다.
개발자들이 작성한 자신의 소스코드를 공유할 수 있는 패키지 저장소입니다.
npm을 사용하면 모듈의 단위를 쉽게 설치 받아서 사용할 수 있습니다.
NodeJS가 개발된 이유는 웹 서버 개발을 하기 위해서도 있지만, 방대한 오픈소스 생태계를 구축하기 위해서 개발자들이 편하게 개발을 할 수 있도록 개발 생산성과 질을 높이기 위해서도 있습니다.
크롬 V8 Javascript 엔진으로 빌드된 서버, 자바스크립트 런타임 환경입니다.
V8 엔진은 Google이 개발한 오픈소스로 가장 대중적인 자바스크립트 엔진입니다.
브라우저와 런타임 환경이 다릅니다.
만약 빌드가 되었다고 하는건 V8 엔진을 사용해서 코드를 컴파일러를 통해
실행 파일로 변환하는 작업이 되었다고 보면 됩니다.
이벤트를 실행하면 이벤트에 등록한 작업을 수행합니다.
우리가 자바스크립트로 onClick(), addEventListener('click') 클릭 같은 이벤트에 콜백함수를 작성하고
이벤트 기반의 특정 이벤트가 발생하면 전달한 콜백함수를 호출해서 실행 시킵니다.
이런 내용을이벤트 리스너에 콜백 함수를 등록한다.라고 합니다.