๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ“ฐ ์–ธ์–ด/JS

๋น„๋™๊ธฐ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ(1) - ๋™๊ธฐvs๋น„๋™๊ธฐ, ์ฝœ๋ฐฑ

์ฑ… <๋Ÿฌ๋‹์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ>๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ๋ฐฐ์šด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

 

๋ชฉ์ฐจ

  • <๋™๊ธฐ์‹ ์ฒ˜๋ฆฌ ๋ชจ๋ธ vs ๋น„๋™๊ธฐ์‹ ์ฒ˜๋ฆฌ ๋ชจ๋ธ>
  • <๋น„๋™๊ธฐ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ(1)- ์ฝœ๋ฐฑ>
  • 1. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋น„๋™๊ธฐ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ
  • 2. ์ฝœ๋ฐฑ
  • 2-1) ์Šค์ฝ”ํ”„์™€ ๋น„๋™๊ธฐ์  ์‹คํ–‰
  • 2-2) ์˜ค๋ฅ˜ ์šฐ์„  ์ฝœ๋ฐฑ
  • 2-3) ์ฝœ๋ฐฑ ํ—ฌ

 

<๋™๊ธฐ์‹ ์ฒ˜๋ฆฌ ๋ชจ๋ธ vs ๋น„๋™๊ธฐ์‹ ์ฒ˜๋ฆฌ ๋ชจ๋ธ>

๋™๊ธฐ์‹ ์ฒ˜๋ฆฌ ๋ชจ๋ธ(Synchronous processing model)์€ ์ง๋ ฌ์ ์œผ๋กœ ํƒœ์Šคํฌ(task)๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์ฆ‰, ํƒœ์Šคํฌ๋Š” ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋˜๋ฉฐ ์–ด๋–ค ์ž‘์—…์ด ์ˆ˜ํ–‰ ์ค‘์ด๋ฉด ๋‹ค์Œ ์ž‘์—…์€ ๋Œ€๊ธฐํ•˜๊ฒŒ ๋œ๋‹ค. ์„œ๋ฒ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๊ณ  ๋ฐ์ดํ„ฐ๊ฐ€ ์‘๋‹ต๋  ๋•Œ๊นŒ์ง€ ์ดํ›„ ํƒœ์Šคํฌ๋“ค์€ ๋ธ”๋กœํ‚น(blocking, ์ž‘์—… ์ค‘๋‹จ)๋œ๋‹ค.

๋™๊ธฐ์‹ ์ฒ˜๋ฆฌ ๋ชจ๋ธ

#๋™๊ธฐ์‹์œผ๋กœ ๋™์ž‘ - ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋จ.

function func1() {
  console.log('func1');
  func2();
}

function func2() {
  console.log('func2');
  func3();
}

function func3() {
  console.log('func3');
}

func1();

๋น„๋™๊ธฐ์‹ ์ฒ˜๋ฆฌ ๋ชจ๋ธ(Asynchronous processing model ๋˜๋Š” Non-Blocking processing model)์€ ๋ณ‘๋ ฌ์ ์œผ๋กœ ํƒœ์Šคํฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์ฆ‰, ํƒœ์Šคํฌ๊ฐ€ ์ข…๋ฃŒ๋˜์ง€ ์•Š์€ ์ƒํƒœ๋ผ ํ•˜๋”๋ผ๋„ ๋Œ€๊ธฐํ•˜์ง€ ์•Š๊ณ  ๋‹ค์Œ ํƒœ์Šคํฌ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

๋น„๋™๊ธฐ์‹ ์ฒ˜๋ฆฌ ๋ชจ๋ธ

#๋น„๋™๊ธฐ์‹์œผ๋กœ ๋™์ž‘ - ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋˜์ง€ ์•Š์Œ.

function func1() {
  console.log('func1');
  func2();
}

function func2() {
  setTimeout(function() {
    console.log('func2');
  }, 0);

  func3();
}

function func3() {
  console.log('func3');
}

func1();

 

<๋น„๋™๊ธฐ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ(1) - ์ฝœ๋ฐฑ>

1. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋น„๋™๊ธฐ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋‹จ์ผ ์Šค๋ ˆ๋“œ์—์„œ ๋™์ž‘ํ•ด ํ•œ ๋ฒˆ์— ํ•œ ๊ฐ€์ง€ ์ผ๋งŒ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๋•Œ๋ฌธ์— ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ๋™์ž‘ํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์—ฌ๋Ÿฌ ๋ฌธ์ œ๋ฅผ ๋น„๋™๊ธฐ์  ๊ด€์ ์—์„œ ์ƒ๊ฐํ•ด์•ผ ํ•œ๋‹ค. ์‚ฌ์šฉ์ž ์ž…๋ ฅ ์™ธ์—, ๋น„๋™๊ธฐ์  ํ…Œํฌ๋‹‰์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ํฌ๊ฒŒ ์„ธ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

  • Ajax ํ˜ธ์ถœ์„ ๋น„๋กฏํ•œ ๋„คํŠธ์›Œํฌ ์š”์ฒญ
  • ํŒŒ์ผ์„ ์ฝ๊ณ  ์“ฐ๋Š” ๋“ฑ์˜ ํŒŒ์ผ์‹œ์Šคํ…œ ์ž‘์—…
  • ์˜๋„์ ์œผ๋กœ ์‹œ๊ฐ„ ์ง€์—ฐ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ(์•Œ๋žŒ ๋“ฑ)

 

