ํจ์๋ฅผ ํธ์ถํ ๋ ํจ์ ์คํ ์ปจํ
์คํธ๊ฐ ์์ฑ๋๋ค. ์์ฑ๋ ํจ์ ์คํ ์ปจํ
์คํธ๋ ์คํ ์ปจํ
์คํธ ์คํ(์ฝ ์คํ)
์ ํธ์๋๋ฉฐ ํจ์์ ์คํ์ด ์ข
๋ฃ๋ ๋ ์คํ ์ปจํ
์คํธ ์คํ์์ ํ๋๋ค. (๋๋ฌด ๊ธธ์ด์ ์์ผ๋ก๋ ํจ์ ์คํ ์ปจํ
์คํธ ์คํ์ ์คํ์ด๋ผ๊ณ ๋ถ๋ฅด๊ฒ ๋ค.) ์คํ์ ํจ์ ์คํ ์ปจํ
์คํธ๊ฐ ํธ์๋๋ค๋ ๊ฒ์ ๊ฒฐ๊ตญ 'ํจ์์ ์คํ'์ ์๋ฏธํ๋ค.
const foo = () => {};
const bar = () => {};
foo();
bar();
๋ง์ฝ ์์ ๊ฐ์ด ํจ์๊ฐ ์ ์ธ๋ ํ์ ์คํ์ํจ๋ค๋ฉด, ์ฒ์ ์คํ ์ปจํ ์คํธ ์คํ์๋ ์ ์ญ ์คํ ์ปจํ ์คํธ๊ฐ ํธ์๋๊ณ ์ดํ์ foo ํจ์์ ์คํ ์ปจํ ์คํธ๊ฐ ํธ์๋๋ค. ํธ์๋ ๊ณง ํจ์์ ์คํ์ด๋ฏ๋ก foo ํจ์๊ฐ ์คํ๋๊ณ ํจ์๊ฐ ๋๋๋ฉด ์คํ์์ ํ๋๋ค. ๊ทธ ํ์ bar ํจ์์ ์คํ ์ปจํ ์คํธ๊ฐ ์คํ์ ํธ์๋๊ณ ๋ง์ฐฌ๊ฐ์ง๋ก ์คํ ํ์๋ ์คํ์์ ํ๋๋ค.
์ด๋ ๋ฏ ํจ์์ ์คํ ์์๋ ์คํ ์ปจํ
์คํธ ์คํ์ ํตํด ๊ด๋ฆฌ๊ฐ ๋๋ค. ๊ทธ๋ฐ๋ฐ ์ฌ๊ธฐ์ ์ค์ํ ๋ถ๋ถ์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์คํ ์ปจํ
์คํธ ์คํ์ด 1๊ฐ์ธ single thread
๋ผ๋ ์ ์ด๋ค. ๋๋ฌธ์ ํจ์๋ฅผ ๋์์ 2๊ฐ ์ด์ ์คํ์ํฌ ์๊ฐ ์๋ค. ์คํ ์ค์ธ ์คํ ์ปจํ
์คํธ๋ฅผ ์ ์ธํ ๋๋จธ์ง ์คํ ์ปจํ
์คํธ๋ ๋๊ธฐํ๊ณ ์์ด์ผ ํ๋ค. ๋ฐ๋ผ์ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ ํจ์ ๋ฑ์ ์คํํ๋ฉด ๋ธ๋กํน(์์
์ค๋จ)
์ด ๋ฐ์ํ๊ฒ ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์์ ๋๊ธฐ ์ฒ๋ฆฌ(synchronous)
๋ฅผ ํ๊ฒ ๋๋ฉด ์คํ ์์๋ ๋ณด์ฅํ ์ ์์ง๋ง ์ด ๊ณผ์ ์์ ๋ธ๋กํน์ด ์ผ์ด๋ ์ ์์ผ๋ฏ๋ก ๋นํจ์จ์ ์ด ๋ ์ ์๋ค. ๋ง์ฝ ์ฒ๋ฆฌํด์ผ ํ ํ๋ก์ธ์ค๊ฐ a, b, c 3๊ฐ ์์ ๋ a -> b -> c ์ ์์๋ก ํธ์ถ๋จ์ ๊ฐ์ ํด๋ณด์. a์ c๋ 1ms ์ ๋๋์ง๋ง b๊ฐ 30๋ถ์ด ๊ฑธ๋ฆฐ๋ค๋ฉด c๋ b์ ์ข
์์ ์ด์ง ์์๋ ๋ฌด์กฐ๊ฑด 30๋ถ์ด ์ง๋์ผ ์คํ์ด ๋๋ค. ์ผ๋ง๋ ๋นํจ์จ์ ์ธ๊ฐ?
๊ทธ๋์ ๋์จ ๊ฐ๋
์ด ๋ฐ๋ก ๋น๋๊ธฐ ์ฒ๋ฆฌ(asynchronous)
๋ค. ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ ํ์ฌ ์คํ ์ค์ธ ํ๋ก์ธ์ค๊ฐ ์ข
๋ฃ๋์ง ์๋๋ผ๋ ๋ค์ ํ๋ก์ธ์ค๋ฅผ ์คํํ๋ ๋ฐฉ์์ด๋ค. ๋น๋๊ธฐ๋ callback function
์ ์ฌ์ฉํด์ ๊ตฌํ์ ํ ์ ์๋๋ฐ ์ด๋ callback hell
์ ๋ฐ์์ํฌ ์ ์๋ค. ์ด์ ๋ํด์๋ ๋ค์์ ์ค๋ช
ํ๋๋ก ํ๊ฒ ๋ค.
๊ทผ๋ฐ ์ด์ํ์ง ์์๊ฐ? ์คํ ์ปจํ ์คํธ ์คํ์ ํ ๊ฐ๋ผ๋ฉด์ ์ด๋ป๊ฒ ๊ฑด๋๋ฐ๋ ๊ฒ ๊ฐ๋ฅํ ๊น.
์๋ฐ์คํฌ๋ฆฝํธ๋ ์ฑ๊ธ ์ค๋ ๋์ง๋ง ๋ธ๋ผ์ฐ์ ๊ฐ ๋์ํ๋ ๊ฒ์ ๋ณด๋ฉด ์ฌ๋ฌ ๊ฐ์ ํ์คํฌ๊ฐ ๋์์ ์ฒ๋ฆฌ๋๋ ๊ฒ์ฒ๋ผ ๋ณด์ธ๋ค. ์ด๋ฌํ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋์์ฑ์ ์ง์ํ๋ ๊ฒ์ด ๋ฐ๋ก ์ด๋ฒคํธ ๋ฃจํ
๋ค.
์ด๋ฒคํธ ๋ฃจํ๋ ํฌ๋กฌ๊ณผ ๊ฐ์ ๋ธ๋ผ์ฐ์ ์ ๋ด์ฅ๋์ด ์๋ ๊ธฐ๋ฅ์ด๋ค. ๊ตฌ๊ธ์ V8 ์๋ฐ์คํฌ๋ฆฝํธ ์์ง๊ณผ ๊ฐ์ด ๋๋ถ๋ถ์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ํฌ๊ฒ 2๊ฐ์ ์์ญ์ผ๋ก ๊ตฌ๋ถ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๊ฒฐ๊ตญ ์ฝ ์คํ์ ์๋ ์คํ ์ปจํ ์คํธ๋ค์ ์์ฐจ์ ์ผ๋ก ์คํ์ํค๋ ์ญํ ์ด๋ฉฐ, ๋น๋๊ธฐ์์ ์ด์ธ์ ์ฒ๋ฆฌ๋ค์ ๋ธ๋ผ์ฐ์ ํน์ Node.js ์์ ๋ด๋นํ๋ค. ์ด๋ฅผ ์ํด ๋ธ๋ผ์ฐ์ ๋ ํ์คํฌ ํ์ ์ด๋ฒคํธ ๋ฃจํ๋ฅผ ์ ๊ณตํ๋ค.
const foo = () => console.log('foo');
const bar = () => console.log('bar');
// setTimeout ์ ๋น๋๊ธฐ ํจ์
// ์ฒซ ๋ฒ์งธ ์ธ์๋ก callback function, ๋ ๋ฒ์งธ ์ธ์๋ก delay time(ms)๋ฅผ ์
๋ ฅ ๋ฐ๋๋ค.
setTimeout(foo,0);
bar();
์์ ์์ ์์ ๋์ํ๋ ์์๋ฅผ ๊ฐ๋ตํ๊ฒ ์ ๋ฆฌํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
velog๋ก ๋๋ฌ์์ต๋๋ค~(DEV์ ์์์ใ ใ ) ์ ๋ฆฌ ๋ ๊น๋ํ ์ํด์ฃผ์ จ๋ค์. ์ข์ ๋ด์ฉ ๊ฐ์ฌํฉ๋๋ค ^^!!