๊ทธ์ ๋ฐํด (b)๋น๋๊ธฐ ๋ฐฉ์์์ ์๋๋ค์ ์์์ ๋ฐ๋ผ ์ปคํผ๋ฅผ ์ฃผ๋ฌธ ํ๋, ์์ฌ๋ ์ปคํผ๊ฐ ๋์ค๊ธฐ ์ ๊น์ง ์ค์ ์์ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์ด ์๋๋ผ ๊ฐ์ ํ ๊ฒ์ ํ๊ณ ์๋ค๊ฐ ์ง๋๋ฒจ์ด ์ธ๋ฆฌ๋ฉด ๊ทธ๋ ์ปคํผ๋ฅผ ๊ฐ์ง๋ฌ ๊ฐ ์ ์๋ค.
์ง๋ ฌ์ ์ผ๋ก ํ์คํฌ๋ฅผ ์ํํ๋ค.
์ฆ, ํ์คํฌ๋ ์์ฐจ์ ์ผ๋ก ์คํ๋๋ฉฐ ์ด๋ค ์์ ์ด ์ํ ์ค์ด๋ฉด ๋ค์ ์์ ์ ๋๊ธฐํ๊ฒ ๋๋ค. ์๋ฅผ ๋ค์ด, ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ ํ๋ฉด์ ํ์ํ๋ ์์ ์ ์ํํ ๋, ์๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๊ณ ๋ฐ์ดํฐ๊ฐ ์๋ต๋ ๋๊น์ง ์ดํ ํ์คํฌ๋ค์ ๋ธ๋กํน(blocking, ์์ ์ค๋จ)๋๋ค.
์๋๋ ๋๊ธฐ์์ผ๋ก ๋์ํ๋ ์ฝ๋. ์์ฐจ์ ์ผ๋ก ์คํ๋์ด ์ฝ์์ ์ฐํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
function func1() {
console.log('func1');
func2();
}
function func2() {
console.log('func2');
func3();
}
function func3() {
console.log('func3');
}
func1();
โ
๋ณ๋ ฌ์ ์ผ๋ก ํ์คํฌ๋ฅผ ์ํํ๋ค.
์ฆ, ํ์คํฌ๊ฐ ์ข ๋ฃ๋์ง ์์ ์ํ๋ผ ํ๋๋ผ๋ ๋๊ธฐํ์ง ์๊ณ ๋ค์ ํ์คํฌ๋ฅผ ์คํํ๋ค. ์๋ฅผ ๋ค์ด, ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ ํ๋ฉด์ ํ์ํ๋ ํ์คํฌ๋ฅผ ์ํํ ๋, ์๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ ์ดํ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ดํฐ๊ฐ ์๋ต๋ ๋๊น์ง ๋๊ธฐํ์ง ์๊ณ (๋ ผ๋ธ๋กํน, Non-Blocking) ์ฆ์ ๋ค์ ํ์คํฌ๋ฅผ ์ํํ๋ค. ์ดํ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ดํฐ๊ฐ ์๋ต๋๋ฉด ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๊ณ ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์ํํ ํ์คํฌ๋ฅผ ๊ณ์ํด์ ์ํํ๋ค.
์๋ฐ ์คํฌ๋ฆฝํธ์์ ๋๋ถ๋ถ์ DOM ์ด๋ฒคํธ ํธ๋ค๋ฌ์ Timer ํจ์(setTimeout, setInterval), Ajax ์์ฒญ์ ๋น๋๊ธฐ์ ์ฒ๋ฆฌ ๋ชจ๋ธ๋ก ๋์ํ๋ค.
์๋๋ ๋น๋๊ธฐ์์ผ๋ก ๋์ํ๋ ์ฝ๋. func2์์ setTimeout๋ก ์ธํด ์์ฐจ์ ์ผ๋ก ์คํ๋์ง ์๋ ๊ฒ์ ์ ์ ์๋ค.
function func1() {
console.log('func1');
func2();
}
function func2() {
setTimeout(function() {
console.log('func2');
}, 0);
func3();
}
function func3() {
console.log('func3');
}
func1();
์ ์์ ๋ฅผ ์คํํ๋ฉด setTimeout ๋ฉ์๋์ ๋๋ฒ์งธ ์ธ์ ์ธํฐ๋ฒ์ 0์ด๋ก ์ค์ ํ์ฌ๋ ์ฝ์์ "func1 func2 func3"์ ์์๋ก ๋ก๊ทธ๊ฐ ์ถ๋ ฅ๋์ง ์๋๋ค. ์๋ํ๋ฉด setTimeout ๋ฉ์๋๊ฐ ๋น๋๊ธฐ ํจ์์ด๊ธฐ ๋๋ฌธ์ด๋ค.
ํจ์ func1์ด ํธ์ถ๋๋ฉด ํจ์ func1์ Call Stack์ ์์ธ๋ค. ๊ทธ๋ฆฌ๊ณ ํจ์ func1์ ํจ์ func2๋ฅผ ํธ์ถํ๋ฏ๋ก ํจ์ func2๊ฐ Call Stack์ ์์ด๊ณ setTimeout์ด ํธ์ถ๋๋ค. setTimeout์ ์ฝ๋ฐฑํจ์๋ ์ฆ์ ์คํ๋์ง ์๊ณ ์ง์ ๋๊ธฐ ์๊ฐ๋งํผ ๊ธฐ๋ค๋ฆฌ๋ค๊ฐ "tick" ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ํ์คํฌ ํ๋ก ์ด๋ํ ํ Call Stack์ด ๋น์ด์ก์ ๋ Call Stack์ผ๋ก ์ด๋๋์ด ์คํ๋๋ค.
โ
-
๋๊ธฐ์
- ์์ฒญ๊ณผ ๊ฒฐ๊ณผ๊ฐ ๋์์ ์ผ์ด๋จ
- ์์ฒญํ ๊ฒฐ๊ณผ๊ฐ ํ ์๋ฆฌ์์ ๋์์ ์ผ์ด๋จ (์ฌ์ฉ์๊ฐ ๋ฐ์ดํฐ๋ฅผ ์๋ฒ์๊ฒ ์์ฒญํ๋ค๋ฉด ๊ทธ ์๋ฒ๊ฐ ๋ฐ์ดํฐ ์์ฒญ์ ๋ฐ๋ฅธ ์๋ต์ ์ฌ์ฉ์์๊ฒ ๋ค์ ๋ฆฌํดํด์ฃผ๊ธฐ ์ ๊น์ง ์ฌ์ฉ์๋ ๋ค๋ฅธ ํ๋์ ํ ์ ์์ผ๋ฉฐ ๊ธฐ๋ค๋ ค์ผ๋งํจ)
- A๋ ธ๋์ B๋ ธ๋ ์ฌ์ด์ ํธ๋์ญ์ ์ ๋์์ ๋ง์ถ๋ค๋ ์๋ฏธ
- ์ฅ์
- ์ค๊ณ๊ฐ ๊ฐ๋จํ๊ณ ์ง๊ด์
- ๋จ์
- ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ๋๊น์ง ์๋ฌด๊ฒ๋ ๋ชปํ๊ณ ๋๊ธฐํด์ผ ํจ
- ์์ฒญ๊ณผ ๊ฒฐ๊ณผ๊ฐ ๋์์ ์ผ์ด๋จ
-
๋น๋๊ธฐ์
- ์์ฒญ๊ณผ ๊ฒฐ๊ณผ๊ฐ ๋์์ ์ผ์ด๋์ง ์์
- ์์ฒญํ ๊ณณ์์ ๊ฒฐ๊ณผ๊ฐ ๋ํ๋์ง ์์ (์๋ฒ์๊ฒ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ ํ ์์ฒญ์ ๋ฐ๋ฅธ ์๋ต์ ๊ณ์ ๊ธฐ๋ค๋ฆฌ์ง ์์๋๋๋ฉฐ ๋ค๋ฅธ ์ธ๋ถ ํ๋์ ์ํํ์ฌ๋ ๋๊ณ ์๋ฒ์๊ฒ ๋ค๋ฅธ ์์ฒญ์ฌํญ์ ๋ณด๋ด๋ ์๊ด ์์)
- ๋ ธ๋ ์ฌ์ด์ ์์ ์ฒ๋ฆฌ ๋จ์๋ฅผ ๋์์ ํ์ง ์์๋ ๋จ
- ์ฅ์
- ๊ฒฐ๊ณผ๊ฐ ์ฃผ์ด์ง๋๋ฐ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋๋ผ๋ ๊ทธ ์๊ฐ ๋์ ๋ค๋ฅธ ์์ ์ด ๊ฐ๋ฅํด ์์์ ํจ์จ์ ์ธ ์ฌ์ฉ์ด ๊ฐ๋ฅํจ
- ๋จ์
- ์ค๊ณ๊ฐ ๋๊ธฐ์ ๋นํด ๋ณต์กํจ
- ์์ฒญ๊ณผ ๊ฒฐ๊ณผ๊ฐ ๋์์ ์ผ์ด๋์ง ์์
โ
- ๋ธ๋กํน(Blocking)
- ํธ์ถ๋ ํจ์๊ฐ ์์ ์ ์์ ์ ๋ชจ๋ ๋๋ผ๋๊น์ง ์ ์ด๊ถ์ ๊ฐ์ง๊ณ ์์ด ํธ์ถํ ํจ์๊ฐ ๋๊ธฐํ๋๋ก ๋ง๋ฆ
- ๋
ผ๋ธ๋กํน(NonBlocking)
- ํธ์ถ๋ ํจ์๊ฐ ๋ฐ๋ก return ํด์ ํธ์ถํ ํจ์์๊ฒ ์ ์ด๊ถ์ ์ฃผ์ด ๋ค๋ฅธ ์ผ์ ํ ์ ์๊ฒ ํจ
- ํธ์ถ๋๋ ํจ์๊ฐ ๋ฐ๋ก return ํ๋๋ ๋ง๋๋๊ฐ ์ค์
ํธ์ถ๋ ํจ์๊ฐ ๋ฐ๋ก returnํด์ ํธ์ถํ ํจ์์๊ฒ ์ ์ด๊ถ์ ๋๊ฒจ์ฃผ๊ณ , ํธ์ถํ ํจ์๊ฐ ๋ค๋ฅธ ์ผ์ ํ ์ ์๋ ๊ธฐํ๋ฅผ ์ค ์ ์์ผ๋ฉด NonBlocking์ด๋ค.
๊ทธ๋ ์ง ์๊ณ ํธ์ถ๋ ํจ์๊ฐ ์์ ์ ์์ ์ ๋ชจ๋ ๋ง์น ๋๊น์ง ํธ์ถํ ํจ์์๊ฒ ์ ์ด๊ถ์ ๋๊ฒจ์ฃผ์ง ์๊ณ ๋๊ธฐํ๊ฒ ๋ง๋ ๋ค๋ฉด Blocking์ด๋ค.
โ
๋๊ธฐ/๋น๋๊ธฐ
๋ ์์
์ ์ํํ๋ ์ฃผ์ฒด๊ฐ 2๊ฐ ์ด์์ด์ด์ผ ํฉ๋๋ค. ์ด ๋ ์์
์ ์๊ฐ(์์, ์ข
๋ฃ ๋ฑ)์ ์๋ก ๋ง์ถ๋ค๋ฉด ์ด๋ฅผ ๋๊ธฐ๋ผ๊ณ ๋ถ๋ฅด๊ณ , ์๋ก ์์
์ ์๊ฐ์ด ๊ด๊ณ์๋ค๋ฉด ์ด๋ฅผ ๋น๋๊ธฐ๋ผ๊ณ ๋ถ๋ฆ
๋๋ค. ๋ฐ๋ฉด ๋ธ๋กํน/๋
ผ๋ธ๋กํน
์ ์์
์ ๋์์ด 2๊ฐ ์ด์์ด์ด์ผ ํฉ๋๋ค. ๋ ๊ฐ๋
์ด ์๋ก ๋ฐ๋ผ๋ณด๋ ๊ด์ ์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋๊ธฐ/๋ธ๋กํน, ๋๊ธฐ/๋
ผ๋ธ๋กํน, ๋น๋๊ธฐ/๋ธ๋กํน, ๋น๋๊ธฐ/๋
ผ๋ธ๋กํน์ ๋ค์ํ ์กฐํฉ์ด ๊ฐ๋ฅํฉ๋๋ค.
โ
https://poiemaweb.com/js-async
http://homoefficio.github.io/2017/02/19/Blocking-NonBlocking-Synchronous-Asynchronous/