๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์‹œ๋„/Code-States

[D+64] ๋น„๋™๊ธฐํ˜ธ์ถœ๋กœ ์ˆœ์„œ์ œ์–ดํ•˜๊ธฐ

by ๐Ÿ‡๋ฐ•๋ด‰๋ด‰๐Ÿ‡ 2020. 12. 21.

 

D+64

-  ๋น„๋™๊ธฐํ˜ธ์ถœ๋กœ ์ˆœ์„œ ์ œ์–ดํ•˜๊ธฐ -

(๋น„๋™๊ธฐ vs ๋™๊ธฐ ๊ทธ๋ฆฌ๊ณ  ๋…ผ๋ธ”๋กœํ‚น vs ๋ธ”๋กœํ‚น,๋น„๋™๊ธฐ ์ˆœ์„œ์ œ์–ด)

 


 

 

๋น„๋™๊ธฐ vs ๋™๊ธฐ ๊ทธ๋ฆฌ๊ณ  ๋…ผ๋ธ”๋กœํ‚น vs ๋ธ”๋กœํ‚น

๋น„๋™๊ธฐ์— ๊ด€ํ•ด ์•Œ์•„๋ณด๊ธฐ์ „์— ์šฐ๋ฆฌ๋Š” ๋™๊ธฐ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ธ”๋กœํ‚น์— ๊ด€ํ•ด์„œ๋„ ์•Œ์•„์•ผํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

 

์„œ๋กœ ๋น„์Šทํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ํŠน์ง•์ด ์žˆ์œผ๋‹ˆ ์ž˜ ๊ธฐ์–ตํ•ด ๋‘์–ด์•ผ ํ•œ๋‹ค.

 

• ๋™๊ธฐ vs ๋น„๋™๊ธฐ : ์ฒ˜๋ฆฌํ•ด์•ผํ•  ์ž‘์—…๋“ค์„ ์–ด๋– ํ•œ ํ๋ฆ„์œผ๋กœ ์ฒ˜๋ฆฌํ•  ๊ฒƒ์ธ๊ฐ€

 

• ๋ธ”๋กœํ‚น vs ๋…ผ๋ธ”๋กœํ‚น : ์ฒ˜๋ฆฌ๋˜์–ด์•ผํ•˜๋Š” ์ž‘์—…์ด ์ „์ฒด์ ์ธ ์ž‘์—…์˜ ํ๋ฆ„์„ ๋ง‰๋Š๋ƒ ์•ˆ๋ง‰๋Š๋ƒ

 

์ด ๋‘๊ฐ€์ง€์— ๋Œ€ํ•ด ๊ธฐ์–ตํ• ๋•Œ 'ํ๋ฆ„'์— ๋Œ€ํ•ด์„œ ์ดํ•ดํ•œ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

 

 

๋™๊ธฐ vs ๋น„๋™๊ธฐ
๊ฐ ๋ฐฉ์‹์˜ ์—…๋ฌด ์ฒ˜๋ฆฌ

๋™๊ธฐ (Synchronous)

๋™๊ธฐ๋ฐฉ์‹์€ ์š”์ฒญ์ด ๋“ค์–ด์™”์„๋•Œ ๋“ค์–ด์˜จ ์ˆœ์„œ๋Œ€๋กœ ์ผ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ,

์œ„์˜ ์‚ฌ์ง„์„ ์˜ˆ๋กœ ๋“ค์–ด๋ณธ๋‹ค๋ฉด ๋งŒ์•ฝ ๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ์ปคํ”ผ๋ฅผ ์ฃผ๋ฌธ๋ฐ›๋Š”๋‹ค๋ฉด 

ํ•œ์‚ฌ๋žŒ์ด ์ปคํ”ผ๋ฅผ ์ฃผ๋ฌธํ•˜๋ฉด ์ฃผ๋ฌธ๋ฐ›์€ ์‚ฌ๋žŒ์ด ์ปคํ”ผ๋ฅผ ๋ฐ”๋กœ ๋งŒ๋“ค๊ณ  ๋‚œ ํ›„์—์•ผ ๋‹ค์Œ ์ฃผ๋ฌธ์„ ๋ฐ›์„ ๊ฒƒ์ด๋‹ค.

 

์ฆ‰, ํ•œ ์†๋‹˜์ด ์Œ๋ฃŒ๋ฅผ ์ฃผ๋ฌธํ•˜๋ฉด ๋‹ค๋ฅธ ์ฃผ๋ฌธ์„ ํ•œ๊บผ๋ฒˆ์— ๋ฐ›์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— 

