# [Javascript] ES2015+ ์š”์•ฝ ์ •๋ฆฌ



# ES2015+์˜ ๋“ฑ์žฅ

๊ธฐ์กด์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฌธ๋ฒ•์— ๋‹ค๋ฅธ ์–ธ์–ด์˜ ์žฅ์ ๋“ค์„ ๋”ํ•œ ํŽธ๋ฆฌํ•œ ๊ธฐ๋Šฅ๋“ค์ด ๋งŽ์ด ์ถ”๊ฐ€๋˜์—ˆ๋‹ค. ์ด ์ค‘์— ํ™œ์šฉ๋„๊ฐ€ ๋†’์€ ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž.


# 1. const, let


์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ๋•Œ var๋ฅผ ์ด์šฉํ•ด์™”๋‹ค. ํ•˜์ง€๋งŒ ์ด์ œ var๋Š” const์™€ let์œผ๋กœ ๋Œ€์ฒดํ•  ๊ฒƒ์ด๋‹ค.

const์™€ let์€ ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ€์ง€๋Š” var์™€๋Š” ๋‹ฌ๋ฆฌ ๋ธ”๋ก ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ–๋Š”๋‹ค.

๋ธ”๋ก ์Šค์ฝ”ํ”„๋Š” if, while, for, function ๋“ฑ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ค‘๊ด„ํ˜ธ์— ์†ํ•˜๋Š” ๋ฒ”์œ„๋ฅผ ๋œปํ•œ๋‹ค. ๋”ฐ๋ผ์„œ const์™€ let์„ ์ด ์ค‘๊ด„ํ˜ธ ์•ˆ์—์„œ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด, ๊ทธ ์Šค์ฝ”ํ”„ ๋ฒ”์œ„ ์•ˆ์—์„œ๋งŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํ˜ธ์ด์ŠคํŒ…์— ๊ด€๋ จ๋œ ๋ฌธ์ œ๋Š” ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.


# ๊ทธ๋ ‡๋‹ค๋ฉด const์™€ let์€ ๋ฌด์Šจ ์ฐจ์ด์ผ๊นŒ?

๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ let์€ ๋Œ€์ž…ํ•œ ๊ฐ’์„ ๊ณ„์† ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, const๋Š” ํ•œ๋ฒˆ ๋Œ€์ž…ํ•˜๋ฉด ๋‹ค๋ฅธ ๊ฐ’ ๋Œ€์ž…์„ ํ•  ์ˆ˜ ์—†๊ณ  ์ดˆ๊ธฐํ™” ์‹œ ๊ฐ’์ด ํ•„์š”๋‹ค.

const a = 0;
a = 1; // error


let b = 0;
b = 1; // 1

const c; // error 


# 2. ํ…œํ”Œ๋ฆฟ ๋ฌธ์ž์—ด


