8์›” Challenge : ๋‹จ์–ด ๋‘ ๊ฐœ์”ฉ ์†Œ๊ฐœํ•˜๊ธฐ

[html] script / script async vs script defer ์ฐจ์ด

๋ฐ์ฅฌ๋”” 2023. 8. 7. 08:23

์˜ค๋Š˜์€ ์›”์š”์ผ์ด๋‹ˆ ํŠน๋ณ„ํžˆ ์šฉ์–ด ์„ธ ๊ฐœ !
์‚ฌ์‹ค ์„ธ ๋‹จ์–ด๋กœ ๋ณด์ด์ง€๋งŒ script async ์™€ script defer ์„ ๋น„๊ตํ•˜๊ธฐ ์œ„ํ•ด ๋„ฃ์€ ๊ฒƒ ..! ๐Ÿคญ
์˜ค๋Š˜์€ ์ด ๋‘ ๊ฐœ์˜ ๋‹จ์–ด๋ฅผ ์žฅ๋‹จ์ ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋น„๊ตํ•˜๋Š” ํ๋ฆ„์œผ๋กœ ์ž‘์„ฑํ•ด ๋ณด๋Ÿฌ ํ•œ๋‹ค.
 



1. <script>

๋จผ์ € <script>๋ž€,๋Š” JavaScript ์ฝ”๋“œ๋ฅผ ๋ฌธ์„œ์— ํฌํ•จ์‹œํ‚ค๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ํƒœ๊ทธ์ด๋‹ค. ์ด ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›น ํŽ˜์ด์ง€์—์„œ JavaScript ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์ƒํ˜ธ์ž‘์šฉ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ๋ณดํ†ต ๋ธŒ๋ผ์šฐ์ €๋Š” HTML ๋ฌธ์„œ๋ฅผ ํŒŒ์‹ฑํ•  ๋•Œ, ์œ„์—์„œ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ํŒŒ์‹ฑํ•˜๋ฏ€๋กœ,
ํŒŒ์‹ฑ ๊ณผ์ •์—์„œ script ํƒœ๊ทธ๋ฅผ ๋งŒ๋‚˜๋ฉด ํ•ด๋‹น js ํŒŒ์ผ์˜ ๋‹ค์šด๋กœ๋“œ๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ DOM ์ƒ์„ฑ์„ ๋ฉˆ์ถ˜๋‹ค. (์œ„์˜ ๊ทธ๋ฆผ ์ฐธ๊ณ !)

 
์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํŽ˜์ด์ง€ ์ƒ์„ฑ์„ ๋ง‰์•„๋ฒ„๋ฆฐ๋‹ค. ๊ทธ๋Ÿผ ์‚ฌ์šฉ์ž๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋‹ค์šด๋ฐ›์„ ๋•Œ๊นŒ์ง€ ์Šคํฌ๋ฆฝํŠธ์˜ ์•„๋ž˜์— ์œ„์น˜ํ•œ ํŽ˜์ด์ง€๋ฅผ ๋ณผ ์ˆ˜ ์—†๊ฒŒ ๋˜๋ฏ€๋กœ, ๋ณดํ†ต  script ํƒœ๊ทธ๋Š” body์˜ ์ตœํ•˜๋‹จ์— ์œ„์น˜ํ•œ๋‹ค.
 
ํ•˜์ง€๋งŒ script ํƒœ๊ทธ๊ฐ€ ๋งจ ์•„๋ž˜์— ์œ„์น˜ํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด, HTML ๋ฌธ์„œ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•œ ํ›„ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋‹ค์šด๋ฐ›์•„ ์‹คํ–‰ํ•˜๋ฏ€๋กœ ํŽ˜์ด์ง€ ๋กœ๋”ฉ ์‹œ๊ฐ„์ด ๊ธธ์–ด์ง€๊ฒŒ ๋œ๋‹ค. 
์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ script ํƒœ๊ทธ์˜ async์™€ defer ์†์„ฑ์ด ์žˆ๋‹ค.
 
์ด ๋‘ ์†์„ฑ์— ๋Œ€ํ•ด ํƒ๊ตฌํ•ด๋ณด์ž! 



๐Ÿ““ async vs defer ๋น„๊ตํ•˜๊ธฐ์— ์•ž์„œ!

HTML์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ํฌํ•จํ• ๋•Œ ์–ด๋–ป๊ฒŒ ํฌํ•จํ•˜๋Š”๊ฒŒ ๋” ํšจ์œจ์ ์ธ์ง€๋ฅผ ๊ด€์ ์œผ๋กœ ์ฝ์–ด์ฃผ์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค!

async์™€ defer๋Š” <script> ํƒœ๊ทธ์—์„œ ์™ธ๋ถ€ ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ๋กœ๋“œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์†์„ฑ์ด๋ผ๋Š” ๊ณตํ†ต์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ ์ด ๋‘˜์˜ ์ฃผ์š” ์ฐจ์ด์ ์€ ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์ด ๋กœ๋“œ๋˜๋Š” ๋™์ž‘๊ณผ ์›น ํŽ˜์ด์ง€์˜ ๋ Œ๋”๋ง๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค!



2. <script> + async

