Node.js

이후띵·2022년 2월 6일
0

Node.js

목록 보기
7/10

타입 체크가 중요하다.

typescript

  • 자바스크립트에 타입 정의만 얹어 놓은 것.
// @ts-check
/* eslint-disable no-console */
// eslint-disable-next-line no-console

const someString = 'Hello';
const result = Math.log(someString);
console.log(result); // Not a Number

출력 - 'string' 형식의 인수는 'number' 형식의 매개 변수에 할당될 수 없습니다.

npm install --save-dev @types/node
-> 타입 스크립트가 노드환경에서도 적용되려면 이걸 깔아야된다.

jsonconfig.json

자바스크립트와 Event Loop

  • Node를 잘 이해하기 위해서는 자바스크립트의 동시성 모델에 대해 잘 이해해야 합니다.
  • event loop, call stack callback queue

Event Loop, Main Thread

  • 이벤트 루프 모델은 여러 스레드를 사용한다.
  • 그중 우리가 작성한 자바스크립트 코드가 실행되는 스레드는 메인스레드.
  • 한 노드js 프로세스에서 메인스레드는 하나이며, 한순간에 한줄씩만 실행한다.
  • 그러나 그 외의 일을 하는 워커 스레드는 여럿이 있을 수 있다.

Call Stack

  • 지금 시점까지 불린 함수들의 스택
  • 아래에서 위로 쌓였다가 위부터 실행
  • 함수가 호출될 때 쌓이고, 리턴될 때 빠진다.
  • 이벤트 루프가 다음 콜백을 처리하려면 지금 처리하고 있는 콜백의 실행이 완전히 끝나야 한다.
  • 콜 스택이 완전히 빌 때까지 처리한다는 것과 동일하다.

callback queue

  • 콜백들이 쌓이는 큐
  • 콜백큐(메세지큐)는 앞으로 실행할 콜백(함수와 그 인자)들을 쌓아두는 큐.
  • 브라우저나 노드가 어떤 일이 발생하면 (이벤트) 메인 스레드에 이를 알려주기 위해 콜백이 사용된다.
  • 이벤트는 파일처리의 완료, 네트워크 작업의 완료, 타이머 호출 등이 있다.

퀴즈 1.

setInterval(() => {
  // eslint-disable-next-line no-console
  console.log('Hey!');
  while (true) {}
}, 1000);

5초간 1번 찍힌다.

브라우저나 노드js에서나, web API 혹은 노드api 의 동작이 끝나면 콜백큐에 등록한다.
브라우저나 노드가 요청받은 일을 하고 있는 동안 메인스레드와 이벤트 루프는 영향을 받지않고 계속 실행된다.
이를 오프로딩이라고하며, 노드 서버의 메인 스레드가 하나임에도 불구하고 빠르게 동작할 수 있는 이유이다.
메인스레드가 오래 걸리는 일을 기다리지 않기 때문이다.

Hoising - var

  • hoising : 변수의 선언만 스코프의 맨위로 끌어들이는것.
  • function도 호이스팅의 대상이다.
  • 함수의 선언과 값의 초기화는 서로 다르다.
  • 함수는 선언만 하면 끝, 변수는 선언, 초기화 2개의 프로세스가 있음.

binding : js에서는 lexical scope 를 통해 바인딩이 이루어짐

  • 안쪽에서 바깥으로 하는 것.
  • 밖에서 안은 참조가 안됨.
  • var 은 블록 스코핑의 대상이 아니다.
  • 그러나 let, const는 블록 스코핑이 된다.
let x = 1;
if (true) {
  x += 1;
}
console.log(x); // 2

const y = 1;
if (true) {
  const y = 2;
}
console.log(y); // 1

var z = 1;
if (true) {
  var z = 2;
}
console.log(z); // 2

closure = function + environment

  • function이 하나 생길 때마다 하나씩 생긴다.
  • environment 는 함수 자신을 둘러싼, 접근할 수 있는 모든 스코프를 뜻한다.

Closure 의 예시

function and(x) {
  return function print(y) {
    return x + ' and ' + y;
  };
}

const saltAnd = and('salt');
console.log(saltAnd('pepper')); // salt and pepper
console.log(saltAnd('sugar')); // salt and sugar

salt가 바인딩 되어 있다.

and 함수로 만들어진 saltAnd의 클로져는:

  • 함수: print
  • 환경: x -> "salt"

closure는 higher-order function을 만드는 데 유용하다.

상속 Prototype

let, const

let과 const는 ES2015(ES6)에 추가된 변수 선언 키워드입니다.
hosting 규칙이 없고, block scoping을 지원한다. 따라서 var보다 훨씩 예측 가능한 코드를 짤수 있게 해준다.

var와 달리 let과 const는 변수를 정의하기 전에는 사용할 수 없다.
가능하면 const만 쓰고, 필요한 경우만 let, var은 절대 쓰지 말자! -> best practice

Spread syntax (...)

const user = {
  nickname: 'jerry',
  age: 22,
  email: 'djaflk@kadfnlk.com',
};

const { nickname, ...personalData } = user;
console.log(personalData); // { age: 22, email: 'djaflk@kadfnlk.com' }

const user = {
  nickname: 'jerry',
  age: 22,
  email: 'djaflk@kadfnlk.com',
};

const { nickname, ...personalData } = user;
console.log(personalData);

const arr = [1, 2, 3, 4, 5];

const [head, ...rest] = arr;
console.log(head, ...rest);
console.log(head, rest);

자바스크립트 스타일

Promise

  • promise 객체는 비동기 작업을 맞이할 미래의 완료 또는 실패와 그 결과값을 나타낸다.

polyfill

Core-js

transpile

optional-chaining

profile
이후띵's 개발일지

0개의 댓글