λκΈ°/λΉλκΈ°

1. λκΈ° (Synchronous) λ 무μμΌκΉ?
- λκΈ° λ°©μμ μλ²μμ μμ²μ 보λμ λ μλ΅μ΄ λμμμΌ λ€μ λμμ μνν μ μλ€. μ¦, Aμμ μ΄ λͺ¨λ μ§ν λ λκΉμ§ Bμμ μ λκΈ°ν΄μΌνλ€.
μλ°μ€ν¬λ¦½νΈ μμ§μ λ¨ νλμ μ€ν 컨ν μ€νΈ μ€νμ κ°λλ€.
μ€ν μ€μΈ μ€ν 컨ν μ€νΈλ₯Ό μ μΈν λͺ¨λ μ€ν 컨ν μ€νΈλ λͺ¨λ μ€ν λκΈ° μ€μΈ νμ€ν¬λ€μ΄λ€.
λκΈ° μ€μΈ νμ€ν¬λ€μ νμ¬ μ€ν μ€μΈ μ€ν 컨ν μ€νΈκ° νλμ΄ μ€ν 컨ν μ€νΈ μ€νμμ μ κ±°λλ©΄, λ€μ λ§ν΄ νμ¬ μ€ν μ€μΈ ν¨μκ° μ’ λ£νλ©΄ λΉλ‘μ μ€νλκΈ° μμνλ€.
μλ°μ€ν¬λ¦½νΈ μμ§μ ν λ²μ νλμ νμ€ν¬λ§ μ€νν μ μλ μ±κΈ μ€λ λ (single thread) λ°©μμΌλ‘ λμνλ€.
μ±κΈ μ€λ λ λ°©μμ ν λ²μ νλμ νμ€ν¬λ§ μ€νν μ μκΈ° λλ¬Έμ μ²λ¦¬μ μκ°μ΄ 걸리λ νμ€ν¬λ₯Ό μ€ννλ κ²½μ° λΈλ‘νΉ blocking (μμ μ€λ¨) μ΄ λ°μνλ€.
//sleep ν¨μλ μΌμ μκ° (delay) μ΄ κ²½κ³Όν μ΄νμ μ½λ°± ν¨μ (func) λ₯Ό νΈμΆν¨.
function sleep(func, delay) {
// Date.now() λ νμ¬ μκ°μ μ«μ (ms) λ‘ λ°ννλ€.
const delayUntil = Date.now() + delay;
// νμ¬ μκ° (Date.now()) μ delay λ₯Ό λν delayUntil μ΄ νμ¬ μκ°λ³΄λ€ μμΌλ©΄ κ³μ λ°λ³΅ν¨
while (Date.now() < delayUntil);
// μΌμ μκ° (delay) μ΄ κ²½κ³Όν μ΄νμ μ½λ°± ν¨μ (func) λ₯Ό νΈμΆν¨
func();
}
function foo () {
console.log('foo');
}
function bar () {
console.log('bar');
}
// sleep ν¨μλ 3μ΄ μ΄μ μ€νλ¨
sleep(foo, 3 * 1000);
// bar ν¨μλ sleep ν¨μμ μ€νμ΄ μ’
λ£λ μ΄νμ νΈμΆλλ―λ‘ 3μ΄ μ΄μ λΈλ‘νΉλ¨
bar();
// (3μ΄ κ²½κ³Ό ν) foo νΈμΆ -> bar νΈμΆ
μ μ½λμ sleep ν¨μλ 3μ΄ νμ foo ν¨μλ₯Ό νΈμΆν¨.
μ΄λ bar ν¨μλ sleep ν¨μμ μ€νμ΄ μ’ λ£λ μ΄νμ νΈμΆλλ―λ‘ 3μ΄ μ΄μ (foo ν¨μμ μ€ν μκ° + 3μ΄) νΈμΆλμ§ λͺ»νκ³ λΈλ‘νΉ (μμ μ€λ¨) λ¨!!!
νμ¬ μ€ν μ€μΈ νμ€ν¬κ° μ’ λ£λ λκΉμ§ λ€μμ μ€νλ νμ€ν¬κ° λκΈ°νλ λ°©μμ λκΈ°(Synchronous) μ²λ¦¬λΌκ³ νλ€.
λκΈ° μ²λ¦¬ λ°©μμ νμ€ν¬λ₯Ό μμλλ‘ νλμ© μ²λ¦¬νλ―λ‘ μ€ν μμκ° λ³΄μ₯λλ€λ μ₯μ μ΄ μμ§λ§, μμ νμ€ν¬κ° μ’ λ£ν λκΉμ§ μ΄ν νμ€ν¬λ€μ΄ λΈλ‘νΉλλ€λ λ¨μ μ΄ μμ.
2. λΉλκΈ°(asynchronous) λ 무μμΌκΉ?
- λΉλκΈ° λ°©μμ λ°λλ‘ μμ²μ 보λμ λ μλ΅ μνμ μκ΄μμ΄ λ€μ λμμ μν ν μ μλ€. μ¦, Aμμ μ΄ μμνλ©΄ λμμ Bμμ μ΄ μ€νλλ€. Aμμ μ κ²°κ³Όκ°μ΄ λμ€λλλ‘ μΆλ ₯λλ€.
function foo () {
console.log ('foo');
}
function bar() {
console.log('bar');
}
// νμ΄λ¨Έ ν¨μ setTimeout μ μΌμ μκ°μ΄ κ²½κ³Όν μ΄νμ μ½λ°± ν¨μ foo λ₯Ό νΈμΆν¨
// νμ΄λ¨Έ ν¨μ setTimeout μ bar ν¨μλ₯Ό λΈλ‘νΉνμ§ μλλ€.
setTimeout(foo, 3 * 1000);
bar();
// bar νΈμΆ -> (3μ΄ κ²½κ³Ό ν) foo νΈμΆ
μ μ½λμ setTimeout ν¨μλ μμ μ΄ν΄λ³Έ sleep ν¨μμ μ μ¬νκ² μΌμ μκ°μ΄ κ²½κ³Όν μ΄νμ μ½λ°± ν¨μλ₯Ό νΈμΆνμ§λ§,
setTimeout ν¨μ μ΄νμ νμ€ν¬λ₯Ό λΈλ‘νΉνμ§ μκ³ κ³§λ°λ‘ μ€ννλ€.
νμ¬ μ€ν μ€μΈ νμ€ν¬κ° μ’ λ£λμ§ μμ μνλΌ ν΄λ λ€μ νμ€ν¬λ₯Ό κ³§λ°λ‘ μ€ννλ λ°©μμ λΉλκΈ° (asynchronous) μ²λ¦¬ λΌκ³ ν¨.
λΉλκΈ° μ²λ¦¬ λ°©μμ νμ¬ μ€ν μ€μΈ νμ€ν¬κ° μ’ λ£λμ§ μμ μνλΌ ν΄λ λ€μ νμ€ν¬λ₯Ό κ³§λ°λ‘ μ€ννλ―λ‘ λΈλ‘νΉμ΄ λ°μνμ§ μλλ€λ μ₯μ μ΄ μμ§λ§, νμ€ν¬μ μ€ν μμκ° λ³΄μ₯λμ§ μλ λ¨μ μ΄ μλ€.
νμ΄λ¨Έ ν¨μμΈ setTimeout κ³Ό setInterval, HTTP μμ², μ΄λ²€νΈ νΈλ€λ¬λ λΉλκΈ° μ²λ¦¬ λ°©μμΌλ‘ λμνλ€.
λΉλκΈ° μ²λ¦¬λ μ΄λ²€νΈ 루νμ νμ€ν¬ νμ κΉμ κ΄κ³κ° μλ€.