๐Ÿ“š

์ด๊ฐ€์€

JavaScript๋Š” ์™œ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ์ผ๊นŒ?

์•ˆ๋…•ํ•˜์„ธ์š”, ์—ฌ๋Ÿฌ๋ถ„!
์˜ค๋Š˜์€ JavaScript๊ฐ€ ์™œ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ(single-threaded) ๋กœ ์„ค๊ณ„๋˜์—ˆ๋Š”์ง€์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
์ด๋ฒˆ ๊ธ€์—์„œ๋Š” JavaScript์˜ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฌด์—‡์ธ์ง€, ์™œ ๊ทธ๋ ‡๊ฒŒ ์„ค๊ณ„๋˜์—ˆ๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์–ด๋–ค ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๋Š”์ง€ ๊นŠ์ด ํƒ๊ตฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ชฉ์ฐจ

1. ํ”„๋กœ์„ธ์Šค์™€ ์Šค๋ ˆ๋“œ(Thread)

ํ”„๋กœ์„ธ์Šค๋ž€?

๋จผ์ €, ํ”„๋กœ์„ธ์Šค(process)๋ž€ ๋‹จ์ˆœํžˆ ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ๊ทธ๋žจ(program)์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ฆ‰, ์‚ฌ์šฉ์ž๊ฐ€ ์ž‘์„ฑํ•œ ํ”„๋กœ๊ทธ๋žจ์ด ์šด์˜์ฒด์ œ์— ์˜ํ•ด ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ํ• ๋‹น๋ฐ›์•„ ์‹คํ–‰ ์ค‘์ธ ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.
์ด๋Ÿฌํ•œ ํ”„๋กœ์„ธ์Šค๋Š” ํ”„๋กœ๊ทธ๋žจ์— ์‚ฌ์šฉ๋˜๋Š” ๋ฐ์ดํ„ฐ์™€ ๋ฉ”๋ชจ๋ฆฌ ๋“ฑ์˜ ์ž์› ๊ทธ๋ฆฌ๊ณ  ์Šค๋ ˆ๋“œ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

์Šค๋ ˆ๋“œ๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

ํ”„๋กœ์„ธ์Šค(process) ๋‚ด์—์„œ ์‹ค์ œ๋กœ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฃผ์ฒด๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
์Šค๋ ˆ๋“œ๋Š” ํ”„๋กœ๊ทธ๋žจ ๋‚ด์—์„œ ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋Š” ๋‹จ์œ„๋กœ,
๋ชจ๋“  ํ”„๋กœ์„ธ์Šค์—๋Š” ํ•œ ๊ฐœ ์ด์ƒ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ์กด์žฌํ•˜์—ฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

2. ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ์™€ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ์˜ ๋น„๊ต

โ€ข
์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ
ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์ผ๋งŒ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, ํ•œ ๋ช…์˜ ์š”๋ฆฌ์‚ฌ๊ฐ€ ๋ชจ๋“  ์š”๋ฆฌ๋ฅผ ํ˜ผ์ž์„œ ์ฐจ๋ก€๋Œ€๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
โ€ข
๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ
ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค ๋‚ด์—์„œ ๋‘˜ ์ด์ƒ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, ์—ฌ๋Ÿฌ ๋ช…์˜ ์š”๋ฆฌ์‚ฌ๋“ค์ด ๊ฐ์ž ๋งก์€ ์š”๋ฆฌ๋ฅผ ๋™์‹œ์— ๋งŒ๋“œ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

3. ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ์˜ ์žฅ๋‹จ์ 

JavaScript์˜ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ๋ชจ๋ธ์—๋Š” ์—ฌ๋Ÿฌ ์žฅ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์žฅ์ 

