π±μλ°μ€ν¬λ¦½νΈ λΉλκΈ°
2019. 03. 16
sat10am
Seungwoo Hong
π μλ°μ€ν¬λ¦½νΈμ λΉλκΈ°
: Part 1

π μμ λΆν°
π μλ°μ€ν¬λ¦½νΈλ μ±κΈμ€λ λ!

π μλ°μ€ν¬λ¦½νΈλ μ±κΈμ€λ λ!
μ±κΈ μ€λ λ == μ€νμ΄ νλ == ν λ²μ νλμ μΌλ§ νλ€.
function add(x, y) {
return x + y;
}
function printAddedNumber() {
let sum = add(1, 2);
console.log(sum);
}
printAddedNumber();βοΈ Example code
π Call stack

step μ νλ νλλ₯Ό Stack frameμ΄λΌ νλ€.
πββοΈ Run to completion
μ€ν λκ³ μλ μμ μ΄ μλ€λ©΄ λ€λ₯Έ μμ μ μ€κ°μ λΌμ΄λ€ μ μλ€.
κ·Έλ°λ° μ€ν μ²λ¦¬ μκ°μ΄ μ€λ 걸리면?

π© κ·Έλ₯ λκΈ°γ γ
π© μλ κ·ΈλΌ λμμ±μ μ§μ μν΄?
π The solution
Asynchronous Callback !!
(λΉλκΈ° μ½λ°±)
π Runtime

