๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • What would life be If we had no courage to attemp anything?
Language/JavaScript

[JavaScript] ๋น„๋™๊ธฐ

by DevIseo 2023. 1. 17.

๋™๊ธฐ ์ฒ˜๋ฆฌ์™€ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ

JavaScript ์—”์ง„

  • ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ(signle thread) ๋ฐฉ์‹
  • cf. ๋ธŒ๋ผ์šฐ์ €๋Š” ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋กœ ๋™์ž‘!
    • ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ํƒœ์Šคํฌ๋งŒ ์‹คํ–‰
    • ์ฒ˜๋ฆฌ์— ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ํƒœ์Šคํฌ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ ๋ธ”๋กœํ‚น(์ž‘์—…์ค‘๋‹จ)์ด ๋ฐœ์ƒ

๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐฉ์‹

๐Ÿ’ก ํ˜„์žฌ ์‹คํ–‰์ค‘์ธ ํƒœ์Šคํฌ๊ฐ€ ์ข…๋ฃŒํ•  ๋•Œ ๊นŒ์ง€ ๋‹ค์Œ์— ์‹คํ–‰๋  ํƒœ์Šคํฌ๊ฐ€ ๋Œ€๊ธฐํ•˜๋Š” ๋ฐฉ์‹

 

  • ํƒœ์Šคํฌ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ํ•˜๋‚˜์”ฉ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ ์‹คํ–‰ ์ˆœ์„œ๊ฐ€ ๋ณด์žฅ๋จ
  • ์•ž์„  ํƒœ์Šคํฌ๊ฐ€ ์ข…๋ฃŒํ•  ๋•Œ๊นŒ์ง€ ์ดํ›„ ํƒœ์Šคํฌ๋“ค์ด ๋ธ”๋กœํ‚น ๋จ
/* ๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐฉ์‹
* ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ํƒœ์Šคํฌ๊ฐ€ ์ข…๋ฃŒํ•  ๋•Œ ๊นŒ์ง€ ๋‹ค์Œ์— ์‹คํ–‰๋  ํƒœ์Šคํฌ๊ฐ€ ๋Œ€๊ธฐํ•˜๋Š” ๋ฐฉ์‹
*/
//ํ•จ์ˆ˜ sleep์€ delay๊ฐ€ ๊ฒฝ๊ณผํ•œ ํ›„์— ์ฝœ๋ฐฑํ•จ์ˆ˜(func) ํ˜ธ์ถœ
function sleep(func, delay){
		//Date.now()๋Š” ํ˜„์žฌ ์‹œ๊ฐ„์„ ๋ฐ˜ํ™˜
    const delayUntil = Date.now() + delay
		//ํ˜„์žฌ ์‹œ๊ฐ„์— delay๋ฅผ ๋”ํ•œ delayUntil์ด ํ˜„์žฌ ์‹œ๊ฐ„๋ณด๋‹ค ์ž‘์œผ๋ฉด ๊ณ„์† ๋ฐ˜๋ณต
    while(Date.now() < delayUntil)
		//์ผ์ • ์‹œ๊ฐ„์ด ๊ฒฝ๊ณผํ•œ ์ดํ›„์— ์ฝœ๋ฐฑํ•จ์ˆ˜ ์‹คํ–‰
    func()
}
function foo(){
    console.log('foo')
}
function bar(){
    console.log('bar')
}
//slepp ํ•จ์ˆ˜๋Š” 3์ดˆ ์ด์ƒ ์‹คํ–‰
sleep(foo,3*1000)
// bar ํ•จ์ˆ˜๋Š” sleep์ด ์ข…๋ฃŒ๋œ ์ดํ›„์— ํ˜ธ์ถœ๋จ (3์ดˆ ์ด์ƒ blocking)
bar()
//3์ดˆ ์ด์ƒ ๊ฒฝ๊ณผ ํ›„ foo ํ˜ธ์ถœ=>barํ˜ธ์ถœ

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

 ๐Ÿ’ก ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ํƒœ์Šคํฌ๊ฐ€ ์ข…๋ฃŒ๋˜์ง€ ์•Š์€ ์ƒํƒœ๋ผ๋„ ๋‹ค์Œ ํƒœ์Šคํฌ๋ฅผ ๊ณง๋ฐ”๋กœ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹

  • ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ํƒœ์Šคํฌ๊ฐ€ ์ข…๋ฃŒ๋˜์ง€ ์•Š์€ ์ƒํƒœ๋ผ ํ•ด๋„ ๋‹ค์Œ ํƒœ์Šคํฌ๋ฅผ ๊ณง๋ฐ”๋กœ ์‹คํ–‰ํ•ด ๋ธ”๋กœํ‚น ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ
  • ํƒœ์Šคํฌ์˜ ์‹คํ–‰ ์ˆœ์„œ๊ฐ€ ๋ณด์žฅ๋˜์ง€ ์•Š์Œ
  • ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋Š” ์ „ํ†ต์ ์œผ๋กœ ์ฝœ๋ฐฑ ํŒจํ„ด์„ ์‚ฌ์šฉ
  • ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ์ฝœ๋ฐฑ ํŒจํ„ด์€ ์ฝœ๋ฐฑ ํ—ฌ(callback hell)์„ ๋ฐœ์ƒ์‹œํ‚ด
    • ๊ฐ€๋…์„ฑ์„ ๋‚˜์˜๊ฒŒ ํ•จ
    • ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์ค‘ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ์˜ ์˜ˆ์™ธ์ฒ˜๋ฆฌ ๊ณค๋ž€
    • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ํ•œ๊ณ„
  • setTimeout, setInterval, HTTP ์š”์ฒญ, ์ด๋ฒคํŠธ ํ—จ๋“ค๋Ÿฌ
  • ์ด๋ฒคํŠธ ๋ฃจํ”„(Event Loop)์™€ ํƒœ์Šคํฌ ํ(Task Queue)์™€ ๊นŠ์€ ๊ด€๊ณ„
  •  

/* ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐฉ์‹
ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ํƒœ์Šคํฌ๊ฐ€ ์ข…๋ฃŒ๋˜์ง€ ์•Š์€ ์ƒํƒœ๋ผ ํ•ด๋„ ๋‹ค์Œ ํƒœ์Šคํฌ๋ฅผ ๊ณง๋ฐ”๋กœ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹
*/
//ํ•จ์ˆ˜ sleep์€ delay๊ฐ€ ๊ฒฝ๊ณผํ•œ ํ›„์— ์ฝœ๋ฐฑํ•จ์ˆ˜(func) ํ˜ธ์ถœ
function sleep(func, delay){
		//Date.now()๋Š” ํ˜„์žฌ ์‹œ๊ฐ„์„ ๋ฐ˜ํ™˜
    const delayUntil = Date.now() + delay
		//ํ˜„์žฌ ์‹œ๊ฐ„์— delay๋ฅผ ๋”ํ•œ delayUntil์ด ํ˜„์žฌ ์‹œ๊ฐ„๋ณด๋‹ค ์ž‘์œผ๋ฉด ๊ณ„์† ๋ฐ˜๋ณต
    while(Date.now() < delayUntil)
		//์ผ์ • ์‹œ๊ฐ„์ด ๊ฒฝ๊ณผํ•œ ์ดํ›„์— ์ฝœ๋ฐฑํ•จ์ˆ˜ ์‹คํ–‰
    func()
}
function foo(){
	console.log('foo')
}

function bar(){
	console.log('bar')
}

//ํƒ€์ด๋จธ ํ•จ์ˆ˜ setTimeout์€ ์ผ์ • ์‹œ๊ฐ„์ด ๊ฒฝ๊ณผํ•œ ์ดํ›„์— ์ฝœ๋ฐฑ ํ•จ์ˆ˜ foo๋ฅผ ํ˜ธ์ถœ
// ํƒ€์ด๋จธ ํ•จ์ˆ˜ setTimeout์€ barํ•จ์ˆ˜๋ฅผ ๋ธŒ๋กœํ‚นํ•˜์ง€ ์•Š๋Š”๋‹ค.
setTimeout(foo,3*1000)
bar()
//bar ํ˜ธ์ถœ -> (3์ดˆ ๊ฒฝ๊ณผํ›„) fooํ˜ธ์ถœ

์ด๋ฒคํŠธ ๋ฃจํ”„์™€ ํƒœ์Šคํฌ ํ

Task Queue๋กœ ํ• ๋‹น๋œ ํ›„ Event Loop๊ฐ€ Call Stack์ด ๋นˆ ๊ฒƒ์„ ํ™•์ธ ํ›„ Call Stack์œผ๋กœ ํ• ๋‹น

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„

์ฝœ ์Šคํƒ(Call Stack)

๐Ÿ’ก ์†Œ์Šค์ฝ”๋“œ(์ „์—ญ ์ฝ”๋“œ๋‚˜ ํ•จ์ˆ˜์ฝ”๋“œ ๋“ฑ) ํ‰๊ณผ ๊ณผ์ •์—์„œ ์ƒ์„ฑ๋œ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ถ”๊ฐ€๋˜๊ณ  ์ œ๊ฑฐ๋˜๋Š” ์Šคํƒ ์ž๋ฃŒ๊ตฌ์กฐ์ธ ์ปจํ…์ŠคํŠธ ์Šคํƒ

 

  • ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ํ•จ์ˆ˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฝœ ์Šคํƒ์— ํ‘ธ์‰ฌ๋˜์–ด ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰
  • ๋‹จ ํ•˜๋‚˜์˜ ์ฝœ์Šคํƒ์„ ์‚ฌ์šฉ
  • ์ตœ์ƒ์œ„ ์‹คํ–‰ ์ปจํƒ์ŠคํŠธ๊ฐ€ ์ข…๋ฃŒ๋˜์–ด ์ฝœ ์Šคํƒ์— ์ œ๊ฑฐ๋˜๊ธฐ ์ „๊นŒ์ง€๋Š” ๋‹ค๋ฅธ ์–ด๋–ค ํƒœ์Šคํฌ๋„ ์‹คํ–‰๋˜์ง€ ์•Š์Œ

