// index.js
function init() {
for (let i = 0; i < 1000000; i++) {
console.log("woo");
}
}
init();
<!-- index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<script src="./index.js"></script>
</head>
<body>
<h1>hello world</h1>
</body>
</html>
์์ ๊ฐ์ด 1,000,000๋ฒ์ console ์ถ๋ ฅ์ ์คํํ๋ ์คํฌ๋ฆฝํธ ํ์ผ์ด ์๋ค๊ณ ๊ฐ์ ํด๋ณด์.
์ค์ ๋ก ์ด index.html ํ์ผ์ ์คํ์ํค๋ฉด hello world๊ฐ ํ๋ฉด์ ๋ํ๋๋๋ฐ ํ์ฐธ์ด๋ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค.
์คํฌ๋ฆฝํธ ํ์ผ์ fetchํ๊ณ executionํ๋ ์๊ฐ ๋์ HTML์ ํ์ฑ์ด ๋ฉ์ถ๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ๋ง์ฝ ์คํฌ๋ฆฝํธ ํ์ผ์์ DOM ์์์ ์ ๊ทผํ๋ค๊ณ ํ์ ๋ HTML ํ์ฑ์ด ํด๋น DOM ์์๊น์ง ๋ง์น์ง ์์ ์ํฉ์ด๋ผ๋ฉด ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์๋ค.
์ด ํ์์ ๋ํ ์ฒซ ๋ฒ์งธ ํด๊ฒฐ์ฑ ์ ๋ค์๊ณผ ๊ฐ๋ค.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<h1>hello world</h1>
<script src="./index.js"></script>
</body>
</html>
๋ค์๊ณผ ๊ฐ์ด script ํ๊ทธ๋ฅผ body์ ๋งจ ๋ฐ ๋ถ๋ถ์ ์ ์ธํ๋ ๊ฑด ํํ ์ํฉ์ด๋ค.
์คํฌ๋ฆฝํธ ํ๊ทธ๋ฅผ ์ตํ๋จ์ผ๋ก ๋ด๋ ค HTML ๋ฌธ์๊ฐ ๋จผ์ ๋ ๋๋ง ๋๋๋กํ๋ค. ๊ทธ๋ ๊ฒ ํ๋ค๋ฉด ์ฌ์ฉ์๊ฐ ๋ฐ๋ ๋ก๋ฉ์ ๋ํ ์ฒด๊ฐ์ ๋ฎ์ถ ์ ์๋ค.
ํ์ง๋ง ์ด๊ฒ์ ์๋ฒฝํ ํด๊ฒฐ์ฑ ์ด ์๋๋ค.
์คํฌ๋ฆฝํธ ํ์ผ์ ์คํ์ด ์์ฃผ ์ค๋ ๊ฑธ๋ฆฌ๊ณ , ๋ง์ ์ด๋ฒคํธ๋ค์ด ๊ทธ ์คํฌ๋ฆฝํธ ํ์ผ์ ์์ฑ๋์ด ์๋ค๋ฉด ์ฌ์ฉ์์ ์น ์ดํ๋ฆฌ์ผ์ด์ ๊ฐ์ ์ํธ์์ฉ์ ๋๋ ์ด๊ฐ ์๊ธฐ๊ธฐ ๋๋ฌธ์ด๋ค.
๋ํ HTML ํ์ผ์ด ์์ฃผ ํด ๋๋ script์ ์คํ์ ์ค๋ ์๊ฐ์ด ๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ์ ์๋ฒฝํ๊ฒ ํ์ด์ง๊ฐ ๋ก๋ฉ๋ ๋๊น์ง ๋๋ ์ด๊ฐ ์๊ธฐ๊ฒ ๋๋ค.
์ด๋ฐ ์ํฉ์ด ๋ชจ๋ํ ์น ๋ธ๋ผ์ฐ์ ์์๋ ์ด๋ค ์์ผ๋ก ์ฒ๋ฆฌ๋๋ ์ง ์์๋ณด์.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<script defer src="./index.js"></script>
<title>Document</title>
</head>
<body>
<h1>hello world</h1>
</body>
</html>
์ธ๋ถ์์ ๋ถ๋ฌ์จ ์คํฌ๋ฆฝํธ ํ์ผ์ fetch(๋ถ๋ฌ์ค๊ธฐ)์ execution(์คํ) ๊ณผ์ ์ ๊ฑฐ์น๋ค.
defer ์ต์ ์ ์ด ๋ ๊ณผ์ ์ค fetch ๊ณผ์ ์ HTML ํ์ฑ๊ณผ ํจ๊ป ํ๋๋ก ํด์ค๋ค. fetch๋ฅผ ๋ง์น script ํ์ผ์ ํ์ด์ง์ ๊ตฌ์ฑ์ด ๋๋๊ณ ๋ ํ ์คํ๋๋ค.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<script defer src="./index.js"></script>
<script defer src="./index_long.js"></script>
<script defer src="./index_small.js"></script>
<title>Document</title>
</head>
<body>
<h1>hello world</h1>
</body>
</html>
defer ์ต์ ์ ๊ฐ์ง ์คํฌ๋ฆฝํธ ํ๊ทธ๊ฐ ์ฌ๋ฌ ๊ฐ ์๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น? ๋ชจ๋ ํ์ผ์ script ํ๊ทธ๋ฅผ ๋ง๋ ๋ฉ์ถ์ง ์๊ณ fetch ๊ณผ์ ์ ์งํํ๋ค.
๊ทธ๋ฆฌ๊ณ ํ์ด์ง์ ๊ตฌ์ฑ์ด ๋๋๋ฉด ๊ฐ๊ฐ ํ์ผ์ ์คํํ๋ค. ์ด๋ ์คํ๋๋ ์์๋ ๋จผ์ fetch๋ ์์๊ฐ ์๋ ํ์ผ์ด ๋ฑ๋ก๋ ์์์ด๋ค.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<script async src="./index.js"></script>
<script async src="./index_long.js"></script>
<script async src="./index_small.js"></script>
<title>Document</title>
</head>
<body>
<h1>hello world</h1>
</body>
</html>
async ์ต์ ์ defer์ ์ ์ฌํ๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก script ํ๊ทธ๋ฅผ ๋ง๋๋ ์ฆ์ HTML ํ์ผ์ ํ์ฑ์ ๋ฉ์ถ์ง ์๊ณ fetch๋ฅผ ์งํํ๋ค.
ํ์ง๋ง defer๋ ๋ชจ๋ ํ์ด์ง ๊ตฌ์ฑ์ด ๋๋๊ณ ๋ ๋ค ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋๋ ๊ฒ๊ณผ ๋ฌ๋ฆฌ async ์์ฑ์ ์คํฌ๋ฆฝํธ์ fetch๊ฐ ๋๋ ์ฆ์ ์คํ๋๋ค.
์ด๋ฐ ํน์ฑ ๋๋ถ์ ๋ ๋ฆฝ์ ์ผ๋ก ์๋ํ๋ ์คํฌ๋ฆฝํธ๋ผ๋ฉด ๋ณ๋ ฌ์ ์ผ๋ก ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌ๋ ์ ์๋ค๋ ์ฅ์ ์ด ์์ง๋ง, ์คํฌ๋ฆฝํธ ์คํ ์์๋ ํน์ DOM ์์์ ์์กด์ ์ด๋ผ๋ฉด ์ฃผ์๊ฐ ํ์ํ๋ค.
์ถ์ฒ: https://www.webtips.dev/webtips/javascript-interview/async-and-defer-in-javascript
๊ฐ๋จํ๊ฒ๋ ๊ทธ๋ฅ ๋ชจ๋ script ํ๊ทธ์ defer ์์ฑ์ ์ค์ ํ๋ฉด ๋๋ค. ํ์ง๋ง ์ฌ์ฉ์์ ์ง์ ์ ์ผ๋ก ๋ง๋๋ ํ๋ก ํธ์๋์ธ๋งํผ ์ต์ ํ์ ์ ๊ฒฝ์จ์ผ ๋๋ค.
์ต์ ์ ์๋๋ฆฌ์ค๋ฅผ ์ํด์ ๋ ๋ฆฝ์ ์ธ ์คํฌ๋ฆฝํธ๋ async๋ก, ์์กด์ฑ์ด ๋์ ์คํฌ๋ฆฝํธ๋ defer ์ต์ ์ ์ฌ์ฉํ๋ ๊ฒ ๋ฐ๋์งํ๋ค.
๋ฌผ๋ก ๊ทธ ์ด์ ์ ๋ ์์ฑ์ ์ ์ฌ์ ์์ ์ฌ์ฉํ ์ ์๋๋ก js ํ์ผ์ ์ค๊ณํ๋ ๊ฒ ์ฐ์ ์ด๊ฒ ์ง๋ง ๋ง์ด๋ค.
์ฐธ๊ณ ๋ก ๋ ์ต์ ์ ์ธ๋ถ ์คํฌ๋ฆฝํธ์์๋ง ์ ํจํ๋ค.