๐Ÿง Blocking vs Non-Blocking๊ณผ Synchronous vs Asynchronous

๋ฐ•์ƒ์€ยท2022๋…„ 6์›” 24์ผ
0

๋“ค์–ด๊ฐ€๊ธฐ์— ์•ž์„œ... ๋ธ”๋กœํ‚น๊ณผ ๋…ผ๋ธ”๋กœํ‚น์€ ์™€๋‹ฟ๊ฒŒ ์ดํ•ด๊ฐ€ ๊ฐ€๋Š”๋ฐ ๋™๊ธฐ์™€ ๋น„๋™๊ธฐ๋Š” ์ดํ•ด๊ฐ€ ๊ฐ€์ง€ ์•Š์•„์„œ ์ •ํ™•ํ•˜์ง€ ์•Š์€ ์ •๋ณด๋“ค์ด ๋“ค์–ด๊ฐ€ ์žˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ธ”๋กœํ‚น๊ณผ ๋…ผ๋ธ”๋กœํ‚น & ๋™๊ธฐ์™€ ๋น„๋™๊ธฐ๋Š” ์™„์ „ํžˆ ๋ณ„๊ฐœ์˜ ๊ฐœ๋…์ด๋‹ค. ( ์œ ์‚ฌํ•œ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง„ ๊ฐœ๋…์ธ๊ฑฐ์ง€ ์„œ๋กœ ์—ฐ๊ด€๊ด€๊ณ„๋Š” ์ „ํ˜€ ์—†๋‹ค. )
๊ทธ๋ƒฅ "๋ธ”๋กœํ‚น + ๋™๊ธฐ" ๋˜๋Š” "๋…ผ๋ธ”๋กœํ‚น + ๋น„๋™๊ธฐ"๋ฅผ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ™์€ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง„๋‹ค or ์—ฐ๊ด€๊ด€๊ณ„๊ฐ€ ์žˆ๋‹ค๊ณ  ์ฐฉ๊ฐํ•˜๋Š” ๊ฒƒ๋ฟ์ด๋‹ค.

๐Ÿคœ๐Ÿค› Blocking vs Non-Blocking

๋ธ”๋กœํ‚น์€ ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜๊ฐ€ ์ž์‹ ์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ์ œ์–ด๊ถŒ์„ ๊ฐ–๋Š” ๊ฒƒ์„ ์˜๋ฏธ
๋…ผ๋ธ”๋กœํ‚น์€ ์ œ์–ด๊ถŒ์€ ๋ณธ์ธ์ด ๊ฐ€์ง€๊ณ  ์‹คํ–‰์€ ์•Œ์•„์„œ ์‹คํ–‰ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธ

function outer() {
  inner1();
  inner2();
  inner3();
  
  /**
   * ๋งŒ์•ฝ ๋ธ”๋กœํ‚น์ผ ๊ฒฝ์šฐ์— inner1()์„ ์‹คํ–‰ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋งŒ๋‚  ๊ฒฝ์šฐ ์ œ์–ด๊ถŒ์„ inner1()์œผ๋กœ ๋„˜๊ฒจ์ค€๋‹ค.
   * ๋˜ํ•œ inner1()์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ์ œ์–ด๊ถŒ์„ ์–ป์ง€ ๋ชปํ•ด์„œ ๋‹ค์Œ ์ฝ”๋“œ๋กœ ๋„˜์–ด๊ฐˆ ์ˆ˜ ์—†๋‹ค. ( ์ฆ‰, inner2()๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์—†๋‹ค. )
   */
   
  /**
   * ๋งŒ์•ฝ ๋…ผ๋ธ”๋กœํ‚น์ผ ๊ฒฝ์šฐ์— ์ œ์–ด๊ถŒ์€ outer()๊ฐ€ ๊ณ„์† ๊ฐ–๊ณ  inner1(), inner2(), inner3()์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ์— ๊ด€์—ฌํ•˜์ง€ ์•Š๊ณ  ๊ณ„์† ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
   */
}

const inner1 = () => console.log("inner1()");
const inner2 = () => console.log("inner2()");
const inner3 = () => console.log("inner3()");

outer();

๐Ÿค Synchronous vs Asynchronous

๋™๊ธฐ๋Š” ์š”์ฒญ๊ณผ ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์„ ์˜๋ฏธ
๋…ผ๋ธ”๋กœํ‚น์€ ์š”์ฒญ์€ ํ•˜๋˜ ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๋Š” ๊ฒƒ์„ ์˜๋ฏธ

๋™๊ธฐ๋Š” ์ž‘์—… ์™„๋ฃŒ ์—ฌ๋ถ€๋ฅผ ์‹ ๊ฒฝ ์“ด๋‹ค. ( ์‹ ๊ฒฝ ์“ด๋‹ค => ๊ธฐ๋‹ค ๋ฆฐ๋‹ค or ํ™•์ธํ•œ๋‹ค )
๋น„๋™๊ธฐ๋Š” ์ž‘์—… ์™„๋ฃŒ ์—ฌ๋ถ€๋ฅผ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๋Š”๋‹ค. ( callback()์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค. )

const fs = require('fs');

// ๋น„๋™๊ธฐ "fs.readFile()"์˜ ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
const result1 = fs.readFile("๊ฒฝ๋กœ");
console.log("๋‹ค์Œ ์‹คํ–‰");

