์ƒˆ์†Œ์‹

Languages/Java Script

Asynchronous Programming | callback hell | Improved Method Practice

  • -
๋ฐ˜์‘ํ˜•

๋ชจ๋“  ํฌ์ŠคํŒ…์€ ์ธํ”„๋Ÿฐ ECMAScript6: ๋น ๋ฅด๊ฒŒ ๋ฐฐ์šฐ๋Š” ES6 ์Šคํ‚ฌ๊ณผ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋žจ ์˜ ๋‚ด์šฉ์„ ๋‹ด๊ณ  ์žˆ์œผ๋ฉฐ

์ถœ์ฒ˜๋Š” ์•„๋ž˜์˜ ์ฃผ์†Œ๋กœ "๊น€ํ˜•ํƒœ"๋‹˜์˜ ์ž๋ฃŒ์ž…๋‹ˆ๋‹ค. 

์ƒ์—…์ ์ธ ์˜๋„๊ฐ€ ์•„๋‹Œ ๊ณต๋ถ€ํ•œ ๊ฒƒ์„ ์ •๋ฆฌํ•ด๋†“๋Š” ๋ชฉ์ ์œผ๋กœ ํฌ์ŠคํŒ… ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

www.inflearn.com/course/es6-ecmascript-6

 

ECMAScript 6: ๋น ๋ฅด๊ฒŒ ๋ฐฐ์šฐ๋Š” ES6 ์Šคํ‚ฌ๊ณผ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ์ธํ”„๋Ÿฐ

๋น„๋™๊ธฐ ํ™˜๊ฒฝ์—์„œ ์‰ฝ๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ES6์˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ๋ฐฐ์šฐ๊ณ  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์Šคํ‚ฌ์„ ํ–ฅ์ƒ์‹œ์ผœ ๋ณด์„ธ์š”. ์ดˆ๊ธ‰ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ES6 ์˜จ๋ผ์ธ ๊ฐ•์˜ abcdefghijk

www.inflearn.com


 

1. callback hell

# ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ 

- ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํŠน์ง•์ธ ์‹ฑ๊ธ€์Šค๋ ˆ๋“œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•จ.

 

๋น„๋™๊ธฐ๋ž€ ํŠน์ • ์ฝ”๋“œ์˜ ์‹คํ–‰์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ , ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ๋จผ์ € ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

์›น(web)์šฉ์œผ๋กœ ์ž‘์„ฑ๋œ ์–ธ์–ด๋กœ์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ ํด๋ฆญ์ด๋‚˜ ํ‚ค ์ž…๋ ฅ๊ณผ ๊ฐ™์€ ๋น„๋™๊ธฐ ์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ ์ด๋ฒคํŠธ์— ์‘๋‹ตํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ–ˆ๋‹ค. node.js๋Š” ์ด๋ฒคํŠธ ๋Œ€์‹  callback์„ ์‚ฌ์šฉํ•˜์˜€๋‹ค.

 

callback์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž˜ ์ง€์›ํ•˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํŠน์ง• ๋•Œ๋ฌธ์— ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–‘์‹์ด ๋˜์—ˆ๋‹ค.

 

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

+ ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์–ด๋ ค์šด ๋ฌธ์ œ๋„ ์žˆ์Œ

 

ES6์—์„œ๋Š” ์ œ๋„ˆ๋ ˆ์ดํ„ฐ์™€ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์œ„์™€ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ๊ฐœ์„ ํ•˜๊ณ  ์žˆ๋‹ค.

 

- ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์œ„ํ•œ ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ ์ œ๋„ˆ๋ ˆ์ดํŠธ์™€ ํ”„๋กœ๋ฏธ์Šค.

 

# ์ฝœ๋ฐฑ ์ง€์˜ฅ

- ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์—ฐ์†์‚ฌ์šฉํ•˜์—ฌ ๋ฐœ์ƒ.

- ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ๋‹ค๋ฅธ ํ•จ์ˆ˜๋กœ ์ „๋‹ฌํ•˜๋Š” ์ˆœ๊ฐ„ ๊ทธ ์ฝœ๋ฐฑํ•จ์ˆ˜์— ๋Œ€ํ•ด ์ œ์–ด๊ถŒ ์ƒ์‹ค

 

์›น ์„œ๋น„์Šค๋ฅผ ๊ฐœ๋ฐœํ•˜๋‹ค ๋ณด๋ฉด ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์™€ ํ™”๋ฉด์— ํ‘œ์‹œํ•˜๊ธฐ๊นŒ์ง€ ์ธ์ฝ”๋”ฉ, ์‚ฌ์šฉ์ž ์ธ์ฆ ๋“ฑ์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.

๋งŒ์•ฝ ์ด ๋ชจ๋“  ๊ณผ์ •์„ ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค๊ณ  ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์—ฐ์†์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.

์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ๋‹ค๋ฅธ ํ•จ์ˆ˜๋กœ ์ „๋‹ฌํ•˜๋Š” ์ˆœ๊ฐ„ ๊ทธ ์ฝœ๋ฐฑํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ œ์–ด๊ถŒ์„ ์žƒ๊ฒŒ ๋œ๋‹ค.

์ด์™€ ๊ฐ™์€ ์ฝ”๋“œ ๊ตฌ์กฐ๋ฅผ ์ฝœ๋ฐฑ์ง€์˜ฅ์ด๋ผ๊ณ  ํ•œ๋‹ค. ์ฝœ๋ฐฑ์ง€์˜ฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ์ ๋“ค์ด ์žˆ๋‹ค.

- ๊ฐ€๋…์„ฑ ๋–จ์–ด์ง

- ์—๋Ÿฌ ๋ฐœ์ƒ์ด ์‰ฌ์›€

- ๋””๋ฒ„๊น…์ด ์–ด๋ ค์›Œ์ง

 

์ฝœ๋ฐฑ์ง€์˜ฅ์„ ๋ฒ—์–ด๋‚˜๋ ค๋ฉด ?

# ๊ฐ๊ฐ์˜ ํ•จ์ˆ˜๋กœ ๊ตฌ๋ถ„

์ฝ”๋”ฉ ํŒจํ„ด์œผ๋กœ ์ฝœ๋ฐฑํ•จ์ˆ˜ ๋ถ„๋ฆฌ

- ์‹ฑ๊ธ€์Šค๋ ˆ๋“œ์ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์ง€๋งŒ, ์•ž์— ์ฝœ๋ฐฑ์ง€์˜ฅ์˜ ์˜ˆ์‹œ๋ฅผ ๊ฐœ์„ ํ•ด๋ณด๊ธฐ์œ„ํ•ด ์ค‘์ฒฉํ•ด์„œ ์„ ์–ธํ–ˆ๋˜ ์ฝœ๋ฐฑ ์ต๋ช…ํ•จ์ˆ˜๋ฅผ 

๊ฐ๊ฐ์˜ ํ•จ์ˆ˜๋กœ ๊ตฌ๋ถ„ํ•ด ๋ฐ›์•„์™€๋ณด์ž.

- validator ํ•จ์ˆ˜๋Š” ํ‚ค ์ž…๋ ฅ์„ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.

- ๊ฒฐ๊ณผ ๊ฐ’์ธ user๊ฐ€ ์ „๋‹ฌ๋˜๊ณ  register ํ•จ์ˆ˜๋กœ ๋“ฑ๋ก์„ ๋งˆ์นœ๋‹ค.

- user๋ฅผ ๊ฐ€์ง€๊ณ  display๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๊ฒฐ๊ณผ๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

 

ํ•˜์ง€๋งŒ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ํ•ญ์ƒ ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜๋Š” ์—†๋‹ค. ์•ž์„œ ํ•™์Šตํ–ˆ๋˜ promise๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฐ”๊ฟ” ๋ณด์ž.

 

# Promise

- ํ”„๋กœ๋ฏธ์Šค๋กœ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ

๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ”„๋กœ๋ฏธ์Šค๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌํ˜„ํ•  ๋•Œ ์„œ๋ฒ„์—์„œ ๋ฐ›์•„์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ํ™”๋ฉด์— ํ‘œ์‹œํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

ํ•˜์ง€๋งŒ ํ™”๋ฉด์—์„œ ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ–ˆ์„ ๋•Œ, ์„œ๋ฒ„๊ฐ€ ์–ธ์ œ ๊ทธ ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ์ค„์ง€๋„ ๋ชจ๋ฅด๋Š”๋ฐ ๋งˆ๋ƒฅ ๋‹ค๋ฅธ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  ๋Œ€๊ธฐํ•  ์ˆ˜๋Š” ์—†๋‹ค.

 

๋˜ํ•œ ์ด ์ฝ”๋“œ๋ณด๋‹ค ์•ž์„œ ๋ณด์•˜๋˜ ์ฝ”๋“œ๊ฐ€ ํ›จ์”ฌ ์ง๊ด€์ ์ด๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค.

 

 

# Generator

- ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋กœ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ

์ œ๋„ˆ๋ ˆ์ดํ„ฐ ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค๋ฉด ํ›จ์”ฌ ๋” ์ง๊ด€์ ์ด๊ณ  ์•Œ์•„๋ณด๊ธฐ๊ฐ€ ์‰ฌ์›Œ์ง„๋‹ค.

์ œ๋„ˆ๋ ˆ์ดํ„ฐ ํ•จ์ˆ˜ ํ˜ธ์ถœ๋กœ ์ƒ์„ฑ๋œ ์ดํ„ฐ๋ ˆ์ดํ„ฐ์˜ next ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ yield ๊ตฌ๋ฌธ์— validator๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด

์‹คํ–‰์„ ๋ฉˆ์ถ”๊ณ  ์ œ์–ด๊ถŒ์„ ๋„˜๊ฒจ์ค„ ๊ฒƒ์ด๋‹ค.

 

๊ทธ๋Ÿฐ๋ฐ ์ดํ›„ ์‹คํ–‰์ด ๊ณ„์†๋˜๋ ค๋ฉด  validatorํ•จ์ˆ˜ ์•ˆ์—์„œ  ์ง์ ‘ next() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœ ํ•  ์ˆ˜ ๋ฐ–์— ์—†๊ฒŒ๋œ๋‹ค.

์ด๊ฒƒ์€ ์ฝœ๋ฐฑ ํŒจํ„ด๊ณผ๋Š” ๋˜ ๋‹ค๋ฅธ ์˜๋ฏธ์˜ ์ œ์–ด๊ถŒ ์ƒ์‹ค์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. 

 

๊ทธ๋ ‡๋‹ค๋ฉด ๋‘๊ฐœ๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ์–ด๋–จ๊นŒ?

 

# Generator์™€ Promise๋ฅผ ๊ฒฐํ•ฉ

์ด๋ฒˆ์—๋Š” ๋ชจ๋“  ํ•จ์ˆ˜๊ฐ€ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ•˜์˜€๋‹ค.

์ด์ œ next()๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด yield๊ตฌ๋ฌธ์˜ validator ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜์–ด ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ๋ฆฌํ„ด ๋  ๊ฒƒ์ด๋‹ค

์ด ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ์ดํ–‰์ด ๋˜๋ฉด then ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰์ด ๋œ๋‹ค.

 

์ด ๊ณผ์ •์„ ์™ธ๋ถ€์—์„œ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๊ฐ€ ๋๋‚  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•ด์„œ ์‹คํ–‰์‹œ์ผœ์ฃผ๋ฉด, ๊ฐ๊ฐ์˜ ํ•จ์ˆ˜๊ฐ€ ์ œ์–ด๊ถŒ์„ ์ง์ ‘ ๋‹ค๋ฃจ์ง€ ์•Š๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.

 

 

2. Improved Method Practice

 

๋งˆ์ง€๋ง‰ ์˜ˆ์ œ์ฝ”๋“œ ์ž‘์„ฑํ•˜๊ธฐ

