개인노트-인강
개인노트 정리 Node.js 백엔드 part 1-3
roroism
2023. 3. 21. 13:54
한 번에 끝내는 Node.js 웹 프로그래밍 초격차 패키지 백엔드 part 1
모던 JavaScript syntax
# 모던 JavaScript - 자바스크립트의 최근 변화, TC39, node
- 비영리 기구 Ecma International은 JavaScript를 포함한 다양한 기술 표준 정립을 목적으로 하는 단체입니다.
- 그 중 TC39 위원회(committee)는 자바스크립트(ECMAScript) 표준 제정을 담당합니다. https://tc39.es/
- 이 위원회에는 Microsoft, Google, Apple 등 웹 기술과 관계가 깊은 거대 기술 벤더들이 참여합니다.
- 대부분의 논의 내용이 Github 등 웹에 공개되어 있습니다.
## node.green
node.green 은 브라우저가 아닌 node에만 초점을 맞춰서 기능 개발이 어떻게 되어있는지를 확인할 수 있습니다.
node.green 에서 Node의 각 버전별로 지원하는 ECMAScript 기능을 확인할 수 있습니다.
# 모던 JavaScript - let 과 const
- let과 const는 ES2015(ES6)에 추가된 변수 선언 키워드입니다.
- hoisting 규칙이 없습니다.
- block scoping을 지원합니다.
- 따라서 var보다 훨씬 예측 가능한 코드를 짤 수 있게해 줍니다.
## let, const
- let은 레퍼런스가 바뀔 수 있고, const는 바뀔 수 없습니다.
## var와 let, const
- var 와는 달리 let 과 const 는 같은 스코프 내에서 같은 변수를 두 번 이상 정의할 수 없습니다.
- var와는 달리 let과 const는 변수를 정의하기 전에는 사용할 수 없습니다.
아래 예시
console.log(x); // undefined
var x = 0;
console.log(x); // ReferenceError: Cannot access 'x' before initialization
const x = 0;
- let과 const 모두 같은 scoping rule (block scoping)을 따릅니다.
아래 예시
var x = 1;
{
var x = 2
console.log(x); // 2
}
console.log(x); // 2
const x = 1;
{
const x = 2;
console.log(x); // 2
}
console.log(x); // 1
## var vs let, const 결론
- let 과 const 의 예측 가능성과 유지보수성이 var보다 훨씬 뛰어납니다.
- 가능하다면 const만 쓰고, 필요한 경우에 한해 let을 쓰고, var는 절대 쓰지 마세요!
# 모던 JavaScript - Spread syntax (...)
- ES2015 에서 새로 추가된 syntax입니다.
- 병합, 구조 분배 할당(destructuring) 등에 다양하게 활용할 수 있습니다.
## 활용법 - object merge (1)
두 개 이상의 object를 하나의 새로운 object로 만들기.
const personalData = {
nickname: 'JH',
email: 'jh12@email.com',
}
const publicData = {
age: 22,
}
const user = {
...personalData,
...publicData,
}
## 활용법 - object merge (2)
기존에 있던 값 덮어 씌우기.
const overrides = {
DATABASE_HOST: 'myhost.com',
DATABASE_PASSWORD: 'mypassword',
}
const config = {
DATABASE_HOST: 'default.host.com',
DATABASE_PASSWORD: '****',
DATABASE_USERNAME: 'myuser',
...overrides,
}
/* 결과
{
DATABASE_HOST: 'myhost.com',
DATABASE_PASSWORD: 'mypassword',
DATABASE_USERNAME: 'myuser',
}
*/
주의 - ...overrides가 뒤가 아닌 앞에 오게되면 덮어 씌워지지 않습니다.
## 활용법 - object rest (destructuring)
const user = {
nickname: 'JH',
age: 22,
email: 'jh12@example.com',
}
const { nickname, ...personalData } = user;
console.log(personalData); // { age: 22, email: 'jh12@Jexample.com' }
## 활용법 - array merge
object 뿐만 아니라 배열에도 사용될 수 있습니다.
const pets = ['dog', 'cat'];
const predators = ['wolf', 'cougar'];
const animals = [...pets, ...predators];
console.log(animals); // ['dog', 'cat', 'wolf', 'cougar']
## 활용법 - array rest
object 뿐만 아니라 배열에서도 destructuring을 사용할 수 있습니다.
const [head, ...rest] = [1, 2, 3];
console.log(head); // 1
console.log(rest); // [2, 3]
## 다양한 예시 및 활용
const ary = [1, 2, 3, 4, 5];
const [head, ...rest] = ary
console.log(head, ...rest); // 1 [2, 3, 4, 5]
console.log(head, ...rest); // 1 2 3 4 5
const personalData = {
email: 'abc@def.com',
password: '****',
}
const publicData = {
nickname: 'foo'
}
const user = {
...personalData,
...publicData,
}
// 각각에 있던 필드들이 하나로 합쳐져서 하나의 object가 되었습니다.
console.log(user); // { email: 'abc@def.com', password: '****', nickname: 'foo' }
const personalData = {
email: 'abc@def.com',
password: '****',
}
const publicData = {
nickname: 'foo'
}
const overrides = {
email: 'rrr@rrr.com'
}
// 같은 이름의 프로퍼티는 나중에 온 프로퍼티로 덮어씌우게 됩니다.
const user = {
...personalData,
...publicData,
...overrides,
}
// 각각에 있던 필드들이 하나로 합쳐져서 하나의 object가 되었습니다.
console.log(user); // { email: 'rrr@rrr.com', password: '****', nickname: 'foo' }
// 이렇게 사용될 일은 거의 없겠지만 아래처럼도 가능합니다.
const user = {
...{
email: 'abc@def.com',
password: '****',
},
...{
nickname: 'foo',
},
...{
email: 'rrr@rrr.com'
},
}
// 각각에 있던 필드들이 하나로 합쳐져서 하나의 object가 되었습니다.
console.log(user); // { email: 'rrr@rrr.com', password: '****', nickname: 'foo' }
// 위 코드를 좀 더 활용해 본다면..
const shouldOverride = false
// 삼항 연산자를 활용하여 조건부 spread syntax를 사용합니다.
const user = {
...{
email: 'abc@def.com',
password: '****',
},
...{
nickname: 'foo',
},
...(shouldOverride ? {
email: 'rrr@rrr.com'
} : null),
}
// shouldOverride가 false일 경우
console.log(user); // { email: 'abc@def.com', password: '****', nickname: 'foo' }
// shouldOverride가 true일 경우
console.log(user); // { email: 'rrr@rrr.com', password: '****', nickname: 'foo' }
// 이렇게 다양한 시나리오도 좀 더 알아보기 쉽게 커버가 가능합니다.
// function에서도 spread syntax를 똑같이 사용할 수 있습니다.
function foo(head, ...rest) {
console.log(head);
console.log(rest);
}
foo(1, 2, 3, 4);
// 1
// [2, 3, 4]