프로젝트를 위해 공부하고 있는 Node에 대한 강의를 수강하면서 정리할 예정이다.
Node.js 는 Chrome V8 자바스크립트 엔진으로 빌드된 자바스크립트 런타임이다. (공식홈피)
❓ 그러면 Node 있기 전에는?
원래는 브라우저(엣지, 사파리 등), HTML 이 스크립트를 읽어줬다.
=> 자바스크립트는 종속.
❗Node 탄생 후!
이전에도 자바스크림트 런타임을 만들려 했지만 엔진 속도 문제로 실패.
이해를 돕기 위해 버튼을 클릭할 때 경고창을 띄우도록 설정하는 것을 예로 들어보자.
이벤트 루프를 잘 활용해 오래 걸리는 작업을 효율적으로 처리가 가능하다.
작업에는 동시에 실행될 수 있는 작업(동기식 작업) 과 동시에 실행되지 않는 작업 (비동기식 작업) 이 있다.
기본 적으로 자바스크립트 코드는 비동기식 작업이지만 I/O 작업은 동기식 작업이 가능하다.
이러한 I/O 작업 시에 노드는 논 블로킹 방식으로 처리하는 방식을 제공한다.
논 블로킹 : 오래 걸리는 함수를 백그라운드로 보내 다음코드 먼저 실행한다. 그 후 오래 걸리는 함수는 나중에 실행
블로킹 : 이전 작업이 끝나야만 다음 작업을 수행하는 것.
그림을 통해 우리는 블로킹 방식보다 논 블로킹 방식이 같은 작어블 더 짧은 시간내에 처리할 수 있음을 알 수 있다.
⚪ 이렇게 작업 순서에 따라 성능이 크게 달라지기에 논 블로킹 방식을 의식하면서 코딩하는 습관을 들이자!
이제부터 코드의 예시를 볼 것이다.
먼저 블로킹 방식의 코드를 보자.
function longRunningTask() {
// 오래 걸리는 작업
console.log('작업 끝');
}
console.log('시작');
longRunningTask();
console.log('다음 작업');
이에 대한 결과는
시작
작업 끝
다음 작업
과 같다.
오래 걸리는 작업인 longRunningTask 함수가 있어서 이 작업이 완료되기 전까지는 console.log('다음 작업')이 호출되지 않는다.
다음 예제는 논블로킹 방식의 코드이다.
function longRunningTask() {
// 오래 걸리는 작업
console.log('작업 끝');
}
console.log('시작');
setTimeout(longRunningTask, 0);
console.log('다음 작업');
이에 대한 결과는
시작
다음 작업
작업 끝
과 같다.
setTimeout의 콜백 함수인 longRunningtask가 테스크 큐(?)로 보내져 순서대로 실행 되지 않는다.
📄 setTimeout(콜백, 0)
밀리초를 0 으로 설정했지만 브라우저와 노드에는 기본적인 지연 시간의 존재로 바로 실행되지 않는다.
❓ 다만, 아무리 논 블로킹 방식으로 코드를 작성하여도 코드가 전부 우리가 작성한 것이라면 전체 소요 시간이 짧아지지는 않는다.
❗우리의 코드는 서로 동시에 실행되지 않기 때문이다. 즉, 단순히 실행 순서만 바꾸어 주어 간단한 작업들이 대기하는 상황을 방지하는데 의의가 있다.
논 블로킹 과 동시는 같은 의미가 아니다. (추가)
###3. 프로세스 vs 스레드
프로세스와 스레드
그렇다면 노드 프로세스는 ❓
멀티 스레드!!!
노드를 실행하면 먼저 프로세스가 하나 생성된다. 그리고 그 프로세스에서 스레드들을 생서하는데, 내부적으로 스레드를 여러 개 생성한다. But 직접 제어가 가능한 스레드는 하나뿐이다. 그래서 우리는 싱글 스레드라고 표현한다.
EX)
✔️ 노드 != 서버
🗝️ But 노드는 서버를 구성할 수 있게 하는 모듈 (http) 제공
노드 서버의 장단점
// 언어로 할 수 있는 한계까지 갔을 때 성능이 ㄱㅊ으면 ㄱㅊ 못해서 안하는 것 x
📢 서버 외의 노드
서버에만 한정 x
웹, 모바일, 데스크탑 어플리케이션에도 사용
- 웹 프레임워크: Angular, React, Vue, Meteor 등
- 모바일 앱 프레임워크: React Native
- 데스크탑 개발 도구: Electron(Atom, Slack, VSCode, Discord)
출처:
🔍 더 깊게 공부하기 위한 사이트
- 노드 공식 사이트: https://nodejs.org/ko
- 노드 공식 사이트의 가이드: https://nodejs.org/ko/docs/guides/
- 노드에 대한 전반적인 설명: https://nodejs.dev/
- 이벤트 루프 설명: https://nodejs.org/ko/docs/guides/event-loop-timers-and-nexttick/
- 이벤트 루프에 대한 시각적 설명: http://latentflip.com/loupe
- VS Code 공식 사이트: https://code.visualstudio.com/
- Homebrew 사이트: https://brew.sh/index_ko