const util = {};

util.logThunk = function(message){
	return message;
};

function procPromise(data,action){
	return new Promise(function (resolve, reject){
    	!!data ? resolve(data): reject(action);
    });
}

const userValidator = function(){
	let isValid = true;
    let validationError = {
    	error: {}
    };
    const user = {
    	id: "haeun",
        password: "abcd1234"
    };
    return{
    	userIsValid: function(){
        	if(user.id =='' || user.password =='' || user.password.length<10){
            	isValid = false;
                validationError.errors.message = 'userValidator fail';
            }
            if(!isValid){
            	return procPromise(isValid, util.logThunk(validationError.errors.massage));
            }
            else return procPromise(user);
     }
   }
}
           
const userRegister = function(user){
	let success = true;
    let massage = "";
    return {
    	registerUser: function(user){
        	if(res = false){
            	success = res;
                message = "registerUser fail!";
                return procPromise(success, util.logThunk(message));
                }
                else return proPromise(success);
            }
    };
};

const userDisplay = (user) => {
	let success = true;
    let message = "";
    return {
    	showRegistrationThankYou: function(user){
        	if(err = false){
            	success = err;
                message = "showRegistrationThankYou fail";
                return procPromise(success,util.logThunk(message));
            } else{
            	//document.getElementById("").innerHTML = "";
                message = `${user.id}๋‹˜ ์•ˆ๋…•ํ•˜์„ธ์š”.`;  
                return procPromise(message);
            }
        }
    };
};

const users = {};
users.registration = function (validator, register, display) {
	return {
    	validateAndRegisterUser: function* () {
        	const user = yield validator().userIsValid();
            yield register().registerUSer(user);
            yield display().showRegistrationThankYou(user);
        }
    };
};

const runner = (genFunc) => {
	try {
    	if (genFunc.constructor.name !=="GeneratorFunction") {
        	throw new Error(genFunc + "์€ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.");
        }
        let myIter = genFunc();
        let returnOfNext = {};
        const runNext = (genObj) => {
        	returnOfNext = myIter.next(genObj);
            console.log('myIter : ', returnOfNext);
        };
        (function run(genObj) {
        	runNext(genObj);
            if(!returnOfNext.done) {
            	returnOfNext.value.then(run)
                	.catch(function(err){
                    	console.log('then error : ', err);
                    });
            }else {
            	return console.log('end generator');
            }
        })();
    }
    catch (e) {
    	console.log("error : " + e.message);
        return;
    }
};
runner(users.registration(userValidator, userRegister, userDisplay).validateAndRegisterUser);
     
            

์ฆ‰, next(), yield, then() ์ˆœ์„œ๋กœ ์ˆœํ™˜์— ๋”ฐ๋ผ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

 

# ์ •๋ฆฌํ•˜๊ธฐ

ํ”„๋กœ๋ฏธ์Šค๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์ด ๋ฆฌํ„ดํ•  ์ˆ˜ ์žˆ๋Š” ๊ณตํ†ต ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ

์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋Š” yield์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์ ์ ˆํ•˜๊ฒŒ ์‘๋‹ตํ•  ์ˆ˜ ์žˆ๋‹ค.

์ œ๋„ˆ๋ ˆ์ดํ„ฐ์™€ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๊ฒฐํ•ฉํ•  ๋•Œ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋”์šฑ ์œ ์šฉํ•œ ๋„๊ตฌ๊ฐ€ ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฐ˜์‘ํ˜•

'Languages > Java Script' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Promise & then | chaining & catch | all  (0) 2021.02.15
Generator & yield | yield* | return  (0) 2021.02.15
Rest Parameter | Map | Maplterator | Filtering & Set | Set  (0) 2021.02.15
Iterator & for-of | Symbol | [Symbol.iterator()]  (0) 2021.02.15
Contents

ํฌ์ŠคํŒ… ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค

์ด ๊ธ€์ด ๋„์›€์ด ๋˜์—ˆ๋‹ค๋ฉด ๊ณต๊ฐ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.