โ€ข
๋‹จ์ˆœ : ์ฝ”๋“œ ์ž‘์„ฑ์— ์šฉ์ดํ•˜๋ฉฐ ํ”„๋กœ๊ทธ๋žจ์˜ ํ๋ฆ„์„ ๋”ฐ๋ผ๊ฐ€๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ๋””๋ฒ„๊น…์ด ๋น„๊ต์  ๊ฐ„๋‹จํ•˜๊ณ  ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ์‰ฝ๊ฒŒ ์ถ”์ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
โ€ข
๋‚ฎ์€ ์˜ค๋ฒ„ํ—ค๋“œ : ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ๋Š” ์Šค๋ ˆ๋“œ ๊ฐ„ ์ „ํ™˜์ด ํ•„์š” ์—†์œผ๋ฏ€๋กœ ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์‹คํ–‰๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ๊ณต์œ  ์ž์›์— ๋Œ€ํ•œ ๋™๊ธฐํ™”๊ฐ€ ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค.
โ€ข
๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ ํšจ์œจ์„ฑ : ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ๋Š” ํ•˜๋‚˜์˜ ์Šคํƒ๋งŒ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ, ํ‹ฐ ์Šค๋ ˆ๋“œ๋ณด๋‹ค ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ์ ์Šต๋‹ˆ๋‹ค.
๋ฉ”๋ชจ๋ฆฌ ์ž์›์ด ์ œํ•œ๋œ ์‹œ์Šคํ…œ์—์„œ ์œ ๋ฆฌ

๋‹จ์ 

โ€ข
์ œํ•œ๋œ ์„ฑ๋Šฅ : ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ๋Š” ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์ž‘์—…๋งŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ CPU์˜ ์„ฑ๋Šฅ์ด ์ œํ•œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
โ€ข
์‘๋‹ต์„ฑ ์ €ํ•˜ : ๊ธด ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…์˜ ๊ฒฝ์šฐ ์ „์ฒด ํ”„๋กœ๊ทธ๋žจ์˜ ์‘๋‹ต์„ฑ์ด ์ €ํ•˜๋ฉ๋‹ˆ๋‹ค. ํ”ํžˆ ๋งํ•˜๋Š” ๋ ‰์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4. ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ์˜ ์žฅ๋‹จ์ 

JavaScript์˜ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ๋ชจ๋ธ์—๋Š” ์—ฌ๋Ÿฌ ์žฅ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์žฅ์ 

โ€ข
ํ–ฅ์ƒ๋œ ์„ฑ๋Šฅ: ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์‹คํ–‰๋˜๋ฏ€๋กœ, CPU๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ํ™œ์šฉํ•˜์—ฌ ์ž‘์—…์„ ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
โ€ข
๋†’์€ ์‘๋‹ต์„ฑ: ์‹œ๊ฐ„์ด ๋งŽ์ด ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…์„ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๊ฐ€ ์ฒ˜๋ฆฌํ•˜๋ฉด์„œ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ณ„์†ํ•ด์„œ ์‘๋‹ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
โ€ข
์ž์› ๊ณต์œ  : ๋™์ผํ•œ ํ”„๋กœ์„ธ์Šค ๋‚ด์—์„œ ์ž์›์„ ๊ณต์œ ํ•˜๋ฏ€๋กœ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์ด ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.

๋‹จ์ 

โ€ข
๋ณต์žกํ•จ : ์ฝ”๋“œ ์ž‘์„ฑ๊ณผ ๋””๋ฒ„๊น…์ด ์–ด๋ ค์›Œ์ ธ ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฌ์›Œ์ง€๋ฉฐ ์Šค๋ ˆ๋“œ ๊ฐ„์˜ ๋™๊ธฐํ™” ๋ฌธ์ œ์™€ ๋ฐ๋“œ๋ฝ ๋“ฑ์„ ๊ด€๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
โ€ข
๋†’์€ ์˜ค๋ฒ„ํ—ค๋“œ : ์Šค๋ ˆ๋“œ ๊ฐ„์˜ ์ž์›์„ ๊ณต์œ ํ•˜๊ธฐ ์œ„ํ•ด ๋™๊ธฐํ™”๊ฐ€ ํ•„์š”ํ•˜๋ฏ€๋กœ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•œ๋ˆˆ์— ๋ณด๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ์™€ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ๋น„๊ต ํ‘œ

ํŠน์„ฑ
์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ
๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ
๋ณต์žก์„ฑ
๋‚ฎ์Œ
๋†’์Œ
๋ฉ”๋ชจ๋ฆฌ ์†Œ๋น„
์ ์Œ
๋งŽ์Œ
๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ
๋ถˆ๊ฐ€๋Šฅ
๊ฐ€๋Šฅ
๋™๊ธฐํ™” ํ•„์š”์„ฑ
์—†์Œ
์žˆ์Œ
์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ ์˜ค๋ฒ„ํ—ค๋“œ
์—†์Œ
์žˆ์Œ

5. JavaScript์€ ์™œ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ๋ฅผ ์„ ํƒํ–ˆ๋Š”๊ฐ€?

