JavaScript๋ฅผ ๋ฐฐ์ฐ๊ฑฐ๋ ์ฌ์ฉํ๋ฉด์ ์ค์ํ๊ฒ ์ ํ๊ฒ ๋๋ ๊ฐ๋ ์ค ํ๋๋ ๋๊ธฐ(synchronous)์ ๋น๋๊ธฐ(asynchronous)์ ์ฐจ์ด์ ๋๋ค.
์ด ๊ธ์์๋ ์ด ๋ ๊ฐ๋ ์ ์ฐจ์ด๋ฅผ ๊ธฐ๋ณธ์ ์ธ ์์๋ถํฐ ์ค์ฉ์ ์ธ ์์๊น์ง ๋ค์ํ ๋ฐฉ๋ฒ์ผ๋ก ์ค๋ช ํด ๋๋ฆฌ๊ฒ ์ต๋๋ค.
1. ๊ธฐ๋ณธ ๊ฐ๋
๊ตฌ๋ถ | ๋๊ธฐ(Synchronous) | ๋น๋๊ธฐ(Asynchronous) |
---|---|---|
๋์ ์๋ฆฌ | ์ฝ๋๊ฐ ์์ฐจ์ ์ผ๋ก ์คํ. ํ ์์ ์ด ์๋ฃ๋ ๋๊น์ง ๋ค์ ์์ ๋๊ธฐ. | ์ฝ๋๋ ๋ฐ๋ก ๋ค์ ์์ ์ผ๋ก ๋์ด๊ฐ๋ฉฐ, ํน์ ์์ ์ ์๋ฃ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์์. |
์ฅ์ | ์ฝ๋์ ํ๋ฆ์ด ๋ช ํํ๋ฉฐ ์์ธกํ๊ธฐ ์ฝ๋ค. | ์ฌ๋ฌ ์์ ์ ๋์์ ์ฒ๋ฆฌ ๊ฐ๋ฅํ์ฌ ํจ์จ์ . |
๋จ์ | ๊ธด ์์ ์ด ์งํ๋๋ ๋์ ์ ์ฒด ํ๋ก์ธ์ค๊ฐ ๋ฉ์ถ ์ํ์ด ์์. | ์ฝ๋์ ํ๋ฆ์ด ๋ณต์กํด์ง ์ ์๊ณ , ์ฝ๋ฐฑ, ํ๋ก๋ฏธ์ค ๋ฑ์ ๋ฉ์ปค๋์ฆ ์ดํด ํ์. |
2. ๊ฐ๋จํ ์์
2-1. ๋๊ธฐ(Synchronous)
์ค๋ช :
๋๊ธฐ ์ฝ๋๋ ์์ฐจ์ ์ผ๋ก ์คํ๋ฉ๋๋ค. ํ ํจ์๊ฐ ์๋ฃ๋ ๋๊น์ง ๋ค์ ํจ์๋ ๊ธฐ๋ค๋ ค์ผ ํฉ๋๋ค.
์ฝ๋ ์์:
function firstFunction() {
console.log("1. ์ฒซ ๋ฒ์งธ ํจ์ ์คํ");
}
function secondFunction() {
console.log("2. ๋ ๋ฒ์งธ ํจ์ ์คํ");
}
firstFunction();
secondFunction();
๋น์ :
๋น์ ์ด ์นดํ์ ๊ฐ์ ์๋ฉ๋ฆฌ์นด๋ ธ๋ฅผ ์ฃผ๋ฌธํ๋ค๊ณ ์์ํด๋ณด์ธ์. ์ด ์นดํ๋ ํ ๋ฒ์ ํ๋์ ์ฃผ๋ฌธ๋ง ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ๋น์ ์ ์ฃผ๋ฌธ์ ๋ฐ์ผ๋ฉด ๋ฐ๋ฆฌ์คํ๋ ๋น์ ์ ์ฃผ๋ฌธ์ ์๋ฃํ ๋๊น์ง ๋ค๋ฅธ ๊ณ ๊ฐ์ ์ฃผ๋ฌธ์ ๋ฐ์ง ์์ต๋๋ค. ์๋ฉ๋ฆฌ์นด๋ ธ๊ฐ ์ค๋น๋ ๋๊น์ง ๋ชจ๋ ๊ฒ์ ์ ์ง ์ํ์ ๋๋ค.
2-2. ๋น๋๊ธฐ(Asynchronous)
์ค๋ช :
๋น๋๊ธฐ ์ฝ๋๋ ํน์ ์ฝ๋์ ์๋ฃ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋ค์ ์ฝ๋๋ก ๋์ด๊ฐ๋๋ค.
์ฝ๋ ์์:
function firstFunction(callback) {
setTimeout(function() {
console.log("1. ์ฒซ ๋ฒ์งธ ํจ์ ์คํ");
callback();
}, 1000);
}
function secondFunction() {
console.log("2. ๋ ๋ฒ์งธ ํจ์ ์คํ");
}
firstFunction(secondFunction);
๋น์ :
์ด๋ฒ์๋ ๋น์ ์ด ๋ค๋ฅธ ์นดํ์ ๊ฐ์ ์๋ฉ๋ฆฌ์นด๋ ธ๋ฅผ ์ฃผ๋ฌธํ๋ค๊ณ ์์ํด๋ณด์ธ์. ์ด ์นดํ๋ ์ฌ๋ฌ ์ฃผ๋ฌธ์ ๋์์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ๋น์ ์ ์ฃผ๋ฌธ์ ๋ฐ์ ํ, ๋ฐ๋ฆฌ์คํ๋ ๋ค๋ฅธ ๊ณ ๊ฐ์ ์ฃผ๋ฌธ๋ ๋ฐ์ต๋๋ค. ๋น์ ์ ์๋ฉ๋ฆฌ์นด๋ ธ๊ฐ ๋ง๋ค์ด์ง๋ ๋์, ๋ค๋ฅธ ์ฃผ๋ฌธ๋ค๋ ์งํ๋๊ณ ์ค๋น๋ฉ๋๋ค.
3. ์ค ์ฌ์ฉ ์: ์น ์ฌ์ดํธ ๋ฐ์ดํฐ ๋ก๋ฉ
์น ํ์ด์ง์์ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ฉํ ๋ ๋๊ธฐ์ ๋น๋๊ธฐ ์ฒ๋ฆฌ ๋ฐฉ์์ ์ฐจ์ด๋ฅผ ํ์คํ ๋ณผ ์ ์์ต๋๋ค.
3-1. ๋๊ธฐ ๋ฐฉ์์ ๋ฐ์ดํฐ ๋ก๋ฉ:
์น ํ์ด์ง์์ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ผ ํ ๋, ๋๊ธฐ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ๋ฉด ์ฌ์ฉ์๋ ๋ฐ์ดํฐ๊ฐ ๋ก๋๋ ๋๊น์ง ๊ธฐ๋ค๋ ค์ผ ํฉ๋๋ค. ์ด ์๊ฐ ๋์ ์น ํ์ด์ง๋ ์ด๋ค ๋ฐ์๋ ๋ณด์ด์ง ์๊ฒ ๋ฉ๋๋ค.
์ฝ๋ ์์:
const data = loadDataFromServer(); // ๋๊ธฐ์ ์ผ๋ก ์๋ฒ์์ ๋ฐ์ดํฐ ๋ก๋
displayData(data); // ๋ฐ์ดํฐ ํ์
์ด๋ฐ ๋ฐฉ์์์ ๋ฌธ์ ๋, ๋ง์ฝ loadDataFromServer
ํจ์๊ฐ ๋คํธ์ํฌ ์ง์ฐ ๋๋ ์๋ฒ ๋ฌธ์ ๋ก ์ธํด ๊ธด ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค๋ฉด, ์ฌ์ฉ์๋ ์น ํ์ด์ง๊ฐ "๋ฉ์ถ" ๊ฒ์ฒ๋ผ ๋๋ ์ ์์ต๋๋ค.
3-2. ๋น๋๊ธฐ ๋ฐฉ์์ ๋ฐ์ดํฐ ๋ก๋ฉ:
๋ฐ๋ฉด์, ๋น๋๊ธฐ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ์น ํ์ด์ง๋ ์๋ฒ๋ก๋ถํฐ์ ์๋ต์ ๊ธฐ๋ค๋ฆฌ๋ ๋์๋ ๋ค๋ฅธ ์์ ๋ค์ ๊ณ์ํด์ ์ํํ ์ ์์ต๋๋ค. ์ฌ์ฉ์๋ ์น ํ์ด์ง๊ฐ ๋ฐ์ํ๋ ๊ฒ์ ๊ณ์ ํ์ธํ ์ ์๊ณ , ๋ฐ์ดํฐ๊ฐ ๋ก๋๋๋ฉด ํ๋ฉด์ ํ์๋ฉ๋๋ค.
์ฝ๋ ์์:
loadDataFromServerAsync(function(data) {
displayData(data);
});
๋๋ ์ต๊ทผ์ JavaScript์์๋ async/await
๋ฅผ ์ฌ์ฉํ์ฌ ์๋์ ๊ฐ์ด ์์ฑํ ์๋ ์์ต๋๋ค:
async function displayDataFromServer() {
const data = await loadDataFromServerAsync();
displayData(data);
}
displayDataFromServer();
์ด๋ฌํ ๋น๋๊ธฐ ๋ฐฉ์์ ์ฅ์ ์, ์ฌ์ฉ์์๊ฒ ์น ํ์ด์ง๊ฐ "๋ฉ์ถ" ๊ฒ์ฒ๋ผ ๋ณด์ด์ง ์๋๋ก ํ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ฝ๋์ ๋ณต์ก์ฑ์ด ์ฝ๊ฐ ๋์์ง ์ ์์ผ๋ฉฐ, ์์ธ ์ฒ๋ฆฌ๋ฅผ ์ ์ ํ ํด์ฃผ์ด์ผ ํฉ๋๋ค.
๊ฒฐ๋ก
JavaScript์์ ๋๊ธฐ์ ๋น๋๊ธฐ์ ๊ฐ๋ ์ ์ค์ํฉ๋๋ค. ํนํ ์น ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ต์ ํํ๊ธฐ ์ํด ๋น๋๊ธฐ ์ฒ๋ฆฌ ๋ฐฉ์์ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์ด ๊ธ์ ํตํด ๋๊ธฐ์ ๋น๋๊ธฐ์ ์ฐจ์ด์ ์ฌ์ฉ๋ฒ์ ๋ํ ๊ธฐ๋ณธ์ ์ธ ์ดํด๋ฅผ ์ป์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.