ํž™(Heap)

๐Ÿ’ก ๊ฐ์ฒด๊ฐ€ ์ €์žฅ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„

 

  • ์ฝœ ์Šคํƒ์˜ ์š”์†Œ์ธ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋Š” ํž™์— ์ €์žฅ๋œ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐ
  • ๊ฐ์ฒด๋Š” ์›์‹œ ๊ฐ’๊ณผ๋Š” ๋‹ฌ๋ฆฌ ํฌ๊ธฐ๊ฐ€ ์ •ํ•ด์ ธ ์žˆ์ง€ ์•Š์œผ๋ฏ€๋กœ ํ• ๋‹นํ•ด์•ผ ํ•  ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์˜ ํฌ๊ธฐ๋ฅผ ๋Ÿฐํƒ€์ž„์— ๊ฒฐ์ •(๋™์  ํ• ๋‹น)
  • ๊ฐ์ฒด๊ฐ€ ์ €์žฅ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ธ ํž™์€ ๊ตฌ์กฐํ™” ๋˜์–ด์žˆ์ง€ ์•Š์Œ

 

ํƒœ์Šคํฌ ํ(Task Queue/Event Queue/Callback Queue)

 ๐Ÿ’ก setTimeout์ด๋‚˜ setInterval๊ณผ ๊ฐ™์€ ๋น„๋™๊ธฐ ํ•จ์ˆ˜์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋˜๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์ผ์‹œ์ ์œผ๋กœ ๋ณด๊ด€๋˜๋Š” ์˜์—ญ

 

  • ํƒœ์Šคํฌ ํ์™€๋Š” ๋ณ„๋„๋กœ ํ”„๋กœ๋ฏธ์Šค์˜ ํ›„์† ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ์ผ์‹œ์ ์œผ๋กœ ๋ณด๊ด€๋˜๋Š” ๋งˆ์ดํฌ๋กœํƒœ์Šคํฌ ํ๋„ ์กด์žฌ

์ด๋ฒคํŠธ ๋ฃจํ”„(Event Loop)

๐Ÿ’ก ์ฝœ ์Šคํƒ์— ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์žˆ๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ํƒœ์Šคํฌ ํ์— ๋Œ€๊ธฐ ์ค‘์ธ ํ•จ์ˆ˜(์ฝœ๋ฐฑ ํ•จ์ˆ˜, ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋“ฑ)๊ฐ€ ์žˆ๋Š”์ง€ ๋ฐ˜๋ณตํ•ด์„œ ํ™•์ธ

 

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋™์‹œ์„ฑ์„ ์ง€์›
  • ๋ธŒ๋ผ์šฐ์ €์— ๋‚ด์žฅ๋œ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜
  • ์ฝœ ์Šคํƒ์ด ๋น„์–ด์žˆ๊ณ  ํƒœ์Šคํฌ ํ์— ๋Œ€๊ธฐ ์ค‘์ธ ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค๋ฉด ์ด๋ฒคํŠธ ๋ฃจํ”„๋Š” ์ˆœ์ฐจ์  (First In First Out)์œผ๋กœ ํƒœ์Šคํฌ ํ์— ๋Œ€๊ธฐ ์ค‘์ธ ํ•จ์ˆ˜๋ฅผ ์ฝœ ์Šคํƒ์œผ๋กœ ์ด๋™
  • ์ฝœ ์Šคํƒ์œผ๋กœ ์ด๋™ํ•œ ํ•จ์ˆ˜๋Š” ์‹คํ–‰๋จ
  • ํƒœ์Šคํฌ ํ์— ์ผ์‹œ ๋ณด๊ด€๋œ ํ•จ์ˆ˜๋“ค์€ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘

Reference

์ด์›…๋ชจ ์ €, ใ€Œ๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Deep Diveใ€, ์œ„ํ‚ค๋ถ์Šค(2020)

'Language > JavaScript' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[JavaScript] Event-onChange  (0) 2023.01.22
[JavaScript] Event-onFocus, onBlur  (0) 2023.01.20
[JavaScript] API  (0) 2023.01.16
[JavaScript] AJAX & JSON  (0) 2023.01.15
[FE/JavaScript] ๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น(๋””์ŠคํŠธ๋Ÿญ์ฒ˜๋ง ํ• ๋‹น)  (0) 2022.07.06

๋Œ“๊ธ€