console.log('foo');
setTimeout(function() {
console.log('bar')
}, 10 * 1000);
console.log('baz');βοΈ Example code
π€ Role
Call Stack - ν¨μκ° νΈμΆ λλ©΄ μλ¨μ Push, μ’ λ£λλ©΄ pop
Heap - λ©λͺ¨λ¦¬ ν λΉμ΄ μΌμ΄λλ κ³³
Task queue - μ λ¬ λ°μ μ½λ°±ν¨μλ₯Ό μ μ₯νλ ν(FIFO)
Event loop - Call stackμ κ°μ, λΉμ΄ μμΌλ©΄ μ½λ°± μ λ¬
π Event loop
while(queue.waitForMessage()){
queue.processNextMessage();
}Β waitForMessage() μ μν μ λ€μκ³Ό κ°λ€
Β 1. ν μ€ν¬κ° λ€μ΄ μ¬λκΉμ§ κΈ°λ€λ¦¬λ μν μ νλ€.
Β 2. μ€ν μ€μΈ ν μ€ν¬ νκ° μλμ§ κ°μ
Β
μ΄λ²€νΈ νλ μμ κ°μ μν μ λ°λ³΅ μν νμ¬ ν μ€ν¬λ₯Ό μ€νμ μ λ¬νλ€.
π Event loop
function delay() {
for (var i = 0; i < 100000; i++);
}
function foo() {
delay();
console.log('foo!');
}
function bar() {
delay();
console.log('bar!');
}
function baz() {
delay();
console.log('baz!');
}
setTimeout(foo, 10);
setTimeout(bar, 10);
setTimeout(baz, 10);Β - μλ°μ€ν¬λ¦½νΈλ μ±κΈ μ€λ λμ΄λ€.
Β - λμμ±μ ꡬννκΈ° μν΄ μ½λ°±μ μ¬μ©
Β - μλ°μ€ν¬λ¦½νΈ μμ§μ Heap, Stack, Event loop, Task Queueκ° μ‘΄μ¬
Β - λμ μμ
Β Β 1. κΈ°λ³Έ ν¨μλ μ€νμ μμ΄κ³ μ’ λ£ λλ©΄ μ€νμ λΉ μ Έλμ¨λ€.
Β Β 2. λΉλκΈ° μ½λ°±μ μ€νμ μ μ μμΈλ€. κ·Έλ¦¬κ³ λ°λ‘ λΉ μ Έλμ λ°μ€ν¬νμ μΆκ° λλ€.
Β Β 3. μ½λ°± ν¨μκ° μ€ν λ μμ μ΄ λλ©΄ μ΄λ²€νΈ 루νλ call stackμ΄ λΉμ΄ μλ κ±Έ νμΈ νκ³ μ΅λͺ ν¨μλ₯ΌΒ Β Β Β Β Β Β μ§μ΄λ£κ³ μ΅λͺ ν¨μλ μ€ν ν call stackμ λΉ μ Έλμ¨λ€. (μ΄λ²€νΈ 루νμ μμ μ tickμ΄λΌκ³ λΆλ¦)
πΉ Summary
Β πΎ Callback function
μ½λ°± ν¨μλ ν¨μμ μΈμλ‘ μ λ¬ λμ΄ μ΄λ²€νΈκ° λ°μ λλ©΄
νμμ λ°λΌ μ¦μ μ€ν λ μλ λμ€μ μ€ν λ μλ μλ ν¨μ
πΆ λΉλκΈ° vs λκΈ°
λκΈ° - μκ° νλ¦ μμΌλ‘ μμ μ΄Β μ§ν λλ©° μ§ν μ€μΈ μμ μ΄ μλ£ λ λ κΉμ§
Β Β Β Β Β λ€λ₯Έ μμ μ΄ μ€κ°μ μ μ νμ§ λͺ»νλ€.
Β
λΉλκΈ° - μμ μ΄ μλ£ λμ§ μμ μνμμ ν΄λΉ μμ μ λ€λ₯Έ μ΄μκ² μμνκ³ λ€μ
Β Β Β Β Β Β Β μμ μ μ§ν νλ€. Β κ·Έλ¦¬κ³ μμν μμ μ΄ μλ£ λλ©΄ μμ μ κ²°κ³Όλ¬Όμ κ°μ Έμ¨λ€.
π½ λκΈ° μ½λ°±
μ½λ°± ν¨μλ ν¨μμ μΈμλ‘ μ λ¬ λμ΄ μ΄λ²€νΈκ° λ°μ λλ©΄
μ¦μ μ€νλλ ν¨μ
π½ λκΈ° μ½λ°±
function greeting(name) {
console.log(`hello ${name}`);
}
function processUserName(name, callback) {
callback(name);
}
console.log('hi');
processUserName('hong', greeting)
console.log('again hi');πΌ λΉλκΈ° μ½λ°±
μ½λ°± ν¨μλ ν¨μμ μΈμλ‘ μ λ¬ λμ΄ μ΄λ²€νΈκ° λ°μ λλ©΄
λμ€μ μ€ν λ μλ μλ ν¨μ
πΌ λΉλκΈ° μ½λ°±
console.log('hi');
setTimeout(function() {
console.log('see you later')
}, 1000)
console.log('again hi');πΌ λΉλκΈ° μ½λ°± μ¬λ‘
Β - Web API
Β - AJAX
Β - DOM
πΏ μ½λ°±ν¨μμ νκ³
Β - Callback hell
Β - μμΈ μ²λ¦¬
πΏ Callback hell
5κΉμ§ 1μ΄λ§λ€ 1μ© λνκ³ μΆλ€.
setTimeout(function() {
let sum = 1;
console.log(sum, "μ΄");
setTimeout(function() {
sum += 1;
console.log(sum, "μ΄");
setTimeout(function() {
sum += 1;
console.log(sum, "μ΄");
setTimeout(function() {
sum += 1;
console.log(sum, "μ΄");
setTimeout(function() {
sum += 1;
console.log("sum:", sum);
}, 1000);
}, 1000);
}, 1000);
}, 1000);
}, 1000);πΏ Callback hell ν΄κ²°
let sum = 1;
function start() {
console.log(sum, "μ΄");
setTimeout(firstPlus, 1000);
}
function firstPlus() {
sum += 1;
console.log(sum, "μ΄");
setTimeout(secondPlus, 1000);
}
function secondPlus() {
sum += 1;
console.log(sum, "μ΄");
setTimeout(thirdPlus, 1000);
}
function thirdPlus() {
sum += 1;
console.log(sum, "μ΄");
setTimeout(fourthPlus, 1000);
}
function fourthPlus() {
sum += 1;
console.log("sum:", sum);
}
setTimeout(start, 1000);πΏ μμΈμ²λ¦¬
Β
βοΈ μ€λ₯λ₯Ό κ°μ§λ₯Ό λͺ»νλ€λ..
try {
setTimeout(function() {
throw 'error';
}, 10)
} catch(e) {
console.log(e);
console.log('μλ¬ μ‘μλ€');
}πΏ μμΈ μ²λ¦¬ μ€λ₯ ν΄κ²°1
Β
λΉλκΈ° ν¨μ μμμ μμΈμ²λ¦¬
setTimeout(function() {
try {
throw 'error';
} catch(e) {
console.log(e);
console.log('μλ¬ μ‘μλ€');
}
}, 10);πΏ μμΈ μ²λ¦¬ μ€λ₯ ν΄κ²°2
function errorHandler(process) {
return function() {
try{
return process.apply(this, arguments);
console.log(arguments);
} catch(e) {
console.log(e);
console.log('μλ¬μμ 볡ꡬλλ€.');
}
};
}
setTimeout(errorHandler(function() {
throw 'μλ¬κ° λ°μνλ€!';
}), 1000);
πΉ Summary
Β - μ½λ°± ν¨μλ ν¨μμ μΈμλ‘ μ λ¬ λμ΄ μ΄λ²€νΈκ° λ°μ λλ©΄
Β Β λμ€μ μ€ν λ μλ μλ ν¨μ
Β - λκΈ° μ½λ°±κ³Ό λΉλκΈ° μ½λ°±μ΄ μλ€.
Β - DOM, AJAX, Web APIμμ μ μ©νκ² μ¬μ©λλ€.
Β - μ½λ°± μ§μ₯κ³Ό μμΈ μ²λ¦¬ μ€λ₯ λ¬Έμ κ° μλ€
Β