1. Node.js
1.1 Node.js의 등장 배경
- 단방향 통신 위주였던 WEB 1.0과 달리 WEB 2.0에서는 사용자와 상호작용이 늘었고 그 결과 고성능의 JS가 필요해 V8엔진이 등장하게 되었다.
- 오픈 소스 프로젝트였던 V8을 이용해 JS를 어느 환경에서나 실행할 수 있게 해주는 Node.js가 개발되었다.
1.2 Node.js의 특징
싱글 쓰레드 - 비동기 - 이벤트 기반
- 싱글쓰레드는 한번에 하나의 작업밖에 수행하지 못하지만 리소스 관리에 효율적이다.
Node.js는 비동기 동작으로 쓰레드 기반의 작업을 최소화한다
- 이벤트는 비동기 동작의 완료를 처리하는 방법으로 비동기 동작이 완료되면 함수를 큐에 등록해 뒀다가 나중에 실행하는 방식
1.3 ES6
- ECMAScript 6버전 이후를 통틀어 부르는 이름
- 현대적인 문법이 많이 추가되었으며 이는 생산성 향상에 도움을 준다.
- 많이 사용하는 문법
1. let, const
2. templete string
3. arrow function
4. class
5. destructing
1.4 비동기 코딩
- callback, Promise, async-await의 방법을 이용해 비동기를 구현할 수 있다.
- 각각의 방법마다 장단점이 있기 때문에 상황에 따라서 유연하게 사용할 수 있어야한다.
const promiseFunc = () => {
const [result1, result2] = await Promise.all([promise1(), promise2()])
console.log(result1, result2);
}
const asyncFunc = async () => {
const result1 = await promise1();
const result2 = await promise2();
console.log(result1, result2);
}
- promise1의 실행 시간이 1초, promise2가 2초 소요되는 함수라고 가정하면
promiseFunc()
는 실행시간이 2초지만 asyncFunc()
는 3초의 시간이 소요된다.
1.5 이벤트 루프
1.5.1 구성요소
- Call Stack: 작성된 함수들이 등록되는 LIFO 스택. 이벤트 루프는 콜스택이 비어있을 때까지 스택의 함수를 실행
- Message Queue: setTimeout같은 지연실행 함수를 등록하는 FIFO 큐. 정해진 시간이 끝나고 콜스택이 비어있을 경우 등록된 함수를 콜스택에 추가
- Job Queue: Promise에 등록된 콜백을 동록하는 FIFO 큐. 상위 함수가 종료되기 전에 콜스택이 비어있지 않더라도 잡큐에 등록된 콜백을 콜스택에 추가
function a() {
function b() {
setTimeout(() => {
console.log('b');
}, 0)
promiseFunc().then(c => console.log(c));
console.log('d');
}
b();
console.log('a');
}
- d: 앞의 비동기 처리로 인해 제일 먼저 실행된다.
- c: setTimeout의 timeout이 0이어도 메시지 큐에 등록되고 잡 큐는 상위 함수가 종료되기 전에 콜스택에 추가되기 때문에 실행됨
- a: b함수의 실행이 끝났기 때문에 실행
- b: 콜스택이 비었기 때문에 메시지 큐에서 콜백 함수를 가져와서 실행