๋ฐฑํ‹ฑ(`)์„ ์ด์šฉํ•ด ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

๋ฐฑํ‹ฑ์€ ํ‚ค๋ณด๋“œ์—์„œ tabํ‚ค ์œ„์— ์žˆ๋‹ค


๋ฐฑํ‹ฑ์„ ํ™œ์šฉํ•ด์„œ ๋ฌธ์ž์—ด ์•ˆ์— ๋ณ€์ˆ˜๋„ ๋„ฃ์„ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค. ๊ธฐ์กด์—๋Š” ๋ณ€์ˆ˜๊ฐ€ ๋“ฑ์žฅํ•  ๋•Œ๋งˆ๋‹ค ๋”ฐ์˜ดํ‘œ๋ฅผ ๋‹ซ๊ณ  +๋ฅผ ํ†ตํ•ด ์—ฐ๊ฒฐํ–ˆ๋Š”๋ฐ ์ด์ œ ๋ฐฑํ‹ฑ์„ ํ™œ์šฉํ•˜๋ฉด ๋ณ€์ˆ˜๊ฐ€ ํฌํ•จ๋œ ๋ฌธ์ž์—ด์„ ํ•œ๋ฒˆ์— ๋ชจ๋‘ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•ด์กŒ๋‹ค.


var string = num1 + ' + ' + num2 + ' = ' + result;

const string = `${num1} + ${num2} = ${result}`;

์•„๋ž˜๊ฐ€ ํ›จ์”ฌ ๊ฐ€๋…์„ฑ์ด ์ข‹์•„์กŒ๋‹ค. ๋˜ํ•œ, ๋ฐฑํ‹ฑ ์•ˆ์— ๋”ฐ์˜ดํ‘œ๋ฅผ ํ•จ๊ป˜ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.



# 3. ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด


๋‹ค์Œ ์ฝ”๋“œ๋Š” oldObject ๊ฐ์ฒด์— ๋™์ ์œผ๋กœ ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜๋Š” ์ƒํ™ฉ์ด๋‹ค.

  • # ๊ธฐ์กด ์ฝ”๋“œ

var sayNode = function() {
    console.log('Node');
};
 
var es = 'ES';
var oldObject = {
    sayJS: function(){
        console.log('JS');
    },
    sayNode: sayNode,
};
 
oldObject[es + 6] = 'Fantastic';
 
oldObject.sayNode();
oldObject.sayJS();
console.log(oldObject.ES6);

์ด์ œ ์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์•„๋ž˜์ฒ˜๋Ÿผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

var sayNode = function() {
    console.log('Node');
};
 
var es = 'ES';
 
const newObject = {
    sayJS() {
        console.log('JS');
    },
    sayNode,
    [es+6]: 'Fantastic',
};
 
newObject.sayNode();
newObject.sayJS();
console.log(newObject.ES6);

oldObject์™€ newObject๋ฅผ ๋น„๊ตํ•ด๋ณด์ž.

๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ์— ํ•จ์ˆ˜๋ฅผ ์—ฐ๊ฒฐํ•  ๋•Œ ์ด์ œ :์™€ ๊ฐ™์€ ์ฝœ๋ก ๊ณผ function์„ ๋ถ™์ด์ง€ ์•Š์•„๋„ ๊ฐ€๋Šฅํ•ด์กŒ๋‹ค.

๋˜ํ•œ sayNode : sayNode์™€ ๊ฐ™์ด ์ค‘๋ณต๋˜๋Š” ์ด๋ฆ„์˜ ๋ณ€์ˆ˜๋Š” ๊ทธ๋ƒฅ ๊ฐ„๋‹จํžˆ sayNode ํ•˜๋‚˜๋งŒ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค.

๋˜ํ•œ ๊ฐ์ฒด์˜ ์†์„ฑ๋ช…์„ ๋™์ ์œผ๋กœ ์ƒ์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด์ „์—๋Š” ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด ๋ฐ”๊นฅ์—์„œ [es+6]์œผ๋กœ ๋งŒ๋“ค์—ˆ์ง€๋งŒ, ์ด์ œ ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด ์•ˆ์—์„œ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋ชจ์Šต์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฝ”๋“œ์˜ ์–‘์„ ์ค„์ด๊ณ , ํŽธ๋ฆฌํ•˜๋‹ˆ ์ต์ˆ™ํ•ด์ง€๋ฉด ์ข‹๋‹ค.



# 4. ํ™”์‚ดํ‘œ ํ•จ์ˆ˜


๊ธฐ์กด์˜ function {}๋„ ์ด์ „์ฒ˜๋Ÿผ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ES2015 ์ดํ›„๋กœ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๊ฐ€ ์ƒ๊ธฐ๋ฉด์„œ ๋งŽ์ด ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋‹ค.

function add1(x, y) {
	return x+y;
}

const add2 = (x, y) => x + y;

๋‘ ๊ฐ€์ง€ ๋ชจ๋‘ ๋˜‘๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ํ•จ์ˆ˜๋‹ค. ํ•˜์ง€๋งŒ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์—์„œ๋Š” function ๋Œ€์‹  => ๊ธฐํ˜ธ๋กœ ์„ ์–ธํ•œ๋‹ค. ์ด๋Š” return๋ฌธ์„ ์ค„์ผ ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์ด ์žˆ๋‹ค. ๋˜ํ•œ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” function๊ณผ this ๋ฐ”์ธ๋“œ ๋ฐฉ์‹์—์„œ ์ฐจ์ด์ ์ด ์กด์žฌํ•œ๋‹ค.


  • # ๊ธฐ์กด ์ฝ”๋“œ

var relationship1 = {
    name: 'kim',
    friends: ['a', 'b', 'c'],
    logFriends: function() {
        var that = this; // relationship1์„ ๊ฐ€๋ฆฌํ‚ค๋Š” this๋ฅผ that์— ์ €์žฅ
 
        this.friends.forEach(function(friend){
            console.log(that.name, friend);
        });
    },
};
relationship1.logFriends();

relationship1.logFriends()์—์„œ forEach๋ฌธ ์•ˆ์— function ์„ ์–ธ๋ฌธ์„ ์‚ฌ์šฉํ–ˆ๋‹ค.

์ด๋กœ์จ ๊ฐ์ž ๋‹ค๋ฅธ ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„ this๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋˜๋ฏ€๋กœ friends ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด์„œ that์ด๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ์ด์— this ๊ฐ’์„ ๋ฏธ๋ฆฌ ์ €์žฅํ•ด๋†“๋Š” ๋ชจ์Šต์ด๋‹ค.


const relationship2 = {
    name: 'kim',
    friends: ['a', 'b', 'c'],
    logFriends() {
        this.friends.forEach(friend => {
            console.log(this.name, friend);
        });
    },
};
relationship2.logFriends();

์ด๋ฒˆ์—๋Š” forEach๋ฌธ์—์„œ function์„ ์„ ์–ธํ•˜์ง€ ์•Š๊ณ  ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋ฐ”๋กœ ๋ฐ”๊นฅ ์Šค์ฝ”ํ”„์ธ logFriends()์˜ this๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•œ ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ๋Š” function ๋Œ€์‹  ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๋”ฐ๋กœ ๋ฐ”๊นฅ ์Šค์ฝ”ํ”„์˜ this๋ฅผ ์ €์žฅํ•ด๋†“๊ณ  ๋ถˆ๋Ÿฌ์˜ค์ง€ ์•Š์•„๋„ ๋˜์„œ ํŽธ๋ฆฌํ•˜๋‹ค.



# 5. ๋น„๊ตฌ์กฐํ™” ํ• ๋‹น


๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด์—์„œ ์†์„ฑ ํ˜น์€ ์š”์†Œ๋ฅผ ๊บผ๋‚ด์˜ฌ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.


  • # ๊ธฐ์กด ์ฝ”๋“œ

var candyMachine = {
    status: {
        name: 'node',
        count: 5,
    },
    getCandy: function(){
        return "Hi";
    }
};
 
var getCandy = candyMachine.getCandy;
var count = candyMachine.status.count;

๊ธฐ์กด์—๋Š” ๊ฐ์ฒด์—์„œ ์†์„ฑ์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ ์ด์ฒ˜๋Ÿผ ์ž‘์„ฑํ–ˆ๋‹ค.


const candyMachine1 = {
    status: {
        name: 'node',
        count: 5,
    },
    getCandy1() {
        return "Hi";
    }
};
 
const { getCandy1, status: { count } } = candyMachine1;

console.log(getCandy1()) // Hi
console.log(count) // 5

ํ•˜์ง€๋งŒ ์ด์ฒ˜๋Ÿผ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•œ ์ค„๋กœ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ด์กŒ๋‹ค. ์—ฌ๋Ÿฌ ๋‹จ๊ณ„ ์•ˆ์˜ ์†์„ฑ๋„ count1์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.


์ด ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ๋ฐฐ์—ด์—์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

var array = ['nodejs', {}, 10, true];
var node = array[0];
var obj = array[1];
var bool = array[array.length - 1];

array๋ผ๋Š” ๋ฐฐ์—ด ์•ˆ์— 4๊ฐ€์ง€ ์š”์†Œ๋ฅผ ๋„ฃ๊ณ  ๊ฐ€์ ธ์˜ค๋Š” ๋ชจ์Šต์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.


const array1 = ['nodejs', {}, 10, true];
const [node, obj, , bool] = array1;

bool์€ true๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด ๋ฐฐ์—ด์˜ ๋งˆ์ง€๋ง‰ ๋ถ€๋ถ„์— ์ž‘์„ฑํ•œ ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ด์ฒ˜๋Ÿผ ์ž‘์„ฑํ•˜๋ฉด ๋งจ ๋์ด๋ผ๊ณ  ์ž๋™์œผ๋กœ ์ธ์‹ํ•ด์ฃผ๋‹ˆ ์ƒ๋‹นํžˆ ํŽธํ•œ ์žฅ์ ์ด ์žˆ๋‹ค.


์ด์ฒ˜๋Ÿผ ๋น„๊ตฌ์กฐํ™” ํ• ๋‹น์„ ์ด์šฉํ•˜๋ฉด, ๋ฐฐ์—ด์ด ์œ„์น˜๋งˆ๋‹ค ๋ณ€์ˆ˜๋ฅผ ๋„ฃ์–ด ๋˜‘๊ฐ™์€ ์—ญํ• ์„ ํ•˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ์ฝ”๋“œ ์ค„๋„ ์ƒ๋‹นํžˆ ์ค„์ผ ์ˆ˜ ์žˆ๊ณ , ํŠนํžˆ Node.js์—์„œ๋Š” ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฐ ๋ฐฉ์‹์ด ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค๊ณ  ํ•œ๋‹ค.



# 6. ํ”„๋กœ๋ฏธ์Šค(promise)


์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ Node๋Š” ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์œผ๋กœ ์ด๋ฒคํŠธ ์ฃผ๋„ ๋ฐฉ์‹์„ ํ™œ์šฉํ•˜๋ฉด์„œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค. ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ์ž์ฒด๊ฐ€ ๋ณต์žกํ•œ ๊ฒƒ๋„ ์žˆ๊ณ , ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์šด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋‚ด์šฉ ์ค‘ ํ•˜๋‚˜์ด๊ธฐ๋„ ํ•˜๋‹ค.


์ด์— ES2015๋ถ€ํ„ฐ๋Š” ์ฝœ๋ฐฑ ๋Œ€์‹  API๋“ค์ด ํ”„๋กœ๋ฏธ์Šค ๊ธฐ๋ฐ˜์œผ๋กœ ์žฌ๊ตฌ์„ฑ๋˜๊ณ  ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ”„๋กœ๋ฏธ์Šค์— ๋Œ€ํ•ด ์ž˜ ์ดํ•ดํ•˜๊ณ  ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด, ๋ณต์žกํ•œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ์ง€์˜ฅ์—์„œ ๋ฒ—์–ด๋‚  ์ˆ˜ ์žˆ์œผ๋‹ˆ ํ™•์‹คํžˆ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.


promise ๊ฐ์ฒด ๊ตฌ์กฐ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

const condition = true;
 
const promise = new Promise((resolve, reject) => {
    if (condition){
        resolve('์„ฑ๊ณต');
    } else {
        reject('์‹คํŒจ');
    }
});
 
promise
    .then((message) => {
        console.log(message);
    })
    .catch((error) => {
        console.log(error);
    });

new Promise๋กœ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์•ˆ์— resolve์™€ reject๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๊ฐ–๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ๋„ฃ๋Š” ๋ฐฉ์‹์ด๋‹ค.

์ด์ œ ์„ ์–ธํ•œ promise ๋ณ€์ˆ˜์— then๊ณผ catch ๋ฉ”์„œ๋“œ๋ฅผ ๋ถ™์ด๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

resolve๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด then์ด ์‹คํ–‰๋˜๊ณ , reject๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด catch๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

์ด์ œ resolve์™€ reject์— ๋„ฃ์–ด์ค€ ์ธ์ž๋Š” ๊ฐ๊ฐ then๊ณผ catch์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์—์„œ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

์ฆ‰, condition์ด true๊ฐ€ ๋˜๋ฉด resolve('์„ฑ๊ณต')์ด ํ˜ธ์ถœ๋˜์–ด message์— '์„ฑ๊ณต'์ด ๋“ค์–ด๊ฐ€ log๋กœ ์ถœ๋ ฅ๋œ๋‹ค. ๋ฐ˜๋Œ€๋กœ false๋ฉด reject('์‹คํŒจ')๊ฐ€ ํ˜ธ์ถœ๋˜์–ด catch๋ฌธ์ด ์‹คํ–‰๋˜๊ณ  error์— '์‹คํŒจ'๊ฐ€ ๋˜์–ด ์ถœ๋ ฅ๋  ๊ฒƒ์ด๋‹ค.


์ด์ œ ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์„ ํ™œ์šฉํ•ด ์ฝœ๋ฐฑ์„ ํ”„๋กœ๋ฏธ์Šค๋กœ ๋ฐ”๊ฟ”๋ณด์ž.

function findAndSaveUser(Users) {
    Users.findOne({}, (err, user) => { // ์ฒซ๋ฒˆ์งธ ์ฝœ๋ฐฑ
        if(err) {
            return console.error(err);
        }
        user.name = 'kim';
        user.save((err) => { // ๋‘๋ฒˆ์งธ ์ฝœ๋ฐฑ
            if(err) {
                return console.error(err);
            }
            Users.findOne({gender: 'm'}, (err, user) => { // ์„ธ๋ฒˆ์งธ ์ฝœ๋ฐฑ
                // ์ƒ๋žต
            });
        });
    });
}

๋ณดํ†ต ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํŒจํ„ด์€ ์ด์™€ ๊ฐ™์ด ์ž‘์„ฑํ•  ๊ฒƒ์ด๋‹ค. ํ˜„์žฌ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ์„ธ ๋ฒˆ ์ค‘์ฒฉ๋œ ๋ชจ์Šต์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ฆ‰, ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ๋‚˜์˜ฌ๋•Œ ๋งˆ๋‹ค ์ฝ”๋“œ๊ฐ€ ๊นŠ์–ด์ง€๊ณ  ๊ฐ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋งˆ๋‹ค ์—๋Ÿฌ๋„ ๋”ฐ๋กœ ์ฒ˜๋ฆฌํ•ด์ฃผ๊ณ  ์žˆ๋‹ค.


ํ”„๋กœ๋ฏธ์Šค๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

function findAndSaveUser1(Users) {
    Users.findOne({})
        .then((user) => {
            user.name = 'kim';
            return user.save();
        })
        .then((user) => {
            return Users.findOne({gender: 'm'});
        })
        .then((user) => {
            // ์ƒ๋žต
        })
        .catch(err => {
            console.error(err);
        });
}

then์„ ํ™œ์šฉํ•ด ์ฝ”๋“œ๊ฐ€ ๊นŠ์–ด์ง€์ง€ ์•Š๋„๋ก ๋งŒ๋“ค์—ˆ๋‹ค. ์ด๋•Œ, then ๋ฉ”์„œ๋“œ๋“ค์€ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค.

์—๋Ÿฌ๋Š” ๋งˆ์ง€๋ง‰ catch๋ฅผ ํ†ตํ•ด ํ•œ๋ฒˆ์— ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ํ•˜์ง€๋งŒ ๋ชจ๋“  ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ด์ฒ˜๋Ÿผ ๊ณ ์น  ์ˆ˜ ์žˆ๋Š” ๊ฑด ์•„๋‹ˆ๊ณ , find์™€ save ๋ฉ”์„œ๋“œ๊ฐ€ ํ”„๋กœ๋ฏธ์Šค ๋ฐฉ์‹์„ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•œ ์ƒํ™ฉ์ด๋‹ค.

์ง€์›ํ•˜์ง€ ์•Š๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” util.promisify๋ฅผ ํ†ตํ•ด ๊ฐ€๋Šฅํ•˜๋‹ค.


ํ”„๋กœ๋ฏธ์Šค ์—ฌ๋Ÿฌ๊ฐœ๋ฅผ ํ•œ๊บผ๋ฒˆ์— ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ Promise.all์„ ํ™œ์šฉํ•˜๋ฉด ๋œ๋‹ค.

const promise1 = Promise.resolve('์„ฑ๊ณต1');
const promise2 = Promise.resolve('์„ฑ๊ณต2');
 
Promise.all([promise1, promise2])
    .then((result) => {
        console.log(result);
    })
    .catch((error) => {
        console.error(err);
    });

promise.all์— ํ•ด๋‹นํ•˜๋Š” ๋ชจ๋“  ํ”„๋กœ๋ฏธ์Šค๊ฐ€ resolve ์ƒํƒœ์—ฌ์•ผ then์œผ๋กœ ๋„˜์–ด๊ฐ„๋‹ค. ๋งŒ์•ฝ ํ•˜๋‚˜๋ผ๋„ reject๊ฐ€ ์žˆ๋‹ค๋ฉด, catch๋ฌธ์œผ๋กœ ๋„˜์–ด๊ฐ„๋‹ค.

๊ธฐ์กด์˜ ์ฝœ๋ฐฑ์„ ํ™œ์šฉํ–ˆ๋‹ค๋ฉด, ์—ฌ๋Ÿฌ๋ฒˆ ์ค‘์ฒฉํ•ด์„œ ๊ตฌํ˜„ํ–ˆ์–ด์•ผํ•˜์ง€๋งŒ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด์ฒ˜๋Ÿผ ๊น”๋”ํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.



# 7. async/await


ES2017์— ์ถ”๊ฐ€๋œ ์ตœ์‹  ๊ธฐ๋Šฅ์ด๋ฉฐ, Node์—์„œ๋Š” 7,6๋ฒ„์ „๋ถ€ํ„ฐ ์ง€์›ํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค. Node์ฒ˜๋Ÿผ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•  ๋•Œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜๊ณ , ์ฝœ๋ฐฑ์˜ ๋ณต์žก์„ฑ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์กฐ๊ธˆ ๋” ๊น”๋”ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๋„์›€์„ ์ค€๋‹ค.


์ด์ „์— ํ•™์Šตํ•œ ํ”„๋กœ๋ฏธ์Šค ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์™€๋ณด์ž.

function findAndSaveUser1(Users) {
    Users.findOne({})
        .then((user) => {
            user.name = 'kim';
            return user.save();
        })
        .then((user) => {
            return Users.findOne({gender: 'm'});
        })
        .then((user) => {
            // ์ƒ๋žต
        })
        .catch(err => {
            console.error(err);
        });
}

์ฝœ๋ฐฑ์˜ ๊นŠ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ๋Š” ํ–ˆ์ง€๋งŒ, ์—ฌ์ „ํžˆ ์ฝ”๋“œ๊ฐ€ ๊ธธ๊ธด ํ•˜๋‹ค. ์—ฌ๊ธฐ์— async/await ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.


async function findAndSaveUser(Users) {
    try{
        let user = await Users.findOne({});
        user.name = 'kim';
        user = await user.save();
        user = await Users.findOne({gender: 'm'});
        // ์ƒ๋žต
 
    } catch(err) {
        console.error(err);
    } 
}

์ƒ๋‹นํžˆ ์งง์•„์ง„ ๋ชจ์Šต์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

function ์•ž์— async์„ ๋ถ™์—ฌ์ฃผ๊ณ , ํ”„๋กœ๋ฏธ์Šค ์•ž์— await์„ ๋ถ™์—ฌ์ฃผ๋ฉด ๋œ๋‹ค. await์„ ๋ถ™์ธ ํ”„๋กœ๋ฏธ์Šค๊ฐ€ resolve๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ ํ›„ ๋‹ค์Œ ๋กœ์ง์œผ๋กœ ๋„˜์–ด๊ฐ€๋Š” ๋ฐฉ์‹์ด๋‹ค.


์•ž์—์„œ ๋ฐฐ์šด ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋กœ ๋‚˜ํƒ€๋ƒˆ์„ ๋•Œ async/await์„ ์‚ฌ์šฉํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

const findAndSaveUser = async (Users) => {
    try{
        let user = await Users.findOne({});
        user.name = 'kim';
        user = await user.save();
        user = await user.findOne({gender: 'm'});
    } catch(err){
        console.error(err);
    }
}

ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ๋„ async/await์œผ๋กœ ๋น„๊ต์  ๊ฐ„๋‹จํžˆ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ์ „์—๋Š” ์ค‘์ฒฉ๋œ ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ํ™œ์šฉํ•œ ๊ตฌํ˜„์ด ๋‹น์—ฐ์‹œ ๋˜์—ˆ์ง€๋งŒ, ์ด์ œ ๊ทธ๋Ÿฐ ์ƒํ™ฉ์— async/await์„ ์ ๊ทน ํ™œ์šฉํ•ด ์ž‘์„ฑํ•˜๋Š” ์—ฐ์Šต์„ ํ•ด๋ณด๋ฉด ์ข‹์„ ๊ฒƒ์ด๋‹ค.



# [์ฐธ๊ณ  ์ž๋ฃŒ]

์ตœ์ข… ์ˆ˜์ • : 12/17/2022, 7:23:59 AM