// ๋™๊ธฐ "fs.readFileSync()"์˜ ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
const result2 = fs.readFileSync("๊ฒฝ๋กœ");
console.log("๋‹ค์Œ ์‹คํ–‰");

// ๋น„๋™๊ธฐ๋Š” ์–ด๋–ค ์‹คํ–‰์— ๋Œ€ํ•œ ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์œผ๋ฏ€๋กœ ๋Œ€๋ถ€๋ถ„ callbackํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•œ๋‹ค.
const callback = () => console.log("์ฝœ๋ฐฑ ํ•จ์ˆ˜ ์‹คํ–‰");
setTimeout(callback, 1000);

๐Ÿ˜’ Blocking + Synchronous

ํ•จ์ˆ˜ ์ฒ˜๋ฆฌ๋ฅผ ์‹œ์ž‘ํ•˜๋ฉด ํ•จ์ˆ˜์—๊ฒŒ ์ œ์–ด๊ถŒ์„ ๋„˜๊ฒจ์ฃผ๊ณ  ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.

๊ฐ€์žฅ ์ง๊ด€์ ์œผ๋กœ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ์ง€๋งŒ ์‹คํ–‰ํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ๋๋‚  ๋•Œ๊นŒ์ง€ ๋‹ค๋ฅธ ํ–‰์œ„๋ฅผ ํ•˜์ง€ ๋ชปํ•˜๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

const callback = (v) => console.log(v);

// ์•„๋ž˜ ์ฒ˜๋Ÿผ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋™๊ธฐ์ฒ˜๋Ÿผ ๋ณด์ด๋„๋ก ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
// ๋˜ํ•œ ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.
(async () => {
  // "fetch(1)" => "fetch(2)" => "fetch(3)" ์ˆœ์„œ๋กœ ๋จผ์ € ์‹คํ–‰ ํ›„ ๋‹ค์Œ ์ฝ”๋“œ ์‹คํ–‰
  // ์ฆ‰, ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค.
  // ํ•˜์ง€๋งŒ ๋‹จ์ ์œผ๋กœ๋Š” ๋™์‹œ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ajax ์š”์ฒญ์ž„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ํ•˜๋‚˜์˜ ์‘๋‹ต์ด ์˜ฌ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋Š” ์‹œ๊ฐ„์ ์ธ ์†ํ•ด๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ( ์†๋„๊ฐ€ ๋Š๋ ค์ง )
  await fetch("https://jsonplaceholder.typicode.com/posts/1").then(result => result.json()).then(callback);
  await fetch("https://jsonplaceholder.typicode.com/posts/2").then(result => result.json()).then(callback);
  await fetch("https://jsonplaceholder.typicode.com/posts/3").then(result => result.json()).then(callback);

  console.log("๋‹ค๋ฅธ ์ฒ˜๋ฆฌ 1");
  console.log("๋‹ค๋ฅธ ์ฒ˜๋ฆฌ 2");
  console.log("๋‹ค๋ฅธ ์ฒ˜๋ฆฌ 3");
})();
// ๊ฒฐ๊ณผ => fetch()์˜ ๊ฒฐ๊ด๊ฐ’ 3๊ฐœ, ๋‹ค๋ฅธ ์ฒ˜๋ฆฌ 1, ๋‹ค๋ฅธ ์ฒ˜๋ฆฌ 2, ๋‹ค๋ฅธ ์ฒ˜๋ฆฌ 3

๐Ÿ˜ฎ Non-Blocking + Asynchronous

ํ•จ์ˆ˜ ์ฒ˜๋ฆฌ๋ฅผ ์‹œ์ž‘ํ•˜๋ฉด ์ฒ˜๋ฆฌํ•˜๋ผ๋Š” ์š”์ฒญ๋งŒ ํ•˜๊ณ  ๋‹ค์Œ ์‹คํ–‰์œผ๋กœ ๋„˜์–ด๊ฐ„๋‹ค. ๋˜ํ•œ ์‘๋‹ต์€ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค.

const callback = (v) => console.log(v);

// ๊ฐ "fetch()"์— ๋Œ€ํ•œ ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
fetch("https://jsonplaceholder.typicode.com/posts/1").then(result => result.json()).then(callback);
fetch("https://jsonplaceholder.typicode.com/posts/2").then(result => result.json()).then(callback);
fetch("https://jsonplaceholder.typicode.com/posts/3").then(result => result.json()).then(callback);

console.log("๋‹ค๋ฅธ ์ฒ˜๋ฆฌ 1");
console.log("๋‹ค๋ฅธ ์ฒ˜๋ฆฌ 2");
console.log("๋‹ค๋ฅธ ์ฒ˜๋ฆฌ 3");
// ๊ฒฐ๊ณผ => ๋‹ค๋ฅธ ์ฒ˜๋ฆฌ 1, ๋‹ค๋ฅธ ์ฒ˜๋ฆฌ 2, ๋‹ค๋ฅธ ์ฒ˜๋ฆฌ 3, fetch()์˜ ๊ฒฐ๊ด๊ฐ’ 3๊ฐœ
// ๋‹จ, fetch()์˜ ๊ฒฐ๊ด๊ฐ’์€ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค. ( 1, 2, 3 ์ˆœ์„œ๋กœ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด๋„ 1, 2, 3 ์ˆœ์„œ๋กœ ์‘๋‹ตํ•˜์ง€ ์•Š๋Š”๋‹ค. )

๐Ÿ‘‡ ์ฐธ๊ณ ํ•œ ํฌ์ŠคํŠธ

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