๐Ÿงฎ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐฉ์‹

์ด์ค€์„ยท2024๋…„ 6์›” 3์ผ

๊ฐœ๋… ์ •๋ฆฌ

๋ชฉ๋ก ๋ณด๊ธฐ
11/11

๐Ÿงฎ ๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐฉ์‹๊ณผ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐฉ์‹

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

๐Ÿงฎ ๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐฉ์‹

function displayA(){
  console.log("A");
}

function displayB(){
  console.log("B");
}

function displayC(){
  console.log("C");
}

displayA();
displayB();
displayC();

/*output 
A 
B 
C
*/

์œ„ ์˜ˆ์‹œ์—๋Š” 3๊ฐœ์˜ ํ•จ์ˆ˜๊ฐ€ ์žˆ๊ณ  ์ด๋“ค ํ•จ์ˆ˜๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰ํ•˜๋ฉด ์ฝ˜์†” ์ฐฝ์— A, B, C์˜ ์ˆœ์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

๐Ÿงฎ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ์–ธ์–ด.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์ž‘์—…๋งŒ ์ฒ˜๋ฆฌํ•˜๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ(single thread) ์–ธ์–ด์ž…๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ(thread)๋Š” ํ”„๋กœ์„ธ์Šค์—์„œ ์ž‘์—…์„ ์‹คํ–‰ํ•˜๋Š” ๋‹จ์œ„๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š”๋ฐ, ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋งŒ ์ฒ˜๋ฆฌํ•˜๋ฉด '์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ', ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, '๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ'๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—๋Š” ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์”ฉ๋งŒ ์ฒ˜๋ฆฌํ•˜๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์„ธ ๊ฐ€์ง€ ํ•จ์ˆ˜ ์ค‘์—์„œ ํŠน์ • ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋Š”๋ฐ ์‹œ๊ฐ„์ด ๋” ๊ฑธ๋ฆฐ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. setTimeout()ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์‹คํ–‰ ์‹œ๊ฐ„์„ ๋Šฆ์ถฐ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

function displayA(){
  console.log("A");
}

function displayB(){
  setTimeout(() => console.log("B"), 2000) ;
}

function displayC(){
  console.log("C");
}

displayA();
displayB();
displayC();

/*output 
A 
C
B 
*/

A์™€ C๋ฅผ ํ‘œ์‹œํ•˜๋Š” ํ•จ์ˆ˜๋Š” ์ฆ‰์‹œ ์‹คํ–‰๋˜์ง€๋งŒ, B๋ฅผ ํ‘œ์‹œํ•˜๋Š” ํ•จ์ˆ˜๋Š” 2์ดˆ ํ›„์— ์‹คํ–‰๋˜๋„๋ก ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ์ผ๋‹จ ์†Œ์Šค๋งŒ ์‚ดํŽด๋ณด๋ฉด ์ฝ˜์†” ์ฐฝ์— A๋ฅผ ํ‘œ์‹œํ•˜๊ณ , 2์ดˆ ํ›„์— B๋ฅผ ํ‘œ์‹œํ•œ ํ›„ ๋‹ค์‹œ C๋ฅผ ํ‘œ์‹œํ•  ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ 2์ดˆ๊ฐ€ ์•„๋‹ˆ๋ผ 30์ดˆ๋ผ๋ฉด ์‹œ๊ฐ„๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์‹œ์Šคํ…œ ์ž์›๋„ ๋งŽ์ด ๋‚ญ๋น„๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ค‘๊ฐ„์— ์‹œ๊ฐ„์ด ๋งŽ์ด ๊ฑธ๋ฆฌ๋Š” ์†Œ์Šค๊ฐ€ ์žˆ๋‹ค๋ฉด ๋ณ„๋„๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ , ๊ทธ ๋‹ค์Œ์— ์žˆ๋Š” ์†Œ์Šค๋ฅผ ๋จผ์ € ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ํ•จ์ˆ˜์˜ ์‹คํ–‰ ์‹œ๊ฐ„์— ๋”ฐ๋ผ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ๊ฒƒ์€ ๋ณ„๋„๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‹คํ–‰์ด ๋๋‚ฌ์„ ๋•Œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿงฎ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐฉ์‹

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

function displayB(callback){
  setTimeout(() => {
    console.log("B");
    callback(),
  }, 2000);
}

function displayC(){
  console.log("C");
}

displayA();
displayB(displayC)

/*output 
A 
B 
C
*/