์ˆœ์ฐจ์ ์ผ ์ˆ˜๋Š” ์žˆ์œผ๋‚˜ ์ผ์„ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ ๊ฝค๋‚˜ ๊ธด ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด๊ฒƒ์ด๋‹ค.

 

๋น„๋™๊ธฐ (Asynchronous) 

๋น„๋™๊ธฐ ๋ฐฉ์‹์€ ์š”์ฒญ์— ๋”ฐ๋ฅธ ์‘๋‹ต์„ ์ฆ‰์‹œ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์•„๋„, ๋Œ€์‹œ๊ธฐ๊ฐ„ ๋™์•ˆ ๋˜๋‹ค๋ฅธ ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹์ด๋‹ค.

 

๋งŒ์•ฝ ๋น„๋™๊ธฐ๋ฐฉ์‹์œผ๋กœ ์†๋‹˜์ด ์ปคํ”ผ๋ฅผ ์ฃผ๋ฌธํ•˜๋ฉด ์ปคํ”ผ๋ฅผ ์ฃผ๋ฌธ๋ฐ›๋Š” ์‚ฌ๋žŒ์ด ์ปคํ”ผ๋ฅผ ๋งŒ๋“œ๋Š” ์‚ฌ๋žŒ์—๊ฒŒ ์ผ์ฒ˜๋ฆฌ๋ฅผ ๋งก๊ธฐ๊ณ ,

๋‹ค์Œ ์†๋‹˜์˜ ์ฃผ๋ฌธ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ฃผ๋ฌธํ•œ ์†๋‹˜์€ ์ปคํ”ผ๋ฅผ ๋งŒ๋“œ๋Š” ์ ์›์—๊ฒŒ ์Œ๋ฃŒ๋ฅผ ๋ฐ›๋Š” ํ˜•์‹์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์–ด์ฉŒ๋ฉด ์ฃผ๋ฌธ์„ ๋ฐ›๊ณ  ๋ฐ”๋กœ์ฒ˜๋ฆฌํ•˜๋Š” ๋™๊ธฐ๋ฐฉ์‹๋ณด๋‹ค ์†๋„๊ฐ€ ๋Š๋ฆด ์ˆ˜๋Š” ์žˆ๊ฒ ์ง€๋งŒ

์—ฌ๋Ÿฌ๊ฐœ์˜ ์š”์ฒญ์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ์ƒํ™ฉ์—์„œ๋Š” ๋น„๋™๊ธฐ ๋ฐฉ์‹์ด ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ๋‹ค.

 

๋ธ”๋กœํ‚น(Blocking)

๋ธ”๋กœํ‚น์€ ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜๊ฐ€ ์ž์‹ ์˜ ์ž‘์—…์€ ๋ชจ๋‘ ๋๋‚ผ ๋•Œ ๊นŒ์ง€ ์ œ์–ด๊ถŒ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—

ํ•ด๋‹น ์—…๋ฌด๊ฐ€ ์ฒ˜๋ฆฌ๋  ๋™์•ˆ ํ•จ์ˆ˜๊ฐ€ ๋Œ€๊ธฐํ•˜๋„๋ก ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค.

 

๋…ผ๋ธ”๋กœํ‚น(Non-Blocking)

๋…ผ๋ธ”๋กœํ‚น์€ ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜๊ฐ€ ๋ฐ”๋กœ ๋ฆฌํ„ด์„ ํ•ด์„œ ํ˜ธ์ถœํ•œ ํ•จ์ˆ˜์—๊ฒŒ ์ œ์–ด๊ถŒ์„ ์ฃผ์–ด

๋‹ค๋ฅธ ์—…๋ฌด๋ฅผ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

 


๋น„๋™๊ธฐ ์ˆœ์„œ ์ œ์–ด

์œ„์— ์„ค๋ช…ํ–ˆ๋“ฏ์ด ๋น„๋™๊ธฐ๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ ์š”์ฒญ์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—

์‹คํ–‰์‹œ๊ฐ„์ด ๊ฐ๊ธฐ๋‹ค๋ฅธ ์—…๋ฌด๋ฅผ ์š”์ฒญํ–ˆ์„๋•Œ ์ˆœ์„œ๋Œ€๋กœ ์ผ์„ ์ œ์–ดํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋™์‹œ์— ์ผ์„ ์ฒ˜๋ฆฌํ•ด

