Seize your moment! ๐Ÿ‘พ

์•ˆ๋…•ํ•˜์„ธ์š”. Eric์ž…๋‹ˆ๋‹ค. ์ œ ๋ธ”๋กœ๊ทธ์— ๋ฐฉ๋ฌธํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ’ป ๊ฐœ๋ฐœ๊ณต๋ถ€/JavaScript

[Eric's JS] JavaScript์—์„œ ๋™๊ธฐ์™€ ๋น„๋™๊ธฐ์˜ ์ดํ•ด โ˜•๏ธ

Eric_ko 2023. 10. 15. 09:55

JavaScript๋ฅผ ๋ฐฐ์šฐ๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์ค‘์š”ํ•˜๊ฒŒ ์ ‘ํ•˜๊ฒŒ ๋˜๋Š” ๊ฐœ๋… ์ค‘ ํ•˜๋‚˜๋Š” ๋™๊ธฐ(synchronous)์™€ ๋น„๋™๊ธฐ(asynchronous)์˜ ์ฐจ์ด์ž…๋‹ˆ๋‹ค.

์ด ๊ธ€์—์„œ๋Š” ์ด ๋‘ ๊ฐœ๋…์˜ ์ฐจ์ด๋ฅผ ๊ธฐ๋ณธ์ ์ธ ์˜ˆ์‹œ๋ถ€ํ„ฐ ์‹ค์šฉ์ ์ธ ์˜ˆ์‹œ๊นŒ์ง€ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์„ค๋ช…ํ•ด ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.


1. ๊ธฐ๋ณธ ๊ฐœ๋…

๊ตฌ๋ถ„ ๋™๊ธฐ(Synchronous) ๋น„๋™๊ธฐ(Asynchronous)
๋™์ž‘ ์›๋ฆฌ ์ฝ”๋“œ๊ฐ€ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰. ํ•œ ์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋‹ค์Œ ์ž‘์—… ๋Œ€๊ธฐ. ์ฝ”๋“œ๋Š” ๋ฐ”๋กœ ๋‹ค์Œ ์ž‘์—…์œผ๋กœ ๋„˜์–ด๊ฐ€๋ฉฐ, ํŠน์ • ์ž‘์—…์˜ ์™„๋ฃŒ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Œ.
์žฅ์  ์ฝ”๋“œ์˜ ํ๋ฆ„์ด ๋ช…ํ™•ํ•˜๋ฉฐ ์˜ˆ์ธกํ•˜๊ธฐ ์‰ฝ๋‹ค. ์—ฌ๋Ÿฌ ์ž‘์—…์„ ๋™์‹œ์— ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅํ•˜์—ฌ ํšจ์œจ์ .
๋‹จ์  ๊ธด ์ž‘์—…์ด ์ง„ํ–‰๋˜๋Š” ๋™์•ˆ ์ „์ฒด ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ฉˆ์ถœ ์œ„ํ—˜์ด ์žˆ์Œ. ์ฝ”๋“œ์˜ ํ๋ฆ„์ด ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ๊ณ , ์ฝœ๋ฐฑ, ํ”„๋กœ๋ฏธ์Šค ๋“ฑ์˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ์ดํ•ด ํ•„์š”.

2. ๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ

2-1. ๋™๊ธฐ(Synchronous)

์„ค๋ช…:

๋™๊ธฐ ์ฝ”๋“œ๋Š” ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ํ•œ ํ•จ์ˆ˜๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋‹ค์Œ ํ•จ์ˆ˜๋Š” ๊ธฐ๋‹ค๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ ์˜ˆ์‹œ:

function firstFunction() {
  console.log("1. ์ฒซ ๋ฒˆ์งธ ํ•จ์ˆ˜ ์‹คํ–‰");
}

function secondFunction() {
  console.log("2. ๋‘ ๋ฒˆ์งธ ํ•จ์ˆ˜ ์‹คํ–‰");
}

firstFunction();
secondFunction();

๋น„์œ :

๋‹น์‹ ์ด ์นดํŽ˜์— ๊ฐ€์„œ ์•„๋ฉ”๋ฆฌ์นด๋…ธ๋ฅผ ์ฃผ๋ฌธํ–ˆ๋‹ค๊ณ  ์ƒ์ƒํ•ด๋ณด์„ธ์š”. ์ด ์นดํŽ˜๋Š” ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์ฃผ๋ฌธ๋งŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์˜ ์ฃผ๋ฌธ์„ ๋ฐ›์œผ๋ฉด ๋ฐ”๋ฆฌ์Šคํƒ€๋Š” ๋‹น์‹ ์˜ ์ฃผ๋ฌธ์„ ์™„๋ฃŒํ•  ๋•Œ๊นŒ์ง€ ๋‹ค๋ฅธ ๊ณ ๊ฐ์˜ ์ฃผ๋ฌธ์„ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•„๋ฉ”๋ฆฌ์นด๋…ธ๊ฐ€ ์ค€๋น„๋  ๋•Œ๊นŒ์ง€ ๋ชจ๋“  ๊ฒƒ์€ ์ •์ง€ ์ƒํƒœ์ž…๋‹ˆ๋‹ค.

2-2. ๋น„๋™๊ธฐ(Asynchronous)

์„ค๋ช…:

๋น„๋™๊ธฐ ์ฝ”๋“œ๋Š” ํŠน์ • ์ฝ”๋“œ์˜ ์™„๋ฃŒ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋‹ค์Œ ์ฝ”๋“œ๋กœ ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค.

์ฝ”๋“œ ์˜ˆ์‹œ:

function firstFunction(callback) {
  setTimeout(function() {
    console.log("1. ์ฒซ ๋ฒˆ์งธ ํ•จ์ˆ˜ ์‹คํ–‰");
    callback();
  }, 1000);
}

function secondFunction() {
  console.log("2. ๋‘ ๋ฒˆ์งธ ํ•จ์ˆ˜ ์‹คํ–‰");
}

firstFunction(secondFunction);

๋น„์œ :

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


3. ์‹ค ์‚ฌ์šฉ ์˜ˆ: ์›น ์‚ฌ์ดํŠธ ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ

์›น ํŽ˜์ด์ง€์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋”ฉํ•  ๋•Œ ๋™๊ธฐ์™€ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์˜ ์ฐจ์ด๋ฅผ ํ™•์‹คํžˆ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3-1. ๋™๊ธฐ ๋ฐฉ์‹์˜ ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ:

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

์ฝ”๋“œ ์˜ˆ์‹œ:

const data = loadDataFromServer();  // ๋™๊ธฐ์ ์œผ๋กœ ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ ๋กœ๋“œ
displayData(data);                  // ๋ฐ์ดํ„ฐ ํ‘œ์‹œ

์ด๋Ÿฐ ๋ฐฉ์‹์—์„œ ๋ฌธ์ œ๋Š”, ๋งŒ์•ฝ loadDataFromServer ํ•จ์ˆ˜๊ฐ€ ๋„คํŠธ์›Œํฌ ์ง€์—ฐ ๋˜๋Š” ์„œ๋ฒ„ ๋ฌธ์ œ๋กœ ์ธํ•ด ๊ธด ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค๋ฉด, ์‚ฌ์šฉ์ž๋Š” ์›น ํŽ˜์ด์ง€๊ฐ€ "๋ฉˆ์ถ˜" ๊ฒƒ์ฒ˜๋Ÿผ ๋Š๋‚„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3-2. ๋น„๋™๊ธฐ ๋ฐฉ์‹์˜ ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ:

๋ฐ˜๋ฉด์—, ๋น„๋™๊ธฐ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ์›น ํŽ˜์ด์ง€๋Š” ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ์˜ ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ๋„ ๋‹ค๋ฅธ ์ž‘์—…๋“ค์„ ๊ณ„์†ํ•ด์„œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ์›น ํŽ˜์ด์ง€๊ฐ€ ๋ฐ˜์‘ํ•˜๋Š” ๊ฒƒ์„ ๊ณ„์† ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ณ , ๋ฐ์ดํ„ฐ๊ฐ€ ๋กœ๋“œ๋˜๋ฉด ํ™”๋ฉด์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ ์˜ˆ์‹œ:

loadDataFromServerAsync(function(data) {
  displayData(data);
});

๋˜๋Š” ์ตœ๊ทผ์˜ JavaScript์—์„œ๋Š” async/await๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค:

async function displayDataFromServer() {
  const data = await loadDataFromServerAsync();
  displayData(data);
}

displayDataFromServer();

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


๊ฒฐ๋ก 

JavaScript์—์„œ ๋™๊ธฐ์™€ ๋น„๋™๊ธฐ์˜ ๊ฐœ๋…์€ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์—์„œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์„ ํšจ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธ€์„ ํ†ตํ•ด ๋™๊ธฐ์™€ ๋น„๋™๊ธฐ์˜ ์ฐจ์ด์™€ ์‚ฌ์šฉ๋ฒ•์— ๋Œ€ํ•œ ๊ธฐ๋ณธ์ ์ธ ์ดํ•ด๋ฅผ ์–ป์—ˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.