์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด displayC() ํ•จ์ˆ˜๋Š” displayB() ํ•จ์ˆ˜์— ์ด์–ด์„œ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋ฏ€๋กœ displayB(displayC)์ฒ˜๋Ÿผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. displayC()์—๊ฒŒ ์ง„๋™๋ฒจ์„ ์ฃผ๋ฉด์„œ displayB()๊ฐ€ ๋๋‚˜๋ฉด ์‹คํ–‰ํ•˜๋„๋ก ํ•˜๋Š” ๊ฑฐ์ฃ . displayB()๋ผ๋Š” ํ•จ์ˆ˜์— displayC() ํ•จ์ˆ˜๋ฅผ ์ธ์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ์ด๊ฒƒ์„ '์ฝœ๋ฐฑ(callback)ํ•จ์ˆ˜'๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
์œ„์˜ ์˜ˆ์ œ๋ฅผ ์ฝ˜์†”์ฐฝ์—์„œ ํ™•์ธํ•˜๋ฉด A๋ฅผ ํ‘œ์‹œํ•˜๊ณ  ์ž ์‹œ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ B์™€ C๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋น„๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด ์ฝœ๋ฐฑํ•จ์ˆ˜, ํ”„๋กœ๋ฏธ์Šค, (async, await) ํฌ๊ฒŒ ์„ธ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿงฎ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์™€ ์ฝœ๋ฐฑ ํ•จ์ˆ˜

์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ž€, ๋‹ค๋ฅธ ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

-ํ•จ์ˆ˜ ์ด๋ฆ„์„ ์ฝœ๋ฐฑ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ
์ฝœ๋ฐฑ์œผ๋กœ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์‚ฌ์šฉ์ž๊ฐ€ ์ปคํ”ผ๋ฅผ ์ฃผ๋ฌธํ•œ ํ›„ 3์ดˆ ํ›„์— ์ปคํ”ผ๊ฐ€ ์ค€๋น„๋˜์—ˆ๋‹ค๊ณ  ์•Œ๋ ค ์ฃผ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

function order(coffee, callback) {
  console.log(`${coffee} ์ฃผ๋ฌธ ์ ‘์ˆ˜`);
  setTimeout(() =>{
    callback(coffee);
  }, 3000)
}

function display(result) {
  console.log(`${result} ์ค€๋น„ ์™„๋ฃŒ`);
}

order("์•„๋ฉ”๋ฆฌ์นด๋…ธ", display)
/*output 
์•„๋ฉ”๋ฆฌ์นด๋…ธ ์ฃผ๋ฌธ ์ ‘์ˆ˜
์•„๋ฉ”๋ฆฌ์นด๋…ธ ์ค€๋น„ ์™„๋ฃŒ
*/

์ฝœ๋ฐฑ์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ปคํ”ผ๊ฐ€ ์ค€๋น„๋˜์—ˆ๋‹ค๊ณ  ํ‘œ์‹œํ•˜๋Š” display() ํ•จ์ˆ˜๋ฅผ order() ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋„˜๊ธฐ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

-์ต๋ช…์œผ๋กœ ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ์ž‘์„ฑํ•˜๊ธฐ
์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํ•จ์ˆ˜ ์ด๋ฆ„๋„ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ํ•จ์ˆ˜ ์•ˆ์— ์ง์ ‘ ์ต๋ช… ํ•จ์ˆ˜๋กœ ์ž‘์„ฑํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด A๋ฅผ ํ‘œ์‹œํ•œ ํ›„ 1์ดˆ๋งˆ๋‹ค B, C, D, stop! ์ˆœ์„œ๋กœ ํ‘œ์‹œํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

function displayLetter(){
  console.log("A");
  setTimeout(() => {
    console.log("B")
    setTimeout(() => {
      console.log("C")
      setTimeout(() => {
        console.log("D")
        setTimeout(() => {
          console.log("stop!")
        },1000)
      }, 1000)
    }, 1000)
  }, 1000)
}

์ฝœ๋ฐฑ ํ•จ์ˆ˜์— ๋‹ค๋ฅธ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ๊ณ„์† ๋“ค์–ด๊ฐ€๋ฉด ์†Œ์Šค์˜ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง€๊ณ , ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ๋””๋ฒ„๊น…ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์ฝœ๋ฐฑ์ด ๊ณ„์† ๋ฐ˜๋ณต๋˜๋Š” ์ƒํƒœ๋ฅผ '์ฝœ๋ฐฑ ์ง€์˜ฅ(callback hell)'์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฏธ์ง€ ์ถœ์ฒ˜- https://makeameme.org/meme/asynchronous-synchronous#google_vignette
์›๋ฌธ ์ถœ์ฒ˜- Do it! ๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ •์„(์ด๋ฏธ์Šคํผ๋ธ”๋ฆฌ์‹ฑ)

profile
ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ ๊ณต๋ถ€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€