Node.js는 JavaScript 런타임이다.
Node.js는 이벤트 기반, 논 블로킹 I/O 모델을 사용해 가볍고 효율적이다.
프로그래밍 언어가 구동되는 환경을 뜻한다.
노드 이전에는 브라우저 내에서 독점적으로 이용할 수 있는 자바스크립트였지만
-> 브라우저 내에서만 사용할 수 있다는 한계가 있었다.
노드로 인해 브라우저 외에도 서버, 머신러닝, 데스크탑 앱까지 확장되었다.
-> 자바스크립트를 이용할 수 있는 분야가 넓어졌다.
이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식
function delay() {
// 시간이 오래 오래 걸리는 작업
console.log("작업 끝");
}
console.log("시작);
setTimeout(delay(),3000); // 딜레이 되는 시점
console.log("끝);
노드에선 위와 같은 코드를 해당 이벤트를 통해 진행합니다.
#호출스택 #백그라운드 #테스크큐 #이벤트루프
1. 실행 순서대로 호출 스택에 시작, delay(), 끝
순으로 쌓입니다.
2. setTimeout
로 인해 백그라운드 작업이 필요한 delay 함수는 백그라운드로 이동합니다.
3. 백그라운드가 완료되면 테스크 큐로 이동하여 대기합니다.
4. 호출 스택들이 모두 완료되면 이벤트 루프가 테스큐 작업을 호출 스택으로 이동합니다.
논 블로킹 I/O 에 반대되는 블로킹 I/O부터 알아봅시다.
클라이언트가 서버에게 3분 정도 걸리는 요청을 했다고 가정하면
블로킹은 서버가 3분동안 작업할동안 클라이언트는 작업이 중지됩니다.
서버가 일을 마치면 클라이언트에게 응답을 보냅니다.
클라이언트가 서버에게 정말 더 긴 분량을 보낸다면 그만큼 대기를 해야하는 상황이 발생합니다.
이런 단점을 해결하기위해 나온게 논 블로킹 I/O 입니다.
시간이 많이 걸리는 작업을 백그라운드에서 처리하고 그동안 클라는 요청을 계속 보낼 수 있습니다. 이렇게 기다리지 않고 바로 요청과 응답을 보낼 수 있는 장점이 있습니다.
Node.js는 이런 논 블로킹 I/O 를 사용하고 있다!
주어진 작업을 한개의 스레드가 처리하는 방식
스레드: 작업을 실행하는 단위
Node.js는 싱글 스레드로, 1개의 스레드를 가진다!
브라우저에서 스레드로 요청, 스레드가 브라우저에게 응답하는 형식
싱글스레드
멀티 스레드
장점
1. 싱글 스레드, 논블로킹 I/O에 따른 빠른 속도
2. 컴퓨터 자원을 덜 사용
3. I/O 작업이 많은 서버로 적합(채팅, 스트리밍)
4. JavaScript를 사용하기에 FE 개발자 사용 용이
5. 빠르게 개발이 가능하므로 높은 생산성
단점
1. 싱글 스레드 기반으로 자원을 많이 잡아먹으면 부하가 크다.
2. 싱글 스레드는 CPU 코어를 한개만 사용하므로 게임 서버와 같은 CPU 작업이 많은 서버로는 부적합
3. 로직이 복잡한 경우 콜백지옥에 빠질 가능성
4. 싱글 스레드이므로 에러가 발생하면 프로세스 자체가 죽어버림
이런 단점을 극복하기위해 pm2와 같이 개발합니다.
https://nodejs.org/en/
에서 대부분의 사용자에게 권장하는 버전으로 설치합니다.
제대로 설치되었는지 확인하는 명령어를
터미널에 입력합니다.
node --version
v16.13.1
노드 패키지 매니저인 npm 은 Node.js를 설치할때 자동으로 설치됩니다.
npm --version
8.1.2
Node.js 환경에서 js 파일 콘솔로 확인하는 법
node 파일명.js