본문 바로가기
Node.js

Node.js 교과서 1주차

by WhoamixZerOne 2022. 5. 14.

첫 Node.js를 공부하면서 개인적으로 정리를 해보고자 작성...

인프런 강의 : [리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지

✔ Node.js

Node.js는 크롬의 V8 자바스크립트 엔진을 기반으로 하는 자바스크립트 런타임이다.
노드는 단일 스레드(Single Thread)와 이벤트 기반이고, 비동기 I/O 처리(Non-Blocking I/O) 모델이다.
그리고 NPM을 통해 방대한 모듈을 제공하고 있다.

✔ 호출 스택 동작

function oneMore() {
 console.log('one more');
}
function run() {
  console.log('run run');
  setTimeout(() => console.log('wow'), 0);
  new Promise(resolve => resolve('hi')).then(console.log);
  oneMore();
}
setTimeout(run, 3000);

위의 코드를 실행했을 때 실행 순서에 대해 먼저 얘기하자면,

  1. run run
  2. one more
  3. hi
  4. wow
    순으로 콘솔에 출력이 된다.
    동작 순서

    그림에서 번호는 동작 순서를 임의로 나타냈다. 그림에서는 함수가 스택에 계속 있는 것처럼 표현이 되었지만 원래는 함수가 마지막까지 실행이 되고 나면 스택에서 빠진다.
    그리고 setTimeout이 실행되면 run 콜백을 백그라운드로 보내고, 백그라운드에 들어간 순서와 상관없이 태스크 큐로 보내고, 이벤트 루프는 정해진 규칙에 따라 콜백 함수들을 다시 호출 스택으로 부른다.
    그런데 예외적으로 'Promise.then/catch'나 'process.nextTick'은 우선순위가 높아 큐에서 setTimeout보다 먼저 실행이 되게 된다.

이 내용을 알기 전에는 나는 wow, hi 순으로 출력이 되는 줄 알았다! :( 좋은 걸 알게 되었다!

✔ var, const, let

ES2015 이전에는 var로 변수를 선언했으나, ES2015부터는 const와 let이 대체되었고,
두 개의 가장 큰 차이점은 블록 스코프(var은 함수 스코프)이다.
var의 경우 if, for, while 등의 블록 스코프에는 영향을 미치지 못하고, 함수의 블록 스코프가 기준점이다.
const, let의 경우 함수 및 블록({})에도 별도의 스코프를 가진다.

if(true) {
 var x = 3;
}
console.log(x); // 3

if(true) {
 const a = 3; 
}
console.log(a); // Uncaught ReferenceError: a is not defined

function fn() {
 var b = 3; 
}
console.log(b); // Uncaught ReferenceError: b is not defined

또, var의 경우 변수 재선언이 가능하지만, const와 let은 변수 재선언이 불가능하다.
const와 let의 차이는 변수의 immutable 여부이다. let은 변수에 재할당이 가능하지만, const는 재할당이 불가능하다.
그래서 const를 상수화라고 하는데, 배열 혹은 객체의 키/값은 변경이 가능하다.(그래서 상수화라고 기억하기보단 대입 연산을 할 수 없다.라고 기억하는 게 좋을 것 같다.)

let a = 'test'
let a = 'test2' // Uncaught SyntaxError: Identifier 'a' has already been declared
a = 'test2'

const b = 'test'
const b = 'test2' // Uncaught SyntaxError: Identifier 'a' has already been declared
b = 'test2' // Uncaught TypeError: Assignment to constant variable

const c = {name: 'Alice'}
c.name = 'Chris'
c.age = 12

✔ ES6 단축 속성명

ES6의 단축 속성명(property shorthand)은 객체를 정의할 때 객체의 key와 value의 값이 같으면, 각각 표기하지 않고 한 번만 표기하는 것을 의미한다.

const a = 'test' b = 10, c = {};
const o = { a: a, b: b, c: c }; // 기존 코드
const o = { a, b, c }; // 단축 속성명(ES6)

✔ 구조 분해 할당

구조 분해 할당 구문은 배열이나 객체의 속성을 해체하여 그 값을 개별 변수에 담을 수 있게 하는 자바스크립트 표현식이다.

const [a, b] = [10, 20];
console.log(a); // 10
console.log(b); // 20

const [a, b, ...rest] = [10, 20, 30, 40, 50];
console.log(a); // 10
console.log(b); // 20
console.log(rest); // [30, 40, 50]

const [a, b, , , c] = [10, 20, 30, 40, 50];
console.log(a); // 10
console.log(b); // 20
console.log(c); // 50

let a = 10, b = 20;
[a, b] = [b, a];
console.log(a); // 20
console.log(b); // 10

const o = { a: 10, b: true };
const { a, b } = o;
console.log(a); // 10
console.log(b); // true

const { a, b } = { a: 10, b: 20 };
console.log(a); // 10
console.log(b); // 20

✔ require()

require는 모듈을 읽어 들일 때 사용한다.

  • resolve
  • main: Module
  • extensions
  • cache

require에는 위의 속성들이 존재하고, 노드 실행 시 처음에는 require.main에 파일을 읽어 들이면서 cache에 저장이 되고, 그 이후부터는 캐시에 저장된 것을 불러들인다.(require를 console.log로 확인 가능)



🔗 Reference

'Node.js' 카테고리의 다른 글

[NestJS] Configuration 설정 & TypeORM 연결  (0) 2023.05.31
Node.js 구조 & 동작 원리  (0) 2022.08.17
Node.js 교과서 4주차  (0) 2022.06.09
Node.js 교과서 3주차  (0) 2022.06.01
Node.js 교과서 2주차  (0) 2022.05.25

댓글