์ž…๋ ฅํ•œ ์ˆœ์„œ๋Œ€๋กœ ๊ฒฐ๊ณผ๊ฐ’์ด ๋‚˜์˜ค๋Š” ๋™๊ธฐ์ ์ธ ๊ฐ’๊ณผ๋Š” ๋‹ฌ๋ฆฌ ๊ฐ€์žฅ ๋นจ๋ฆฌ ์ˆ˜ํ–‰ํ•œ ๊ฐ’๋ถ€ํ„ฐ ๊ฒฐ๊ณผ๊ฐ’์œผ๋กœ ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค.

 

์•„๋ž˜์˜ ์ด๋ฏธ์ง€์ฒ˜๋Ÿผ ๋™๊ธฐ๋Š” '1-2-3-4'์ˆœ์œผ๋กœ ๊ฐ’์„ ๋ฆฌํ„ดํ•œ๋‹ค๋ฉด,

๋น„๋™๊ธฐ๋Š” '2-4-3-1'์ˆœ์œผ๋กœ ๊ฐ’์„ ๋‚ด๋ณด๋‚ผ ๊ฒƒ์ด๋‹ค.

 

๋งŒ์•ฝ์— ์šฐ๋ฆฌ๊ฐ€ ๋น„๋™๊ธฐ๋ฅผ ๋™๊ธฐ์ฒ˜๋Ÿผ ์ž…๋ ฅํ•œ ์ˆœ์„œ๋Œ€๋กœ ๊ฐ’์„ ๋‚ด๋ณด๋‚ผ๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ?

 

๋ฐ”๋กœ ์šฐ๋ฆฌ๊ฐ€ ์ด๋ฒˆ์— ๋ฐฐ์›Œ๋‚˜๊ฐ€์•ผํ•  ๊ฐœ๋…๋“ค์ด๋‹ค.

 

1 > Callback

const printString = (string, callback) => {
  setTimeout(
    () => {
      console.log(string)
      callback()
    },
    Math.floor(Math.random() * 100) + 1
  )
}

const printAll = () => {
  printString('A', () => {
    printString('B', () => {
      printString('C', () => {})
    })
  })
}
printAll()

๋งŒ์•ฝ์— ์šฐ๋ฆฌ๊ฐ€ ์ž…๋ ฅํ•œ ๊ฐ’๋“ค์ด ์ˆœ์ฐจ์ ์œผ๋กœ ์˜ค๊ธฐ๋ฅผ ๋ฐ”๋ž€๋‹ค๋ฉด ์šฐ์„  Callback์„ ์‚ฌ์šฉํ•ด์„œ ๊ณ„์† ํ•จ์ˆ˜๋“ค์ด ์•ˆ์œผ๋กœ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

 

๊ทธ๋Ÿฐ๋ฐ ์ด๋Ÿฐ์‹์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜๋ฉด ์•ฝ๊ฐ„์˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

์ผ๋‹จ ์ ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ๋Š” ๊ดœ์ฐฎ์ง€๋งŒ ๋งŒ์•ฝ ๋‹ค๋Ÿ‰์˜ ์ •๋ณด๊ฐ€ ๋“ค์–ด์˜ค๊ฒŒ ๋œ๋‹ค๋ฉด ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์—ฐ์†์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์—

์ฝœ๋ฐฑํ—ฌ์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋Š”๋ฐ,

์ฝœ๋ฐฑํ—ฌ๋กœ ์ธํ•ด ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์งˆ ๋ฟ๋งŒ์•„๋‹ˆ๋ผ ์ถ”ํ›„์— ์ฝ”๋“œ์˜ ๋ณต์žก์„ฑ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๋‹ค.

 

์ด๋ฅผ ๋ณด์•ˆํ•˜๊ธฐ ์œ„ํ•ด ์ƒ๊ธด ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”๋ฐ ๋ฐ”๋กœ Promise์ด๋‹ค.

 

2-1 > Promise

ํ”„๋กœ๋ฏธ์Šค๋Š” ์ฝœ๋ฐฑํ—ฌ์„ ๋ฒ—์–ด๋‚˜๊ธฐ ์œ„ํ•œ ๊ธฐ์ˆ , ์ผ์ข…์˜ ์•ฝ์†์ด๋‹ค.

 

