web 2.0으로의 발전으로 복잡한 JS가 되었고 이를 실행하는 엔진이 따로 필요
→ V8 엔진 등장
→ 자바스크립트를 브라우저 외부에서 사용하고 싶어 탄생
⭐️ 자바스크립트를 어느 환경에서나 실행할 수 있게 해주는 실행기이다.
싱글 스레드 - 비동기 - 이벤트 기반
스레드는 명령을 실행하는 단위로
싱글 스레드는 한 개의 스레드는 한 번에 한 가지 동작만 실행 가능
→ 그래서 Node.js 는 비동기 동작으로 스레드 기반의 작업을 최소화한다.
동작을 실행한 뒤 기다리지 않는 방식
동작 완료를 기다리지 않고 바로 다른 동작을 실행할 수 있음
→ Node.js 는 싱글스레드라 비동기 방식을 사용한다.
⚡️ 동기 vs 비동기
멀티스레드 동기 방식
싱글 스레드 비동기 방식
비동기 동작의 완료를 처리하는 방법
→ “이벤트를 등록한다.”
Node.js는 싱글 스레드이기에 비동기 동작이 필요하고 이를 구현하기 위해 이벤트 기반으로 움직인다.
ECMAScript 버전 6을 통틀어 ES6이라고 부른다.
계속해서 발전 하는 JS의 표준 문법
→ 생산성 향상, 코드 간결!
하지만 Node.js에서는 모든 문법을 지원하지 않는다.
let,const → 상수와 변수 구분 가능
Template String → ${}
Arrow Function → 변수에 할당 가능, const 에 할당하여 재선언 막을 수 있음
class
class Animal {
constructor(name, sound) {
/* constructor 완성하기 */
this.name = name
this.sound = sound
}
explain() {
console.log(`${this.name} says ${this.sound}`)
}
}
// "duck", "quack"
const duck = new Animal("duck","quack");
→ 생성자 안에서 변수를 할당하면 내부 변수 생성된다.
destructing → 변수에 객체나 배열을 하나씩 뽑아낼 수 있다.
const duck = {
name: "duck",
sound: "quack",
};
const { sound, name } = duck // 순서가 틀려도 된다.
const arr = ["good","bad"]
const [ first, second ] = arr
promsie / async-await → 비동기
세가지 방법이 있다.
function name(params){
return new Promise(resolve,reject)=>{
oldone(params,(err,users)=>{
if(err){
reject(err)
return
}
resolve(users)
}
}
}
async function ~
과 const r1 = await promise();
await Promise.all([~,~])
로 Promise의 병렬 실행이 가능하다! → 동시에 실행 가능한 비동기 동작들을 병렬로 처리하는 것으로 효율성을 높임→ 가독성이 좋은 async-awaitd을 지향하지만 특정 상황에 맞는 비동기 방법들을 구사할 줄 알아야함
이벤트를 처리하는 반복되는 동작
비동기 코딩이 어떤 순서로 수행되는지 이해할 수 있다.
비동기 동작의 실행 타이밍을 알아두자
Call Stack
작성된 함수들이 등록되는 LIFO 스택
이벤트 루프는 콜스택이 빌 때까지 스택의 함수를 실행한다.
Message Queue
setTimeout 같은 지연 실행 함수를 등록하는 FIFO 큐
콜스택이 비어있을 경우 등록된 함수를 콜스택에 추가
Job Queue
Promise에 등록된 콜백을 등록해두는 FIFO 큐
상위함수가 종료되기 전에 등록된 함수를 콜스택에 추가