๋๊ธฐ์(Synchronous)์ ๋จผ์ ์์๋ ๋์์ด ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ ํ, ๋ค์ ์์ ์ ์ํํ๋ฉฐ ํ ๋ฒ์ ํ๋์ฉ๋ง ์ฒ๋ฆฌํ๋ค.
๋น๋๊ธฐ์(Asynchronous)์ ๋จผ์ ์คํ๋ ๋์์ด ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ , ๋ค์ ์์ ์ ์ํํ๋ฉฐ ํ ๋ฒ์ ์ฌ๋ฌ๊ฐ์ง๋ฅผ ์ฒ๋ฆฌํ๋ค.
์ฑ๊ธ์ค๋ ๋๋ ๋ฉ์ธ์ค๋ ๋ ํ๋๋ง ๊ฐ์ง๊ณ ์์ฐจ์ ์ผ๋ก ์์ ์ ์ฒ๋ฆฌํ๋ค.
๋ฉํฐ์ค๋ ๋๋ ๋ฉ์ธ์ค๋ ๋ ์ธ์ ์ถ๊ฐ์ ์ธ ์ค๋ ๋๋ฅผ ์ด์ฉํ์ฌ ๋ณ๋ ฌ์ ์ผ๋ก ์์
์ ์ฒ๋ฆฌํ๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ ์ฑ๊ธ ์ค๋ ๋๋ฅผ ์ฌ์ฉํ๋ ๋๊ธฐ์ ์ธ์ด์ด๋ค.
๋ฐ๋ณต๋ฌธ, ํจ์ ํธ์ถ ๋ฑ์ด ๋๊ธฐ์ ์ผ๋ก ์คํ๋๋ฉฐ, ์ฑ๊ธ ์ค๋ ๋๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ฝ๋์ ์ฒ๋ฆฌ๋ ์์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌ๋๋ค. ํ์ง๋ง, ์ฑ๊ธ ์ค๋ ๋ ํ๊ฒฝ์์ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ๊ธด ์๊ฐ ์ ์ ํ๋ฉด, ํ๋ก๊ทธ๋จ์ด ๋ฉ์ถ ์๋ ์๋ค.
๊ทธ๋์ ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ธ๋ผ์ฐ์ ์์ ๋ณ๋์ API๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ์ ์ผ๋ก ์์
์ ์ฒ๋ฆฌํ ์ ์๋ค. ๊ทธ๋ ๋ค๋ฉด, API๋ฅผ ์ฌ์ฉํ๋๋ฐ ์ ๋น๋๊ธฐ์ ์ผ๊น ? API๊ฐ ๋ฉํฐ์ค๋ ๋๋ก ๋์ํ๊ธฐ ๋๋ฌธ์ด๋ค.
const foo = ( ) => console.log( "First" );
const bar = ( ) => setTimeout( ( ) => console.log( "Second" ), 1000 );
const baz = ( ) => console.log( "Third" );bar( );
foo( );
baz( );
bar( )๊ฐ ํธ์ถ๋๋ฉด setTimeout( )์ ๋ฐํํ๊ณ CallStack์ ์ถ๊ฐ๋๋ค. setTimeout ํจ์๋ ๋น๋๊ธฐ ํจ์์ด๊ธฐ ๋๋ฌธ์ ํ์ด๋จธ๊ฐ ์๋ฃ๋ ๋๊น์ง CallStack์ ๋จธ๋ฌด๋ ๊ฒ์ด ์๋, ์์ผ๋ก ์คํ๋ ๊ฒ์ ์ฝ์ํ ํ์ setTimeout์ ์ฝ๋ฐฑ ํจ์๊ฐ Web API์ ์ถ๊ฐ๋์ด ๋น๋๊ธฐ์ ์ผ๋ก ์คํ๋๋ค.
Web API์์ setTimeout์ ์ฝ๋ฐฑํจ์๊ฐ ์คํ๋๋ ๋์ foo( )๊ฐ ํธ์ถ๋์ด CallStack์ ์ถ๊ฐ๋๋ค. ์คํ์๋ฃ ํ CallStack์ ๋น ์ ธ๋๊ฐ๋ฉฐ "First" ๋ฅผ ์ถ๋ ฅํ๋ค.
baz( )๊ฐ ํธ์ถ๋์ด CallStack์ ์ถ๊ฐ๋ ํ, ์คํ์๋ฃ ํ๋ฉด CallStack์ ๋น ์ ธ๋๊ฐ๋ฉด์ "Third" ๋ฅผ ์ถ๋ ฅํ๋ค.
foo( ) ์ baz( )๊ฐ ์คํ๋๋ ๋์ ์ฝ๋ฐฑํจ์์ ํ์ด๋จธ๊ฐ ์๋ฃ๋๋ฉด ์ฝ๋ฐฑํจ์๋ TaskQueue์ ๋ค์ด๊ฐ์ CallStack์ด ๋น์์ง ๋๊น์ง ๊ธฐ๋ค๋ฆฐ๋ค. ์ด๋, Event Loop๊ฐ CallStack๊ณผ TaskQueue์ ์ํ๋ฅผ ํ์ธํ๋ฉฐ CallStack์ด ๋น์์ง๋ฉด ์ฝ๋ฐฑ ํจ์๋ฅผ CallStack์ผ๋ก ์ด๋์ํค๊ณ ์คํ์๋ฃ ํ๋ฉด CallStack์ด ๋น์์ง๋ฉฐ "Second" ์ ์ถ๋ ฅํ๋ค.
์น์์ ์๋ฒ์ ๋ฐ์ดํฐ ์์ฒญ์ ํ์ ๋, ์์ฒญ์ด ์๋ฃ๋๊ธฐ ์ ๊น์ง ์๋ฌด๊ฒ๋ ์คํ์ด ๋์ง ์๋๋ค๋ฉด ํ๋ฉด์ด ๋ฉ์ถ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ํ์๊ณผ ํ๋์ ํ๋ก๊ทธ๋จ์ ์คํํ๋๋ฐ ๋ง์ ์๊ฐ์ด ์์๋๊ธฐ ๋๋ฌธ์ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ํด์ค๋ค.