๐Ÿ’ก ๋น„๋™๊ธฐ ์ •๋ฆฌ (1)

๊ถŒ๊ทœ๋ฆฌยท2023๋…„ 5์›” 12์ผ
0

๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ปFrontEnd

๋ชฉ๋ก ๋ณด๊ธฐ
28/29
post-thumbnail

01. ๋น„๋™๊ธฐ ์ดํ•ด

01. ๋™๊ธฐ์™€ ๋น„๋™๊ธฐ

  • ๋™๊ธฐ์‹(Synchronous)์€ ๋จผ์ € ์‹œ์ž‘๋œ ๋™์ž‘์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ ํ›„, ๋‹ค์Œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์”ฉ๋งŒ ์ฒ˜๋ฆฌํ•œ๋‹ค.

  • ๋น„๋™๊ธฐ์‹(Asynchronous)์€ ๋จผ์ € ์‹คํ–‰๋œ ๋™์ž‘์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ , ๋‹ค์Œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ๊ฐ€์ง€๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.



02. ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ์™€ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ

  • ์‹ฑ๊ธ€์Šค๋ ˆ๋“œ๋Š” ๋ฉ”์ธ์Šค๋ ˆ๋“œ ํ•˜๋‚˜๋งŒ ๊ฐ€์ง€๊ณ  ์ˆœ์ฐจ์ ์œผ๋กœ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.

  • ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ๋Š” ๋ฉ”์ธ์Šค๋ ˆ๋“œ ์™ธ์˜ ์ถ”๊ฐ€์ ์ธ ์Šค๋ ˆ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ณ‘๋ ฌ์ ์œผ๋กœ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.


03. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ

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

๊ทธ๋ž˜์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ณ„๋„์˜ API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด, API๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ์™œ ๋น„๋™๊ธฐ์ ์ผ๊นŒ ? API๊ฐ€ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ๋กœ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๊ณผ์ • ๋ฐ ์ฝ”๋“œ ๐ŸŽฌ

const foo = ( ) => console.log( "First" );
const bar = ( ) => setTimeout( ( ) => console.log( "Second" ), 1000 );
const baz = ( ) => console.log( "Third" );

bar( );
foo( );
baz( );

  • CallStack : JS์—์„œ ์ˆ˜ํ–‰ํ•ด์•ผํ•  ํ•จ์ˆ˜๋“ค์„ ์ˆœ์ฐจ์ ์œผ๋กœ Stack์— ๋‹ด์•„ ์ฒ˜๋ฆฌ
  • Web API : ์›น๋ธŒ๋ผ์šฐ์ €์—์„œ ์ œ๊ณตํ•˜๋Š” API๋กœ, ๋น„๋™๊ธฐ ์ž‘์—…์„ ์‹คํ–‰ํ•˜๋Š” ๊ณต๊ฐ„
  • TaskQueue : Web API์—์„œ ๋„˜๊ฒจ๋ฐ›์€ callback ํ•จ์ˆ˜ ์ €์žฅ
  • Event Loop : CallStack์ด ๋น„์—ˆ๋‹ค๋ฉด, Task Queue์˜ ์ž‘์—…์„ CallStack์œผ๋กœ ์˜ฎ๊น€

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๊ณผ์ • ์ˆœ์„œ ๐ŸŽฌ

  1. bar( )๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด setTimeout( )์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  CallStack์— ์ถ”๊ฐ€๋œ๋‹ค. setTimeout ํ•จ์ˆ˜๋Š” ๋น„๋™๊ธฐ ํ•จ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— ํƒ€์ด๋จธ๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ CallStack์— ๋จธ๋ฌด๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ์•ž์œผ๋กœ ์‹คํ–‰๋  ๊ฒƒ์„ ์•ฝ์†ํ•œ ํ›„์— setTimeout์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ Web API์— ์ถ”๊ฐ€๋˜์–ด ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค.

  2. Web API์—์„œ setTimeout์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋™์•ˆ foo( )๊ฐ€ ํ˜ธ์ถœ๋˜์–ด CallStack์— ์ถ”๊ฐ€๋œ๋‹ค. ์‹คํ–‰์™„๋ฃŒ ํ›„ CallStack์„ ๋น ์ ธ๋‚˜๊ฐ€๋ฉฐ "First" ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

  3. baz( )๊ฐ€ ํ˜ธ์ถœ๋˜์–ด CallStack์— ์ถ”๊ฐ€๋œ ํ›„, ์‹คํ–‰์™„๋ฃŒ ํ•˜๋ฉด CallStack์„ ๋น ์ ธ๋‚˜๊ฐ€๋ฉด์„œ "Third" ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

  4. foo( ) ์™€ baz( )๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ์ฝœ๋ฐฑํ•จ์ˆ˜์˜ ํƒ€์ด๋จธ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์ฝœ๋ฐฑํ•จ์ˆ˜๋Š” TaskQueue์— ๋“ค์–ด๊ฐ€์„œ CallStack์ด ๋น„์›Œ์งˆ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ๋‹ค. ์ด๋•Œ, Event Loop๊ฐ€ CallStack๊ณผ TaskQueue์˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๋ฉฐ CallStack์ด ๋น„์›Œ์ง€๋ฉด ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ CallStack์œผ๋กœ ์ด๋™์‹œํ‚ค๊ณ  ์‹คํ–‰์™„๋ฃŒ ํ•˜๋ฉด CallStack์ด ๋น„์›Œ์ง€๋ฉฐ "Second" ์„ ์ถœ๋ ฅํ•œ๋‹ค.

gif ์ถœ์ฒ˜ : kim unknown.log


04. ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์˜ ํ•„์š”์„ฑ

์›น์—์„œ ์„œ๋ฒ„์— ๋ฐ์ดํ„ฐ ์š”์ฒญ์„ ํ–ˆ์„ ๋•Œ, ์š”์ฒญ์ด ์™„๋ฃŒ๋˜๊ธฐ ์ „๊นŒ์ง€ ์•„๋ฌด๊ฒƒ๋„ ์‹คํ–‰์ด ๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ํ™”๋ฉด์ด ๋ฉˆ์ถ˜ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ํ˜„์ƒ๊ณผ ํ•˜๋‚˜์˜ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋Š”๋ฐ ๋งŽ์€ ์‹œ๊ฐ„์ด ์†Œ์š”๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ค€๋‹ค.


05. ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์˜ ์ข…๋ฅ˜

  • Promise : ์‘๋‹ต์— ๊ด€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ–๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๋กœ, then ๊ณผ catch๋ฅผ ํ†ตํ•ด ๊ฒฐ๊ณผ๊ฐ’ ์ฒ˜๋ฆฌ
  • await / async : Promise๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฉฐ, try - catch ์‚ฌ์šฉ
  • fetch : ์ ‘๊ทผํ•˜๊ณ ์ž ํ•˜๋Š” url๊ณผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋„คํŠธ์›Œํฌ์— ์š”์ฒญ
profile
๊ธฐ๋ก์žฅ ๐Ÿ“

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