์ž, ์ด์ œ ๋ณธ๋ก ์œผ๋กœ ๋“ค์–ด๊ฐ€์„œ JavaScript๊ฐ€ ์™œ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ์ธ์ง€ ์‚ดํŽด๋ด…์‹œ๋‹ค.
JavaScript๋Š” ์›๋ž˜ ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค.
์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์‚ฌ์šฉ์ž์™€์˜ ์ƒํ˜ธ์ž‘์šฉ์ด ์ค‘์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ณต์žก๋„๊ฐ€ ์ฆ๊ฐ€ํ•˜๊ณ , ๊ทธ๋กœ ์ธํ•œ ๋ฒ„๊ทธ์™€ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.
์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ๋ชจ๋ธ์€ ์ฝ”๋“œ์˜ ๋‹จ์ˆœ์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ฃผ๋ฉฐ, ๋™๊ธฐํ™” ๋ฌธ์ œ๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ์–ด์„œ ๊ฐœ๋ฐœ์ž๋“ค์ด ์‰ฝ๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ์ž„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ , ์ฝœ๋ฐฑ(Callback), ํ”„๋กœ๋ฏธ์Šค(Promise) ๊ทธ๋ฆฌ๊ณ  async/await ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ JavaScript๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๊ธฐ๋ฒ•๋“ค์€ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ธ”๋กœํ‚น ์—†์ด ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

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

console.log('1+1'); setTimeout(() => { console.log('2+2'); }, 1); //1์ดˆ ์ง€์—ฐ ํ›„ ์ถœ๋ ฅ console.log('3+3');
JavaScript
๋ณต์‚ฌ
์ถœ๋ ฅ ๊ฒฐ๊ณผ 1+1 3+3 2+2

6. ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๊ธฐ๋ฒ•๊ณผ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ์˜ ์กฐํ™”

JavaScript์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ์˜ ๋‹จ์ ์„ ๊ทน๋ณตํ•˜๋Š” ์ค‘์š”ํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.
โ€ข
์ฝœ๋ฐฑ(callbacks): ๋น„๋™๊ธฐ ์ž‘์—…์ด ์™„๋ฃŒ๋œ ํ›„ ์‹คํ–‰๋  ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์—ฐ์†ํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ๊นŠ์–ด์ง€๋ฉฐ, ์ด๋ฅผ '์ฝœ๋ฐฑ ์ง€์˜ฅ'์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐ€๋…์„ฑ์„ ์‹ฌ๊ฐํ•˜๊ฒŒ ๋–จ์–ด๋œจ๋ฆฌ๊ณ  ์ฝ”๋“œ ์ˆ˜์ •์„ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
โ€ข
ํ”„๋กœ๋ฏธ์Šค(Promises): ์ฝœ๋ฐฑ ์ง€์˜ฅ์˜ ๋‹จ์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋„์ž…๋œ ๊ฐ์ฒด๋กœ, ๋น„๋™๊ธฐ ์ž‘์—…์˜ ์„ฑ๊ณต ๋˜๋Š” ์‹คํŒจ ์ƒํƒœ๋ฅผ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค.
โ€ข
async/await: ํ”„๋กœ๋ฏธ์Šค ๊ธฐ๋ฐ˜์˜ ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ๋™๊ธฐ ์ฝ”๋“œ์ฒ˜๋Ÿผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ตฌ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

// ์ฝœ๋ฐฑ์„ ์ด์šฉํ•œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ function order(request, callback) { console.log(`${request} ์ฃผ๋ฌธ์ด ์ ‘์ˆ˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค.`); setTimeout(() => callback(request), 3000); // ์ˆ˜์ •๋œ ๋ถ€๋ถ„ } let request = "์•„์ด์Šค๋ผ๋–ผ"; // 'reuqest' ์˜คํƒ€ ์ˆ˜์ • order(request, (response) => { console.log(`์ฃผ๋ฌธํ•˜์‹  ${response} ๋‚˜์™”์Šต๋‹ˆ๋‹ค!`); }); // ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์ด์šฉํ•œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ function fn() { new Promise((resolve, reject) => { console.log("์ฒซ๋ฒˆ์งธ"); resolve(); // ์‹คํŒจํ–ˆ์œผ๋ฉด reject()ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•จ // ๊ทธ๋Ÿผ then()์„ ๊ฑด๋„ˆ๋›ฐ๊ณ  catch() ์‹คํ–‰ }) .then(() => { return new Promise((resolve, reject) => { setTimeout(() => { console.log("๋‘๋ฒˆ์งธ"); resolve(); }, 0); }); }) .then(() => { console.log("์„ธ๋ฒˆ์งธ"); }) .catch((err) => { console.log("err: ", err); }); } // async/await๋ฅผ ์ด์šฉํ•œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ async function fn(){ let text = "์ฒซ๋ฒˆ์งธ"; text = text + await new Promise((resolve, reject) => { setTimeout(() => { resolve("๋‘๋ฒˆ์งธ"); }, 0); }); text += "์„ธ๋ฒˆ์งธ"; console.log(text + "๋„ค๋ฒˆ์งธ"); } fn();
JavaScript
๋ณต์‚ฌ