const printString = (string) => {
  return new Promise((resolve, reject) => {
    setTimeout(
      () => {
        console.log(string)
        resolve()
      },
      Math.floor(Math.random() * 100) + 1
    )
  })
}

const printAll = () => {
  printString('A')
  	.then(() => {
      return printString('B')
    })
    .then(() => {
      return printString('C')
    })
}    
printAll()

ํ”„๋กœ๋ฏธ์Šค๋Š” ์ฝœ๋ฐฑ์„ ์ธ์ž๋กœ ๋ฐ›๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ƒˆ๋กœ์šด ํ”„๋กœ๋ฏธ์Šค (new Promise)๋ฅผ ๋ฆฌํ„ดํ•˜๊ฒŒ ๋˜๋Š”๋ฐ

์ด๋•Œ์˜ ํ”„๋กœ๋ฏธ์Šค๋Š” ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ์ฝœ๋ฐฑ์œผ๋กœ ๋ฐ›๋Š”๋ฐ resolve, reject๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š” ์ฝœ๋ฐฑ์„ ๋„ฃ์–ด ์‹คํ–‰์„ ํ•œ๋‹ค.

 

์ด๋•Œ์˜ resolve๋Š” ์„ฑ๊ณตํ•œ ๋น„๋™๊ธฐ ์š”์ฒญ์„ ๋ฐ›์•„์„œ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๊ณ ,

reject๋Š” ์‹คํŒจํ•œ ๋น„๋™๊ธฐ ์—๋Ÿฌ๋ฅผ ๋ฐ›์•„์„œ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋œ๋‹ค.

 

A๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ฝœ๋ฐฑํ•จ์ˆ˜๋กœ ์ด์–ด๋‚˜๊ฐ€์ง€ ์•Š๊ณ  .then()์„ ์‚ฌ์šฉํ•ด ์ด์–ด๋‚˜๊ฐ€๊ฒŒ ๋œ๋‹ค.

 

์ด๋•Œ์˜ then์€ resolve๊ฐ’์„ ๋ฐ›์•„ ์‹คํ–‰ํ•˜๊ฒŒ ๋˜๊ณ 

์—ฌ๊ธฐ์„œ ๋‚˜์˜ค์ง„ ์•Š์•˜์ง€๋งŒ catch๋ผ๋Š” ๊ฒƒ๋„ ์žˆ๋Š”๋ฐ ์ด๋Š” reject๊ฐ’์˜ ์—๋Ÿฌ๋ฅผ ๋ฐ›๊ฒŒ๋œ๋‹ค.

 

2-2 > Promise์˜ ์„ธ๊ฐ€์ง€ ์ƒํƒœ

• Pendgin(๋Œ€๊ธฐ) : ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋กœ์ง์ด ์•„์ง ์™„๋ฃŒ๊ฐ€ ๋˜์ง€ ์•Š์€ ์ƒํƒœ

 

• Fulfilled(์ดํ–‰) : ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋˜์–ด ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์ค€ ์ƒํƒœ

 

• Rejected(์‹คํŒจ) : ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์‹คํŒจํ•˜๊ฑฐ๋‚˜ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ ์ƒํƒœ

 

3 > Aysnc await

function gotoHome() {
	return new Promise((resolve, reject) => {
    	setTimeout(() => {resolve('1. go to my home')}, 100)
    })
}

function sitAndCode() {
	return new Promise((resolve, reject) => {
    	setTimeout(() => {resolve('2. sit and code')}, 100)
    })
}

function eatLunch() {
	return new Promise((resolve, reject) => {
    	setTimeout(() => {resolve('3. eat lunch')}, 100)
    })
}

function goToBed() {
	return new Promise((resolve, reject) => {
    	setTimeout(() => {resolve('4. go to bed')}, 100)
    })
}

const result = async () => { // async๋ผ๊ณ  ๊ผญ ํ‘œ๊ธฐํ•˜๊ธฐ
	const one = await gotoHome();
    console.log(one)
    
    const two = await sitAndCode();
    console.log(two)
    
    const three = await eatLunch();
    console.log(three)
    
    const four = await goToBed();
    console.log(four)
}

result();

๋น„๋™๊ธฐ๋ฅผ ๋™๊ธฐ์ ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์œผ๋กœ

await๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ๊ผญ Async ํ•จ์ˆ˜๋ผ๋Š” ๊ฒƒ์„ ์•Œ๋ ค์ค˜์•ผํ•œ๋‹ค.

 

 

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€