2. ์ฝœ๋ฐฑ

  • ํŠน์ • ํ•จ์ˆ˜์— ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ๋œ ํ•จ์ˆ˜๋ฅผ ์˜๋ฏธํ•˜๊ณ , ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌ๋ฐ›์€ ํ•จ์ˆ˜์•ˆ์—์„œ ํ˜ธ์ถœ๋œ๋‹ค. ๊ฐ„๋‹จํžˆ ๋งํ•ด ๋‚˜์ค‘์— ํ˜ธ์ถœํ•  ํ•จ์ˆ˜์ด๋‹ค.
  • ์‚ฌ์šฉ์ž ์ž…๋ ฅ, Timeout ์ฒ˜๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.
  • ๋ณดํ†ต ์ต๋ช… ํ•จ์ˆ˜๋กœ ์‚ฌ์šฉํ•œ๋‹ค.
  • ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ๋™์ž‘์„ ๊ตฌํ˜„ํ•˜๋ฉด ์ฒ˜๋ฆฌ๊ฐ€ ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ฒ˜๋ฆฌ๊ฐ€ ๋๋‚˜๋Š” ์‹œ์ ์—์„œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ์ฆ‰, ์ •๋ง๋กœ ํ•„์š”ํ•  ๋•Œ๋งŒ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์„œ ํšจ์œจ์ด ์ข‹๊ณ  ์›น์‚ฌ์ดํŠธ์—์„œ๋„ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋™์ž‘์„ ๋™์‹œ์— ํ•  ์ˆ˜ ์žˆ๋‹ค.
// ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ๋  callback๋งค๊ฐœ๋ณ€์ˆ˜ ์„ค์ •
function plus(a, b, callback) {  
  var sum = a + b;
  callback(sum);
}  

// plus ํ•จ์ˆ˜์— ์ต๋ช… ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ์ „๋‹ฌ
plus(1, 2, function(result) {
  console.log(result);         
});

//์ถœ๋ ฅ
3

 

2-1) ์Šค์ฝ”ํ”„์™€ ๋น„๋™๊ธฐ์  ์‹คํ–‰

function countdown(){
    let i;
    for(i=5;i>=0;i--){
        setTimeout(function()){
            console.log(i===0?"Go":i);
        }, (5-i)*1000;
    }
}
countdown();

์œ„ ์ฝ”๋“œ์˜ ๊ฒฐ๊ณผ๋Š” ์˜ˆ์ƒํ•œ ๊ฒƒ์ฒ˜๋Ÿผ 5์—์„œ ์นด์šดํŠธ๋‹ค์šด์„ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, -1์ด ์—ฌ์„ฏ ๋ฒˆ ๋ฐ˜๋ณต๋œ๋‹ค. ์ฝ”๋“œ์˜ ๋ฌธ์ œ์ ์€ i๊ฐ€ for๋ฌธ ๋ฐ–์—์„œ ์„ ์–ธ๋˜์–ด for ๋ฃจํ”„๊ฐ€ ์‹คํ–‰์„ ๋งˆ์น˜๊ณ  i๊ฐ€ -1ํ›„์— ์ฝœ๋ฐฑ์ด ์‹คํ–‰๋œ๋‹ค๋Š” ์ ์ด๋‹ค. ์ด๋Š” IIFE ๋˜๋Š” i๋ฅผ for๋ฃจํ”„ ์„ ์–ธ๋ถ€์—์„œ ์„ ์–ธํ•˜๋ฉด ํ•ด๊ฒฐ๋œ๋‹ค.

 

2-2) ์˜ค๋ฅ˜ ์šฐ์„  ์ฝœ๋ฐฑ

  • ์˜ค๋ฅ˜ ์šฐ์„  ์ฝœ๋ฐฑ์€ ์ฝœ๋ฐฑ๊ณผ ๊ด€๋ จ๋œ ์—๋Ÿฌ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋ฐฉ๋ฒ•์˜ ํ‘œ์ค€์œผ๋กœ ์ฝœ๋ฐฑ์˜ ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜์— ์—๋Ÿฌ ๊ฐ์ฒด๋ฅผ ์“ฐ๋ฉด ๋œ๋‹ค.
  • ์˜ค๋ฅ˜ ์šฐ์„  ์ฝœ๋ฐฑ์—์„œ ๊ฐ€์žฅ ๋จผ์ € ํ•˜๋Š” ์ผ์€ ์—๋Ÿฌ๊ฐ์ฒด์ธ err๊ฐ€ ์ฐธ ๊ฐ™์€ ๊ฐ’์ด๋ผ๋ฉด ํŒŒ์ผ์„ ์ฝ๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ ์ฝ˜์†”์— ์˜ค๋ฅ˜๋ฅผ ๋ณด๊ณ ํ•˜๊ณ  ์ฆ‰์‹œ ๋น ์ ธ๋‚˜์˜ค๋Š” ๊ฒƒ์ด๋‹ค.
#์—๋Ÿฌ๊ฐ์ฒด = err
const fs = require('fs');

const frame = 'may_or_maynot_exist.txt'
fs.readFile(frame, function(err, date){
    if(err) return console.error('error message');
});

 

2-3) ์ฝœ๋ฐฑ ํ—ฌ : ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋กœ์ง์„ ์œ„ํ•ด ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์—ฐ์†ํ•ด์„œ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