7. ๊ทธ๋Ÿผ Node.js๋„ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ์ธ๊ฐ€?

์ •ํ™•ํ•˜๊ฒŒ ๋งํ•˜์ž๋ฉด, Node.js๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
Node.js๋„ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋‚˜, JavaScript๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์Šค๋ ˆ๋“œ๋Š” ๋‹จ ํ•˜๋‚˜์ด๋ฏ€๋กœ Node.js๋ฅผ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
Node.js๋Š” ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜์˜ ํ”Œ๋žซํผ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ ๋ฏธ๋ฆฌ ์ง€์ •ํ•ด๋‘” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” Node.js์—์„œ ์ผ์–ด๋‚˜๋Š” ๋ชจ๋“  ์ฒ˜๋ฆฌ๊ฐ€ ์ผ๋ จ์˜ ์ฝœ๋ฐฑ(Callback)์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ, Node.js๋Š” ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, ํŒŒ์ผ์„ ์ฝ๊ฑฐ๋‚˜ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ์ด๋Ÿฌํ•œ ์ž‘์—…์„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌํ•˜๊ณ , ์™„๋ฃŒ๋˜๋ฉด ๊ฒฐ๊ณผ๋ฅผ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋กœ ๋Œ๋ ค์ค๋‹ˆ๋‹ค.
์ด๋ฅผ ํ†ตํ•ด ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋Š” ๋ฉˆ์ถ”์ง€ ์•Š๊ณ  ๊ณ„์†ํ•ด์„œ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋น„๋™๊ธฐ ๋ชจ๋ธ ๋•๋ถ„์— Node.js๋Š” ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์ธ ๋„คํŠธ์›Œํฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

JavaScript๊ฐ€ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ๋กœ ์„ค๊ณ„๋œ ์ด์œ ๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํŠน์„ฑ์ƒ ์ฝ”๋“œ์˜ ๋‹จ์ˆœ์„ฑ์„ ์œ ์ง€ํ•˜๊ณ , ๋™๊ธฐํ™” ๋ฌธ์ œ๋ฅผ ์ตœ์†Œํ™”ํ•˜๋ฉฐ, ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์˜ ํšจ์œจ์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•˜๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค.
์ด๋Ÿฌํ•œ ํŠน์„ฑ ๋•๋ถ„์— JS๋Š” ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ์นœ์ˆ™ํ•˜๊ณ  ์ง๊ด€์ ์ธ ์–ธ์–ด๋กœ ์ž๋ฆฌ ์žก์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
์ฐธ์กฐ ์‚ฌ์ดํŠธ [์™œ Node.js๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ์ธ๊ฐ€?](https://medium.com/@gwakhyoeun/์™œ-node-js๋Š”-single-thread-์ธ๊ฐ€-bb68434027a3) [์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ์™€ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ](https://velog.io/@gil0127/์‹ฑ๊ธ€์Šค๋ ˆ๋“œSingle-thread-vs-๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ-Multi-thread-t5gv4udj) [Node.js๊ฐ€ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ๋กœ ๋ถˆ๋ฆฌ๋Š” ์ •ํ™•ํ•œ ์ด์œ ](https://helloinyong.tistory.com/350) [๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ](https://hun-dev.tistory.com/29) [์ฝœ๋ฐฑํ•จ์ˆ˜,ํ”„๋กœ๋ฏธ์Šค,async/await](https://jhbljs92.tistory.com/entry/14-์ฝœ๋ฐฑํ•จ์ˆ˜-ํ”„๋กœ๋ฏธ์Šค-asyncawait)