๐ํค์๋: ES2015+๋ฌธ๋ฒ, ํ์ดํ ํจ์, ํ๋ก๋ฏธ์ค(Promise), async/await, ๋๋ณํฉ/์ต์
๋ ์ฒด์ด๋
- 2015๋
์ ๊ธฐ์ ์ผ๋ก ๋งค๋
๋ฌธ๋ฒ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ฐํ๋์๋ค.
- ES2015 ์ด์์ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ํตํ์ด ES2015+๋ผ ํํํ๋ค.
- ์ค๋ฌด์์๋ ๋๋ถ๋ถ ์ต์ ๋ฌธ๋ฒ์ ์ฌ์ฉํ๋ฏ๋ก ์๋ฐ์คํฌ๋ฆฝํธ ๊ธฐ๋ณธ ๋ฌธ๋ฒ๋ถํฐ ์ตํ ํ์๊ฐ ์๋ค.
1-1. const, let
- var ๋ณ์๋ const์ let์ผ๋ก ๋์ฒดํ๋ค
if (true) {
var x = 3;
}
console.log(x); // 3
if (true) {
const y = 3;
}
console.log(y); // Uncaught ReferenceError: y is not defined
โ var์ const, let์ ์ฐจ์ด
var: ํจ์ ์ค์ฝํ๋ฅผ ๊ฐ์ง๋ฉฐ, if๋ฌธ์ ๋ธ๋ก๊ณผ ๊ด๊ณ์์ด ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
const, let: ๋ธ๋ก ์ค์ฝํ๋ฅผ ๊ฐ์ง๋ฉฐ, ๋ธ๋ก ๋ฐ์ ๋ณ์์ ์ ๊ทผ์ด ๋ถ๊ฐํ๋ค.
โด ํจ์ ์ค์ฝํ ๋์ ๋ธ๋ก ์ค์ฝํ๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ ํธ์ด์คํ
๊ณผ ๊ฐ์ ๋ฌธ์ ๋ ํด๊ฒฐํ๊ณ , ์ฝ๋ ๊ด๋ฆฌ๋ ์์ํ๋ค.
โก const์ let์ ์ฐจ์ด
const(์์): ๊ฐ์ ํ ๋ฒ ํ ๋นํ๋ฉด ๋ค๋ฅธ ๊ฐ์ ํ ๋นํ ์ ์๋ค, ์ด๊ธฐํํ ๋ ๊ฐ์ ํ ๋นํ์ง ์์ผ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
const a = 0;
a = 1; // Uncaught TypeError: Assignment to constant variable
let b = 0;
b = 1; // 1
const c; // Uncaught SyntaxError: Missing initializer in const declaration
1-2. ํ
ํ๋ฆฟ ๋ฌธ์์ด
- ํฐ๋ฐ์ดํ, ์์๋ฐ์ดํ๋ก ๊ฐ์ธ๋ ๊ธฐ์กด ๋ฌธ์์ด๊ณผ ๋ค๋ฅด๊ฒ ๋ฐฑํฑ(`)์ผ๋ก ๊ฐ์ ์ ์์ผ๋ฉฐ, ๋ฌธ์์ด ์์ ๋ณ์๋ฅผ ๋ฃ์ ์ ์๋ค.
- ${๋ณ์}ํ์์ผ๋ก ๋ณ์๋ฅผ + ๊ธฐํธ ์์ด ๋ฌธ์์ด์ ๋ฃ์ ์ ์๋ค.
const num3 = 1;
const num4 = 2;
const result2 = 3;
const string2 = `${num3} ๋ํ๊ธฐ ${num4}๋ ' ${result2}'`;
console.log(string2); // 1 ๋ํ๊ธฐ 2๋ '3'
1-3. ๊ฐ์ฒด ๋ฆฌํฐ๋ด
var sayNode = function() {
console.log('Node');
};
var es = 'ES';
var oldObject = {
sayJS: function() {
console.log('JS');
},
sayNode: sayNode,
};
oldObject[es + 6] = 'Fantastic';
oldObject.sayNode(); // Node
oldObject.sayJS(); // JS
console.log(oldObject.ES6); // Fantastic
const newObject = {
sayJS() {
console.log('JS');
},
sayNode,
[es + 6]: 'Fantastic',
};
newObject.sayNode(); // Node
newObject.sayJS(); // JS
console.log(newObject.ES6); // Fantastic
- ๊ฐ์ฒด์ ๋ฉ์๋์ ํจ์๋ฅผ ์ฐ๊ฒฐํ ๋ ์ฝ๋ก (:)๊ณผ function์ ๋ถ์ด์ง ์์๋ ๋๋ค.
- ์์ฑ๋ช
๊ณผ ๋ณ์๋ช
์ด ๋์ผํ ๊ฒฝ์ฐ ํ ๋ฒ๋ง ์จ๋ ๋๋ค. (์ฝ๋์ ์ค๋ณต์ ํผํ ์ ์์ด ํธ๋ฆฌํ๋ค.)
- ES6๋ผ๋ ์์ฑ๋ช
์ ์ํด ๊ฐ์ฒด ๋ฆฌํฐ๋ด(oldObject) ๋ฐ์์ [es+6]์ ํ ํ์ ์์ด, newObject์์ [es+6]์ด ์์ฑ๋ช
์ผ๋ก ๋ฐ๋ก ์ฌ์ฉ๋๋ฉฐ ๊ฐ์ฒด ๋ฆฌํฐ๋ด ์์ ๋์ ์์ฑ ์ ์ธ ๊ฐ๋ฅํ๋ค.
โด ์ต์ํด์ง๋ฉด ์ฝ๋์ ์์ ๋ง์ด ์ค์ผ ์ ์๋ค.
1-4. ํ์ดํ ํจ์(arrow function)
โ ํ์ดํ ํจ์์ ๊ธฐ๋ณธ์ ์ธ ํํ
function add1(x, y) {
return x + y;
}
const add2 = (x, y) => {
return x + y;
};
const add3 = (x, y) => x + y;
const add4 = (x, y) => (x + y);
function not1(x) {
return !x;
}
const not2 = x => !x;
- function ์ ์ธ ๋์ => ๊ธฐํธ๋ก ํจ์๋ฅผ ์ ์ธํ๋ค.
- ๋ณ์์ ๋์
ํ๋ฉด ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
- ๋ด๋ถ์ return๋ฌธ ๋ฐ์ ์๋ ๊ฒฝ์ฐ, return๋ฌธ์ ์ค์ผ ์ ์๋ค. (์์ฃผ ์ฌ์ฉํ๋ ๋ฐฉ์์ด๋ค.)
โก this ๋ฐ์ธ๋ ๋ฐฉ์์ ๋ณํ
var relationship1 = {
name: 'zero',
friends: ['nero', 'hero', 'xero'],
logFriends: function () {
var that = this; // relationship1์ ๊ฐ๋ฆฌํค๋ this๋ฅผ that์ ์ ์ฅ
this.friends.forEach(function (friend) {
console.log(that.name, friend);
});
},
};
relationship1.logFriends();
const relationship2 = {
name: 'zero',
friends: ['nero', 'hero', 'xero'],
logFriends() {
this.friends.forEach(friend => {
console.log(this.name, friend);
});
},
};
relationship2.logFriends();
- relationship1: ๊ฐ์ ๋ค๋ฅธ ํจ์ ์ค์ฝํ์ this๋ฅผ ๊ฐ์ง๋ฏ๋ก that์ด๋ผ๋ ๋ณ์๋ฅผ ํตํด relationship1์ ๊ฐ์ ์ ์ผ๋ก ์ ๊ทผํ๋ค.
- relationship2: ํ์ดํ ํจ์๋ฅผ ์ด์ฉํ๋ฏ๋ก์จ ๋ฐ๊นฅ ์ค์ฝํ์ธ logFriends()์ this๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
1-5. ๊ตฌ์กฐ๋ถํด ํ ๋น
var candyMachine = {
status: {
name: 'node',
count: 5,
},
getCandy: function () {
this.status.count--;
return this.status.count;
},
};
var getCandy = candyMachine.getCandy;
var count = candyMachine.status.count;
const candyMachine = {
status: {
name: 'node',
count: 5,
},
getCandy() {
this.status.count--;
return this.status.count;
},
};
const { getCandy, status: { count } } = candyMachine;
๊ฐ์ฒด ์์ ์์ฑ์ ์ฐพ์ ๋ณ์์ ๋งค์นญํ๋ฉฐ, count์ฒ๋ผ ์ฌ๋ฌ ๋จ๊ณ ์์ ์์ฑ๋ ์ฐพ์ ์ ์๋ค.
cf) ๋ฐฐ์ด์ ๋ํ ๊ตฌ์กฐ ๋ถํด ํ ๋น ๋ฌธ๋ฒ
const array = [โnodejsโ, {}, 10, true];
const [node, obj, , bool] = array;
- ๋
ธ๋๋ ๋ชจ๋ ์์คํ
์ ์ด์ฉํ๋ฏ๋ก ์์ฃผ ์ฌ์ฉ๋๋ ๋ฐฉ์์ด๋ค.
1-6. ํด๋์ค
- ํด๋์ค ๋ฌธ๋ฒ์ด ์ถ๊ฐ๋์์ง๋ง, ํด๋์ค ๊ธฐ๋ฐ์ด ์๋ ํ๋กํ ํ์
๊ธฐ๋ฐ์ผ๋ก ๋์ํ๋ค.
- ๋ณด๊ธฐ ์ข๊ฒ ํ๋กํ ํ์
๊ธฐ๋ฐ ๋ฌธ๋ฒ์ ํด๋์ค๋ก ๋ฐ๊พผ ๊ฒ์ด๋ค.
class Human {
constructor(type = 'human') {
this.type = type;
}
static isHuman(human) {
return human instanceof Human;
}
breathe() {
alert('h-a-a-a-m');
}
}
class Zero extends Human {
constructor(type, firstName, lastName) {
super(type);
this.firstName = firstName;
this.lastName = lastName;
}
sayName() {
super.breathe();
alert(`${this.firstName} ${this.lastName}`);
}
}
const newZero = new Zero('human', 'Zero', 'Cho');
Human.isHuman(newZero); // true
1-7. ํ๋ก๋ฏธ์ค(Promise)
- ES2015๋ถํฐ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋
ธ๋์ API๋ค์ด ์ฝ๋ฐฑ ๋์ ํ๋ก๋ฏธ์ค ๊ธฐ๋ฐ์ผ๋ก ์ฌ๊ตฌ์ฑ๋์๋ค.
- ์ฝ๋ฐฑ ์ง์ฅ์ ํด๊ฒฐํ์๋ค.
โ ๊ธฐ๋ณธ์ ์ธ Promise ํํ
const condition = true; // true์ด๋ฉด resolve, false์ด๋ฉด reject
const promise = new Promise((resolve, reject) => {
if (condition) {
resolve('์ฑ๊ณต');
} else {
reject('์คํจ');
}
});
// ๋ค๋ฅธ ์ฝ๋๊ฐ ๋ค์ด๊ฐ ์ ์์
promise
.then((message) => {
console.log(message); // ์ฑ๊ณต(resolve)ํ ๊ฒฝ์ฐ ์คํ
})
.catch((error) => {
console.error(error); // ์คํจ(reject)ํ ๊ฒฝ์ฐ ์คํ
})
.finally(() => { // ๋๋๊ณ ๋ฌด์กฐ๊ฑด ์คํ
console.log('๋ฌด์กฐ๊ฑด');
});
- new Promise๋ก ํ๋ก๋ฏธ์ค๋ฅผ ์์ฑํ ํ, resolve, reject๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๊ฐ๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ๋ฃ๋๋ค.
- ๋ง๋ค์ด์ง promise ๋ณ์์ ๋ถ์ธ then, catch ๋ฉ์๋๋ฅผ ํตํด ์คํ์ด ์๋ฃ๋ ํ ๊ฒฐ๊ด๊ฐ์ ๋ฐ๋๋ค.
- Promise๋ ์คํ์ ๋ฐ๋ก ํ๋, ๊ฒฐ๊ด๊ฐ์ ๋์ค์ ๋ฐ๋ ๊ฐ์ฒด์ด๋ค. (new Promise๋ ๋ฐ๋ก ์คํ๋๋, ๊ฒฐ๊ด๊ฐ์ then์ ๋ถ์์ ๋ ๋ฐ๋๋ค.)
โก ํ๋ก๋ฏธ์ค return, ์ฌ๋ฌ ๊ฐ์ then๊ณผ catch
promise
.then((message) => {
return new Promise((resolve, reject) => {
resolve(message);
});
})
.then((message2) => {
console.log(message2);
return new Promise((resolve, reject) => {
resolve(message2);
});
})
.then((message3) => {
console.log(message3);
})
.catch((error) => {
console.error(error);
});
- then์ด๋ catch์์ ๋ค์ ๋ค๋ฅธ then์ด๋ catch๋ฅผ ๋ถ์ผ ์๋ ์๋ค. (์ด์ then์ return ๊ฐ์ ๋ค์ then์ ๋งค๊ฐ๋ณ์๋ก ๊ฐ์ง๋ค.)
- ํ๋ก๋ฏธ์ค๋ฅผ returnํ ๊ฒฝ์ฐ, ํ๋ก๋ฏธ์ค๊ฐ ์ํ๋ ํ ๋ค์ then์ด๋ catch๊ฐ ํธ์ถ๋๋ค.
- then์์ new Promise๋ฅผ return ํด์ผ ๋ค์ then์์ ๋ฐ์ ์ ์๋ค.
โข ์ค์ฒฉ๋ ์ฝ๋ฐฑํจ์๋ฅผ ํ๋ก๋ฏธ์ค๋ก ๋ณ๊ฒฝ
function findAndSaveUser(Users) {
Users.findOne({})
.then((user) => {
user.name = 'zero';
return user.save();
})
.then((user) => {
return Users.findOne({ gender: 'm' });
})
.then((user) => {
// ์๋ต
})
.catch(err => {
console.error(err);
});
- then ๋ฉ์๋๊ฐ ์์ฐจ์ ์ผ๋ก ์คํ๋๋ค.
- ์ฝ๋ฐฑ์์ ๋งค๋ฒ ๋ฐ๋ก ์ฒ๋ฆฌ๊ฐ ํ์ํ๋ ์๋ฌ๋ ๋ง์ง๋ง catch์์ ํ ๋ฒ์ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค.
- ๋ฉ์๋๊ฐ ํ๋ก๋ฏธ์ค ๋ฐฉ์์ ์ง์ํ ๋๋ง ์ฝ๋ฐฑํจ์๋ฅผ ํ๋ก๋ฏธ์ค๋ก ๋ฐ๊ฟ ์ ์๋ค.
cf) ์ ์ฝ๋์์๋ findOne๊ณผ save ๋ฉ์๋๊ฐ ๋ด๋ถ์ ์ผ๋ก ํ๋ก๋ฏธ์ค ๊ฐ์ฒด๋ฅผ ๊ฐ๊ณ ์๋ค๊ณ ๊ฐ์ ํ๊ธฐ์ ๊ฐ๋ฅํ๋ค.
โฃ Promise.all: ํ๋ก๋ฏธ์ค ์ฌ๋ฌ ๊ฐ๋ฅผ ํ ๋ฒ์ ์คํ
const promise1 = Promise.resolve('์ฑ๊ณต1');
const promise2 = Promise.resolve('์ฑ๊ณต2');
Promise.all([promise1, promise2])
.then((result) => {
console.log(result); // ['์ฑ๊ณต1', '์ฑ๊ณต2'];
})
.catch((error) => {
console.error(error);
});
- Promise.resolve: ์ฆ์ resolveํ๋ ํ๋ก๋ฏธ์ค๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ด๋ค.
- Promise.reject: ์ฆ์ rejectํ๋ ํ๋ก๋ฏธ์ค๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ด๋ค.
- Promise.all: ๋ชจ๋ resolve๋ ๋๊น์ง ๊ธฐ๋ค๋ ธ๋ค๊ฐ then์ผ๋ก ๋์ด๊ฐ๋ฉฐ, result ๋งค๊ฐ๋ณ์์ ๊ฐ๊ฐ์ ํ๋ก๋ฏธ์ค ๊ฒฐ๊ด๊ฐ์ด ๋ฐฐ์ด๋ก ์ ์ฅ๋๋ค.
- Promise.all: ํ๋๋ผ๋ reject๋๋ฉด catch๋ก ๋์ด๊ฐ๋ฉฐ, ์ด๋ค ํ๋ก๋ฏธ์ค๊ฐ reject๋ ์ง๋ ์ ์ ์๋ค. (์๊ธฐ ์ํด์๋ Promise.allSettled ์ฌ์ฉ์ด ํ์ํ๋ค.)
โค Promise.allSettled
const promise1 = Promise.resolve('์ฑ๊ณต1');
const promise2 = Promise.reject('์คํจ2');
const promise3 = Promise.resolve('์ฑ๊ณต3');
Promise.allSettled([promise1, promise2, promise3])
.then((result) => {
console.log(result);
/* [
* { status: 'fulfilled', value: '์ฑ๊ณต1' },
* { status: 'rejected', reason: '์คํจ2' },
* { status: 'fulfilled', value: '์ฑ๊ณต3' }
* ]
*/
})
.catch((error) => {
console.error(error);
});
- ์ด๋ค ํ๋ก๋ฏธ์ค๊ฐ reject๋ ์ง ์๊ธฐ ์ํด Promise.allsettled๋ฅผ ์ฌ์ฉํ๋ค. (status์์ ์ ์ ์๋ค, reason์ ์คํจ ์ด์ )
- Promise.all ๋์ Promise.allSettled๋ฅผ ์ฌ์ฉํ๊ธธ ๊ถ์ฅํ๋ค.
cf) Node 16๋ฒ์ ๋ถํฐ๋ reject๋ Promise์ catch๋ฅผ ๋ฌ์ง ์์ผ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋ฏ๋ก (๋ค์ ์ฝ๋ ์คํ ๋ถ๊ฐ), ๋ฐ๋์ catch ๋ฉ์๋๋ฅผ ๋ถ์ด๋ ๊ฒ ๊ถ์ฅํ๋ค.
1-8. async/await
- ํ๋ก๋ฏธ์ค๋ฅผ ์ฌ์ฉํ ์ฝ๋๋ฅผ ํ ๋ฒ ๋ ๊น๋ํ๊ฒ ์ค์ผ ์ ์๋ค.
โ async/await๋ฅผ try/catch๋ฌธ๊ณผ ํ์ดํ ํจ์๋ก ํํ
const findAndSaveUser = async (Users) => {
try {
let user = await Users.findOne({});
user.name = 'zero';
user = await user.save();
user = await Users.findOne({ gender: 'm' });
// ์๋ต
} catch (error) {
console.error(error);
}
};
- ํจ์ ์ ์ธ๋ฌธ ๋์ async function์ผ๋ก ์ ์ธํ๋ค. (์ ์ฝ๋๋ ํ์ดํ ํจ์๋ก ํํ)
- await Users. findeOne({})์ด resolve๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ ๋ค user ๋ณ์๋ฅผ ์ด๊ธฐํํ๋ค.
- try/catch๋ฌธ์ผ๋ก ์๋ฌ๋ฅผ ์ฒ๋ฆฌํ๋ค.
โก for๋ฌธ๊ณผ ํจ๊ป ์์ฐจ์ ์คํ (๋
ธ๋ 10 ๋ฒ์ ๋ถํฐ ์ง์ํ๋ ES2018 ๋ฌธ๋ฒ)
const promise1 = Promise.resolve('์ฑ๊ณต1');
const promise2 = Promise.resolve('์ฑ๊ณต2');
(async () => {
for await (promise of [promise1, promise2]) {
console.log(promise);
}
})();
- for await of๋ฌธ์ ์ด์ฉํด ํ๋ก๋ฏธ์ค ๋ฐฐ์ด์ ์ํํ๋ค.
- async ํจ์์ ๋ฐํ๊ฐ์ ํญ์ Promise๋ก ๊ฐ์ธ์ง๋ค.
- ์คํ ํ then์ ๋ถ์ด๊ฑฐ๋ ๋ ๋ค๋ฅธ asyncํจ์ ์์์ await๋ฅผ ๋ถ์ฌ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค.
1-9. map/set
โ map
const m = new Map();
m.set('a', 'b'); // set(ํค, ๊ฐ)์ผ๋ก Map์ ์์ฑ ์ถ๊ฐ
m.set(3, 'c'); // ๋ฌธ์์ด์ด ์๋ ๊ฐ์ ํค๋ก ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค
const d = {};
m.set(d, 'e'); // ๊ฐ์ฒด๋ ๋ฉ๋๋ค
m.get(d); // get(ํค)๋ก ์์ฑ๊ฐ ์กฐํ
console.log(m.get(d)); // e
m.size; // size๋ก ์์ฑ ๊ฐ์ ์กฐํ
console.log(m.size) // 3
for (const [k, v] of m) { // ๋ฐ๋ณต๋ฌธ์ ๋ฐ๋ก ๋ฃ์ด ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค
console.log(k, v); // 'a', 'b', 3, 'c', {}, 'e'
} // ์์ฑ ๊ฐ์ ์์๋ ๋ณด์ฅ๋ฉ๋๋ค
m.forEach((v, k) => { // forEach๋ ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค
console.log(k, v); // ๊ฒฐ๊ณผ๋ ์์ ๋์ผ
});
m.has(d); // has(ํค)๋ก ์์ฑ ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค
console.log(m.has(d)); // true
m.delete(d); // delete(ํค)๋ก ์์ฑ์ ์ญ์ ํฉ๋๋ค
m.clear(); // clear()๋ก ์ ๋ถ ์ ๊ฑฐํฉ๋๋ค
console.log(m.size); // 0
- map์ ๊ฐ์ฒด์ ๋น์ทํ ์๋ฃ๊ตฌ์กฐ์ด๋, ์ผ๋ฐ ๊ฐ์ฒด์๋ ๋ค๋ฅด๋ค.
(์: ์์ฑ๋ค ๊ฐ์ ์์๋ฅผ ๋ณด์ฅํ๋ค, ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉ ํ ์ ์๋ค, ์์ฑ๋ช
์ผ๋ก ๋ฌธ์์ด์ด ์๋ ๊ฐ์ ์ฌ์ฉํ ์ ์๋ค, size ๋ฉ์๋๋ฅผ ํตํด ์์ฑ์ ์๋ฅผ ์ฝ๊ฒ ์ ์ ์๋ค.)
โก set
const s = new Set();
s.add(false); // add(์์)๋ก Set์ ์ถ๊ฐํฉ๋๋ค
s.add(1);
s.add('1');
s.add(1); // ์ค๋ณต์ด๋ฏ๋ก ๋ฌด์๋ฉ๋๋ค
s.add(2);
console.log(s.size); // ์ค๋ณต์ด ์ ๊ฑฐ๋์ด 4
s.has(1); // has(์์)๋ก ์์ ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค
console.log(s.has(1)); // true
for (const a of s) {
console.log(a); // false 1 '1' 2
}
s.forEach((a) => {
console.log(a); // false 1 '1' 2
})
s.delete(2); // delete(์์)๋ก ์์๋ฅผ ์ ๊ฑฐํฉ๋๋ค
s.clear(); // clear()๋ก ์ ๋ถ ์ ๊ฑฐํฉ๋๋ค
- set์ ๋ฐฐ์ด๊ณผ ๋น์ทํ ์๋ฃ๊ตฌ์กฐ์ด๋ค.
- ์ค๋ณต์ ํ์ฉํ์ง ์์ผ๋ฏ๋ก ์ค๋ณต์ ํ์ฉํ์ง ์๋ ๋ฐฐ์ด ์๋ฃ๊ตฌ์กฐ์ ์ฌ์ฉ๋๋ค.
- ๊ธฐ์กด ๋ฐฐ์ด์์ ์ค๋ณต ์ ๊ฑฐ์๋ ์ด์ฉ๋๋ค.
cf) new Set(๋ฐฐ์ด): ๋ฐฐ์ด์ ์ค๋ณต ์ ๊ฑฐ, Array.from(Set): Set์ ๋ฐฐ์ด๋ก ๋๋๋ฆผ
1-10. ๋ ๋ณํฉ/์ต์
๋ ์ฒด์ด๋
โ ๋ ๋ณํฉ ์ฐ์ฐ์ ??
const c = 0;
const d = c ?? 3; // ?? ์ฐ์ฐ์๋ null๊ณผ undefined์ผ ๋๋ง ๋ค๋ก ๋์ด๊ฐ
console.log(d); // 0;
const e = null;
const f = e ?? 3;
console.log(f); // 3;
const g = undefined;
const h = g ?? 3;
console.log(h); // 3;
- || ์ฐ์ฐ์ ๋์ฉ์ผ๋ก ์ฌ์ฉ๋๋ค.
- falsy๊ฐ ์ค null๊ณผ undefined๋ง ๋ฐ๋ก ๊ตฌ๋ถํ๋ค.
โก ์ต์
๋ ์ฒด์ด๋ ์ฐ์ฐ์ ?
const a = {}
a.b; // a๊ฐ ๊ฐ์ฒด์ด๋ฏ๋ก ๋ฌธ์ ์์
const c = null;
try {
c.d;
} catch (e) {
console.error(e); // TypeError: Cannot read properties of null (reading 'd')
}
c?.d; // ๋ฌธ์ ์์
try {
c.f();
} catch (e) {
console.error(e); // TypeError: Cannot read properties of null (reading 'f')
}
c?.f(); // ๋ฌธ์ ์์
try {
c[0];
} catch (e) {
console.error(e); // TypeError: Cannot read properties of null (reading '0')
}
c?.[0]; // ๋ฌธ์ ์์
- null๊ณผ undefined์ ์์ฑ์ ์กฐํํ๋ ๊ฒฝ์ฐ ์๋ฌ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ ๋ง๋๋ค.
- ์ผ๋ฐ์ ์ธ ์์ฑ๋ฟ๋ง ์๋๋ผ ํจ์ ํธ์ถ์ด๋ ๋ฐฐ์ด ์์ ์ ๊ทผ์ ๋ํด์๋ ์๋ฌ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์๋ค.
- c?, .d, c?.f(), c?.[0]์ ๊ฐ์ undefined์ด๋ค.
- HTML์์ script ํ๊ทธ ์์ ์์ฑํ๋ ๋ถ๋ถ์์ ์ฌ์ฉ๋๋ค.
2-1. AJAX
- ๋น๋๊ธฐ์ ์น ์๋น์ค๋ฅผ ๊ฐ๋ฐํ ๋ ์ฌ์ฉํ๋ ๊ธฐ๋ฒ์ด๋ค.
- ํ์ด์ง ์ ํ ์์ด ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ ์น ์ฌ์ดํธ์ ๋๋ถ๋ถ์ AJAX ๊ธฐ์ ์ ์ฌ์ฉํ๋ค.
โ GET ์์ฒญ ์ด์ฉ
axios.get('https://www.zerocho.com/api/get')
.then((result) => {
console.log(result);
console.log(result.data); // {}
})
.catch((error) => {
console.error(error);
});
- axios.get์ ๋ด๋ถ์ newPromise๊ฐ ์กด์ฌํ๋ฏ๋ก, then๊ณผ catch๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฐ๋ฅ ํ๋ค.
(async () => {
try {
const result = await axios.get('https://www.zerocho.com/api/get');
console.log(result);
console.log(result.data); // {}
} catch (error) {
console.error(error);
}
})();
- ํ๋ก๋ฏธ์ค์ด๋ฏ๋ก async/await ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ๋ค.
โก POST ์์ฒญ ์ด์ฉ
(async () => {
try {
const result = await axios.post('https://www.zerocho.com/api/post/json', {
name: 'zerocho',
birth: 1994,
});
console.log(result);
console.log(result.data);
} catch (error) {
console.error(error);
}
})();
- ๋ฐ์ดํฐ๋ฅผ ์๋ฒ๋ก ๋ณด๋ผ ์ ์๋ค.
- GET ์์ฒญ์ด๋ฉด axios.get, POST์์ฒญ์ด๋ฉด axios.post ์ฌ์ฉํ๋ค.
2-2. FormData
- HTML form ํ๊ทธ์ ๋ฐ์ดํฐ๋ฅผ ๋์ ์ ์ดํ๋ ๊ธฐ๋ฅ์ด๋ค.
โ FormData ์์ฑ์๋ก formData ๊ฐ์ฒด๋ฅผ ๋ง๋ ๋ค.
const formData = new FormData();
//append ๋ฉ์๋: ํค-๊ฐ ํ์์ ๋ฐ์ดํฐ ์ ์ฅ, ํค ํ๋์ ์ฌ๋ฌ ๊ฐ์ ๊ฐ ์ถ๊ฐ ๊ฐ๋ฅ
formData.append('name', 'zerocho');
formData.append('item', 'orange');
formData.append('item', 'melon');
//has ๋ฉ์๋: ์ฃผ์ด์ง ํค์ ํด๋นํ๋ ๊ฐ์ด ์๋์ง ์ฌ๋ถ
formData.has('item'); // true
formData.has('money'); // false;
//get ๋ฉ์๋: ์ฃผ์ด์ง ํค์ ํด๋นํ๋ ๊ฐ ํ๋๋ฅผ ๊ฐ์ ธ์ด
formData.get('item');// orange
//getAll ๋ฉ์๋: ํด๋นํ๋ ๋ชจ๋ ๊ฐ์ ๊ฐ์ ธ์ด
formData.getAll('item'); // ['orange', 'melon'];
formData.append('test', ['hi', 'zero']);
formData.get('test'); // hi, zero
//delete ๋ฉ์๋: ํ์ฌ ํค๋ฅผ ์ ๊ฑฐ
formData.delete('test');
formData.get('test'); // null
//set ๋ฉ์๋: ํ์ฌ ํค๋ฅผ ์์
formData.set('item', 'apple');
formData.getAll('item'); // ['apple'];
โก axios๋ก ํผ ๋ฐ์ดํฐ๋ฅผ ์๋ฒ์ ์ ์กํ๋ค.
(async () => {
try {
const formData = new FormData();
formData.append('name', 'zerocho');
formData.append('birth', 1994);
const result = await axios.post('https://www.zerocho.com/api/post/formdata', formData);
console.log(result);
console.log(result.data);
} catch (error) {
console.error(error);
}
})();
2-3. encodeURIComponent, decodeURIComponent
โ encodeURIComponent
- window ๊ฐ์ฒด์ ๋ฉ์๋ ์ค ํ๋์ด๋ค.
- ์ฃผ์์ ํ๊ธ์ด ๋ค์ด๊ฐ๋ ๊ฒฝ์ฐ, ์๋ฒ๊ฐ ํ๊ธ ์ฃผ์๋ฅผ ์ดํดํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ค.
(async () => {
try {
const result = await axios.get(`https://www.zerocho.com/api/search/${encodeURIComponent('๋
ธ๋')}`);
console.log(result);
console.log(result.data); // {}
} catch (error) {
console.error(error);
}
})();
- '๋
ธ๋'๋ผ๋ ํ๊ธ ์ฃผ์๊ฐ ' %EB%85%B8%EB%93%9C'๋ก ๋ณํ๋๋ค.
โก decodeURIComponent
decodeURIComponent('%EB%85%B8%EB%93%9C'); // ๋
ธ๋
- ๋ฐ๋ ์ชฝ์์ ์ฌ์ฉํ๋ฉด ํ๊ธ์ด ์๋ ์ํ๋ก ๋ณต๊ตฌ๋๋ค.
2-4. ๋ฐ์ดํฐ ์์ฑ๊ณผ dataset
- ๋ฐ์ดํฐ ์์ฑ: ๋ณด์๊ณผ ๊ด๋ จ ์๋ ๋ฐ์ดํฐ๋ค์ HTML๊ณผ ๊ด๋ จ๋ ๋ฐ์ดํฐ์ ์ ์ฅํ๋ ๊ณต์์ ์ธ ๋ฐฉ๋ฒ์ด๋ค.
<ul>
//HTML ํ๊ทธ์ ์์ฑ์ผ๋ก data-๋ก ์์ํ๋ ๊ฒ๋ค์ ๋ฃ์ (๋ฐ์ดํฐ ์์ฑ)
<li data-id="1" data-user-job="programmer">Zero</li>
<li data-id="2" data-user-job="designer">Nero</li>
<li data-id="3" data-user-job="programmer">Hero</li>
<li data-id="4" data-user-job="ceo">Kero</li>
</ul>
<script>
console.log(document.querySelector('li').dataset);
//dataset ์์ฑ์ ํตํด ์ฒซ ๋ฒ์งธ li ํ๊ทธ์ ๋ฐ์ดํฐ ์์ฑ์ ์ ๊ทผ
// { id: '1', userJob: 'programmer' } (๋ฐ์ดํฐ ์์ฑ์ ์ด๋ฆ์ด ์กฐ๊ธ์ฉ ๋ณํ๋จ)
</script>
- ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์ฝ๊ฒ ์ ๊ทผ ๊ฐ๋ฅํ๋ค๋ ์ฅ์ ์ด ์๋ค.
cf) ๋ฐ๋๋ก dataset์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด๋ HTML ํ๊ทธ์ ๋ฐ์๋๋ค.
(์: dataset.monthSalary=10000; ์ ๋ฃ์ผ๋ฉด data-month-salary="10000" ์์ฑ์ด ์๊ธด๋ค.)
quiz
1. ES2015+๋ฌธ๋ฒ์์, ( )๋ณ์๋ ( )๋ณ์์ ( )๋ณ์๋ก ๋ฐ๊พธ์ด ์ฌ์ฉํ๋ค.
2. ( ) ๋ฌธ๋ฒ์ด ์ถ๊ฐ๋์์ง๋ง, ( )๊ธฐ๋ฐ์ผ๋ก ๋์ํ๋ค.
3. Promise๋ ( )์ ๋ฐ๋ก ํ์ง๋ง, ( )์ ๋์ค์ ๋ฐ๋ ๊ฐ์ฒด์ด๋ค.
4. then์ด ์ฌ๋ฌ ๊ฐ ์๋ Promise๋ฌธ์ ๊ฒฝ์ฐ, then์์ new Promise๋ฅผ ( )ํด์ผ ๋ค์ then์ด ๊ฐ์ ์ ๋ฌ๋ฐ๋๋ค.
5. ( )์ ์ด๋ค ํ๋ก๋ฏธ์ค๊ฐ reject๋ ์ง ์ ์ ์์ผ๋ฉฐ, ์๊ธฐ ์ํด์๋ ( )์ ์ฌ์ฉ์ด ํ์ํ๋ค.
6. ( )์ ๋ฐฐ์ด๊ณผ ๋น์ทํ ์๋ฃ๊ตฌ์กฐ์ด๊ณ , ( )์ ํ์ฉํ์ง ์๋๋ค.
7. ๋ ์ต์
๋ ์ฐ์ฐ์ ( )์ falsy๊ฐ ์ค ( )๊ณผ ( )๋ง ๋ฐ๋ก ๊ตฌ๋ถํ๋ค.
programming quiz
8. ๋ค์๊ณผ ๊ฐ์ Promise๋ฅผ ์ฌ์ฉํ ์ซ์ ๋น๊ต ํจ์๊ฐ ์๋ค. ์ด ๋, async/await๋ฅผ ์ด์ฉํ compareNumbersAsync๋ผ๋ ์ด๋ฆ์ ์ซ์ ๋น๊ต ํจ์๋ฅผ ๋ง๋ค์ด, ์ฑ๊ณตํ์ ๋์ ์คํจํ์ ๋์ ๊ฐ์ด ๊ฐ๊ฐ ์ถ๋ ฅ๋ ์ ์๋๋ก ํ๋ ์ฝ๋๋ฅผ ์์ฑํ์์ค. (๋จ, try/catch๋ฌธ์ ์ด์ฉํ๋ค.)
function compareNumbers(a, b) {
return new Promise((resolve, reject) => {
if (a > b) {
resolve("์ฑ๊ณต!"); // ์ฒซ ๋ฒ์งธ ์ซ์๊ฐ ๋ ํด ๋
} else {
reject("์คํจ!"); // ์ฒซ ๋ฒ์งธ ์ซ์๊ฐ ๋ ์๊ฑฐ๋ ๊ฐ์ ๋
}
});
}
9. ๋ค์๊ณผ ๊ฐ์ด Promise๊ฐ ์ฌ๋ฌ ๊ฐ ์์ ๋, Promise.allSettled๋ฅผ ์ด์ฉํด ๊ฒฐ๊ด๊ฐ์ด ์ถ๋ ฅ๋๋๋ก ํ๋ ์ฝ๋๋ฅผ ์์ฑํ์์ค. (๋จ, ํ์ดํ ํจ์๋ฅผ ์ด์ฉํ๋ค.)
const myPromise1=Promise.resolve('๋น์ ์ ์ต๊ณ ์์.');
const myPromise2=Promise.resolve('๋น์ ์ ๋ฉ์ ธ์.');
const myPromise3=Promise.reject('๋น์ ์ ๋๋จํด์.');
answer
1.var, let, const
2. ํด๋์ค, ํ๋กํ ํ์
3. ์คํ, ๊ฒฐ๊ด๊ฐ
4. return
5. Promise.all, Promise.allsettled
6. set, ์ค๋ณต
7. ??, null, undefined
8.
function compareNumbers(a, b) {
return new Promise((resolve, reject) => {
if (a > b) {
resolve("์ฑ๊ณต!"); // ์ฒซ ๋ฒ์งธ ์ซ์๊ฐ ๋ ํด ๋
} else {
reject("์คํจ!"); // ์ฒซ ๋ฒ์งธ ์ซ์๊ฐ ๋ ์๊ฑฐ๋ ๊ฐ์ ๋
}
});
}
async function compareNumbersAsync(a, b) {
try {
const message = await compareNumbers(a, b); // Promise์ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ค๋ฆผ
console.log(message); // "์ฑ๊ณต!" ์ถ๋ ฅ
} catch (error) {
console.error(error); // "์คํจ!" ์ถ๋ ฅ
}
}
9.
const myPromise1=Promise.resolve('๋น์ ์ ์ต๊ณ ์์.');
const myPromise2=Promise.resolve('๋น์ ์ ๋ฉ์ ธ์.');
const myPromise3=Promise.reject('๋น์ ์ ๋๋จํด์.');
Promise.allSettled([myPromise1,myPromise2,myPromise3])
.then((result)=>{
console.log(result);
})
.catch((error)=>{
console.error(error);
});
์ถ์ฒ) ์กฐํ์ , ใNode.js ๊ต๊ณผ์ ๊ฐ์ 3ํใ, ๊ธธ๋ฒ(2022), 2์ฅ ์์๋ฌ์ผ ํ ์๋ฐ์คํฌ๋ฆฝํธ.
Corner node.js 2ํ
Editor : ์ค๋ฆฌ๋ฐ
[๋ ธ๋ 2ํ] #5. ๋ ธ๋ ๊ธฐ๋ฅ(2) (0) | 2024.11.08 |
---|---|
[๋ ธ๋ 2ํ] #4.๋ ธ๋ ๊ธฐ๋ฅ ์์๋ณด๊ธฐ(1) (0) | 2024.10.11 |
[๋ ธ๋ 2ํ] #2.JavaScript ๋ฐ๋ณต๋ฌธ, ๋ฐ๋ณต์, ๊ฐ์ฒด (0) | 2024.10.04 |
[๋ ธ๋ 2ํ] #1.JavaScript ๋ณ์ ์ ์ธ, ์กฐ๊ฑด๋ฌธ, ํจ์, ๋ฐฐ์ด (0) | 2024.10.04 |