async ์†์„ฑ์—์„œ ๋ธŒ๋ผ์šฐ์ €๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌํ•˜์—ฌ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋‹ค์šด๋กœ๋“œํ•œ๋‹ค.
์œ„์˜ ๊ทธ๋ฆผ์„ ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋“ฏ, async ์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” HTML ํŒŒ์‹ฑ๊ณผ ๋™์‹œ์—  script๋ฅผ ๋‹ค์šด๋ฐ›๊ณ  ์™„๋ฃŒ๋˜๋ฉด ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋œ๋‹ค.
ํ•˜์ง€๋งŒ js ํŒŒ์ผ์„ ์‹คํ–‰ํ•˜๋Š” ๋™์•ˆ์—๋Š” HTML ํŒŒ์‹ฑ์ด ๋ฉˆ์ถ˜๋‹ค๋Š” ๋‹จ์ ์ด ์กด์žฌํ•œ๋‹ค.

async ์†์„ฑ์€ DOM์„ ์กฐ์ž‘ํ•˜์ง€ ์•Š๊ณ  HTML ์˜์กด์„ฑ์ด ์—†๋Š” ์ฝ”๋“œ์—๋งŒ ์‚ฌ์šฉํ•˜๊ธฐ!


๋‹ค์‹œ ์„ค๋ช…ํ•˜๋ฉด, ๋‹ค์šด๋กœ๋“œ ์ˆœ์„œ๋Š” HTML์— ์ •์˜๋œ ์ˆœ์„œ๋Œ€๋กœ ์ด๋ฃจ์–ด์ง€์ง€๋งŒ,
์Šคํฌ๋ฆฝํŠธ ๋‹ค์šด๋กœ๋“œ๊ฐ€ ์™„๋ฃŒ๋˜์ž๋งˆ์ž ์‹คํ–‰๋˜๋ฏ€๋กœ ์‹คํ–‰๋˜๋Š” ์ˆœ์„œ๋Š” ๋‹ค์šด๋กœ๋“œ๊ฐ€ ์™„๋ฃŒ๋œ ์ˆœ์„œ๋ฅผ ๋”ฐ๋ฅธ๋‹ค.

์ฆ‰, ์•„๋ž˜์™€ ๊ฐ™์ด ๋‹ค์šด๋กœ๋“œ ์‹œ์ž‘์€ A๊ฐ€ ๋จผ์ € ๋ผ๋„, B๊ฐ€ ๋จผ์ € ๋‹ค์šด๋กœ๋“œ ์™„๋ฃŒ ๋œ๋‹ค๋ฉด ์‹คํ–‰ ์ˆœ์„œ๋Š” B->A๋ผ๋Š” ๋œป์ด๋‹ค.

// A → B ์ˆœ์œผ๋กœ ๋‹ค์šด๋กœ๋“œ, ๋‹ค์šด๋กœ๋“œ ์™„๋ฃŒ์ˆœ(B → A)์œผ๋กœ ์‹คํ–‰
<script async src="https://javascript.info/article/script-async-defer/A.js"></script>
<script async src="https://javascript.info/article/script-async-defer/B.js"></script>

 

2. <script> + defer

๋จผ์ € defer ์†์„ฑ๋„ ๋ธŒ๋ผ์šฐ์ €๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋‹ค์šด๋กœ๋“œํ•œ๋‹ค๋Š” ์ ์—์„œ async์†์„ฑ๊ณผ ๊ณตํ†ต์ ์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
defer ์†์„ฑ๋„ html ํŒŒ์‹ฑ๊ณผ ๋™์‹œ์— ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋‹ค์šด๋กœ๋“œ ํ•œ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ defer๋Š” async์™€๋Š” ๋‹ฌ๋ฆฌ ๋‹ค์šด๋กœ๋“œ๋œ js ํŒŒ์ผ์€ DOM(ํŽ˜์ด์ง€) ์ƒ์„ฑ์ด ์™„๋ฃŒ๋œ ์งํ›„์— ์‹คํ–‰๋œ๋‹ค.(=DOMContentLoaded ์งํ›„)
๊ทธ๋ž˜์„œ defer ์†์„ฑ์€ DOM์„ ์กฐ์ž‘ํ•ด์•ผ ํ•˜๊ฑฐ๋‚˜, HTML์ด ๋ชจ๋‘ ํŒŒ์‹ฑ๋œ ํ›„ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ์ฝ”๋“œ์ด๊ฑฐ๋‚˜, HTMl์— ์˜์กด์ ์ธ ์ฝ”๋“œ์˜ ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ถ”๊ฐ€์ ์œผ๋กœ, ์œ„์˜ async ์˜ˆ์‹œ์ฝ”๋“œ์™€ ๊ฐ™์ด defer๋„ A->B ์ˆœ์œผ๋กœ ๋‹ค์šด๋กœ๋“œ๊ฐ€ ์‹œ์ž‘๋ผ๋„, ์™„๋ฃŒ๋œ jsํŒŒ์ผ์ด B->A ์ˆœ์ด๋ผ๋ฉด, ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ ์ˆœ์„œ๋Š” B->A์ด๋‹ค.
๋‹จ, ๋จผ์ € ๋‹ค์šด๋กœ๋“œ ๋ผ๋„ ์งํ›„๊ฐ€ ์•„๋‹ˆ๋ผ ํŒŒ์‹ฑ ํ›„์— ์‹คํ–‰๋œ๋‹ค๋Š” ๊ฒƒ์ด async์™€์˜ ์ฐจ์ด์ด๋‹ค!