Asynchronous Programming | callback hell | Improved Method Practice
- -
๋ชจ๋ ํฌ์คํ ์ ์ธํ๋ฐ ECMAScript6: ๋น ๋ฅด๊ฒ ๋ฐฐ์ฐ๋ ES6 ์คํฌ๊ณผ ๋น๋๊ธฐ ํ๋ก๊ทธ๋จ ์ ๋ด์ฉ์ ๋ด๊ณ ์์ผ๋ฉฐ
์ถ์ฒ๋ ์๋์ ์ฃผ์๋ก "๊นํํ"๋์ ์๋ฃ์ ๋๋ค.
์์ ์ ์ธ ์๋๊ฐ ์๋ ๊ณต๋ถํ ๊ฒ์ ์ ๋ฆฌํด๋๋ ๋ชฉ์ ์ผ๋ก ํฌ์คํ ํ ๊ฒ์ ๋๋ค.
www.inflearn.com/course/es6-ecmascript-6
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 |
์์คํ ๊ณต๊ฐ ๊ฐ์ฌํฉ๋๋ค