** ๐Ÿ“Œ 1-1๋‹จ๊ณ„: Ajax์™€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋Ÿฐํƒ€์ž„์˜ ์—ฐ๊ด€์„ฑ**

๐Ÿง  Ajax๊ฐ€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๊ณ , ๊ทธ ๋’ค์— ์–ด๋–ค ๊ธฐ์ˆ  ๊ตฌ์กฐ๊ฐ€ ์žˆ๋Š”์ง€๋ฅผ ์™„๋ฒฝํžˆ ์ดํ•ดํ•˜๋Š” ์ฒซ๊ฑธ์Œ


โœ… 1. Ajax๋Š” ๋ญ˜ ํ•˜๋Š” ๊ฑธ๊นŒ?

๐Ÿ‘‰ Ajax๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ, ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ ๊ณ ์น˜์ง€ ์•Š๊ณ ๋„ ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์‘๋‹ต์„ ๋ฐ›์•„์˜ค๋Š” ๊ธฐ์ˆ ์ด์—์š”.


โœ… 2. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” โ€œ์‹ฑ๊ธ€ ์“ฐ๋ ˆ๋“œโ€ ์–ธ์–ด๋‹ค (์ดˆ๊ฐ„๋‹จ ์ •์˜ ๐Ÿง‘โ€๐Ÿซ)

๐Ÿ‘‰ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•œ ๋ฒˆ์— ํ•œ ์ค„๋งŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์–ด์š”.

๊ทธ๋Ÿฐ๋ฐ Ajax๋Š” ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ธ ๋’ค์—๋„ โ€œ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ โ€ ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ๋ฐ”๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฑธ โ€œ๋น„๋™๊ธฐ(Async)โ€ ๋ผ๊ณ  ํ•ด์š”.


โœ… 3. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋น„๋™๊ธฐ๋กœ ์ž‘๋™ํ•˜๋Š” ์ด์œ ?

๋ฐ”๋กœ ์ด ๊ตฌ์กฐ ๋•๋ถ„์ด์—์š”! ๐Ÿ”ฝ

๐Ÿ“ฆ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋™์ž‘ ๊ตฌ์กฐ (๋Ÿฐํƒ€์ž„ ๊ตฌ์กฐ)

๐Ÿง  JavaScript ๋Ÿฐํƒ€์ž„ ๊ตฌ์กฐ

1. Call Stack (ํ˜ธ์ถœ ์Šคํƒ)
2. Web APIs (๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ œ๊ณต)
3. Callback Queue (์ž‘์—… ๋Œ€๊ธฐ ์ค„)
4. Event Loop (๊ฐ์‹œ์ž)

โœ… 4. ๊ตฌ์กฐ ํ•˜๋‚˜์”ฉ ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•˜๊ธฐ


๐ŸŽฏ 1) Call Stack (ํ˜ธ์ถœ ์Šคํƒ)

console.log("1");
console.log("2");
console.log("3");

โ†’ 1 โ†’ 2 โ†’ 3 ์ˆœ์„œ๋Œ€๋กœ Call Stack์—์„œ ์œ„์—์„œ ์•„๋ž˜๋กœ ์‹คํ–‰


๐ŸŒ 2) Web APIs (๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ)

setTimeout(() => console.log("๋Šฆ๊ฒŒ ์‹คํ–‰๋จ"), 1000);

โ†’ ์ด ํ•จ์ˆ˜๋Š” Call Stack์„ ๋ฒ—์–ด๋‚˜์„œ Web API ๊ณต๊ฐ„์—์„œ ์‹คํ–‰๋ผ์š”!


๐Ÿ“ฅ 3) Callback Queue (์ฝœ๋ฐฑ ๋Œ€๊ธฐ์—ด)


๐Ÿ” 4) Event Loop (๊ฐ์‹œ์ž)


โœ… 5. Ajax๊ฐ€ ์ž‘๋™ํ•˜๋Š” ์ „์ฒด ํ๋ฆ„ ๊ทธ๋ฆผ ๐Ÿ–ผ

๋ฒ„ํŠผ ํด๋ฆญ
   โ†“
Ajax ์š”์ฒญ ์‹œ์ž‘ (fetch, $.ajax)
   โ†“
Web API ์˜์—ญ์œผ๋กœ ์ด๋™ (๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๊ด€๋ฆฌ)
   โ†“
์„œ๋ฒ„ ์‘๋‹ต ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ๋‹ค์Œ ์ฝ”๋“œ ์‹คํ–‰
   โ†“
์‘๋‹ต ์˜ค๋ฉด Callback Queue์— ๋Œ€๊ธฐ
   โ†“
Call Stack์ด ๋น„๋ฉด โ†’ Event Loop๊ฐ€ ๊บผ๋‚ด์„œ ์‹คํ–‰
   โ†“
๊ฒฐ๊ณผ ํ™”๋ฉด์— ์ถœ๋ ฅ

โœ… ์ด ๊ตฌ์กฐ ๋•๋ถ„์— โ€œAjax๋Š” ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ ๋„ ์ž‘๋™โ€ํ•ด์š”!

๐Ÿ‘‰ ์ด๊ฒƒ์ด ๋น„๋™๊ธฐ ๊ตฌ์กฐ(Asynchronous Execution)์˜ ํ•ต์‹ฌ์ด์—์š”.


โœ… 6. ๊ณ ๊ธ‰ ๊ฐœ๋…: Ajax vs Promise vs async/await

๋ฐฉ์‹ ๊ตฌ์กฐ์  ํŠน์ง• ๋ฉ”๋ชจ๋ฆฌ ์˜ํ–ฅ ์ฝœ๋ฐฑ์ง€์˜ฅ ํ•ด๊ฒฐ
Ajax (์ฝœ๋ฐฑ) callback ๊ธฐ๋ฐ˜ ํด๋กœ์ € ๋ˆ„์ˆ˜ ๊ฐ€๋Šฅ์„ฑ ์žˆ์Œ โŒ
Promise .then() ๊ตฌ์กฐ ์ฒด์ด๋‹์œผ๋กœ ๊ตฌ์กฐํ™” โœ…
async/await ๋™๊ธฐ์ฒ˜๋Ÿผ ์ž‘์„ฑ ๊ฐ€์žฅ ๊ฐ€๋…์„ฑ ์ข‹์Œ โœ…โœ…

โœ… 7. ์ •๋ฆฌ ์š”์•ฝ

์šฉ์–ด ์„ค๋ช…
Call Stack ์ฝ”๋“œ ์‹คํ–‰ ๊ณต๊ฐ„ (ํ•œ ์ค„์”ฉ ์ˆœ์„œ๋Œ€๋กœ)
Web APIs Ajax๋‚˜ ํƒ€์ด๋จธ ๋“ฑ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๊ธฐ๋Šฅ
Callback Queue ์™„๋ฃŒ๋œ ์ž‘์—…๋“ค์ด ๋Œ€๊ธฐํ•˜๋Š” ๊ณณ
Event Loop Call Stack์ด ๋น„์—ˆ์„ ๋•Œ ์ฝœ๋ฐฑ์„ ๊บผ๋‚ด ์‹คํ–‰์‹œํ‚ค๋Š” ๊ด€๋ฆฌ์ž
Ajax ํŽ˜์ด์ง€ ์ƒˆ๋กœ๊ณ ์นจ ์—†์ด ์„œ๋ฒ„์™€ ๋ฐ์ดํ„ฐ ์ฃผ๊ณ ๋ฐ›๊ธฐ
๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ๋‹ค๋ฅธ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋ฐฉ์‹

โœ… ์ปดํ“จํ„ฐ๊ณตํ•™ ๋ฉด์ ‘์šฉ ์งˆ๋ฌธ ์˜ˆ์‹œ + ํ•ด์„ค

โ“ Q. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์‹ฑ๊ธ€ ์“ฐ๋ ˆ๋“œ์ธ๋ฐ ์–ด๋–ป๊ฒŒ Ajax๋ฅผ ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌํ•˜๋‚˜์š”?

๐Ÿ‘‰ A. Ajax๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ Web API ๊ณต๊ฐ„์—์„œ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋˜๋ฉฐ, ๋ฉ”์ธ ์“ฐ๋ ˆ๋“œ(Call Stack)๋ฅผ ์ฐจ์ง€ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ์ž‘์—…๊ณผ ๋™์‹œ์— ์ฒ˜๋ฆฌ๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ์™„๋ฃŒ๋˜๋ฉด Callback Queue์— ๋“ฑ๋ก๋˜๊ณ , Event Loop๊ฐ€ ๊ฐ์‹œํ•˜์—ฌ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰์‹œํ‚ต๋‹ˆ๋‹ค.


โœ… XMLHttpRequest vs Fetch ์ฐจ์ด์ ๊ณผ ๋ฉ”๋ชจ๋ฆฌ ์˜ํ–ฅ๋„

๐Ÿ“ก ๋‘ ๊ฐ€์ง€ Ajax ๋ฐฉ์‹์˜ ์ฐจ์ด์™€ ๋‚ด๋ถ€ ๊ตฌ์กฐ, ์„ฑ๋Šฅ, ๋ฉ”๋ชจ๋ฆฌ๊นŒ์ง€ ์ „๋ถ€ ์ดํ•ดํ•˜๋Š” ๋‹จ๊ณ„


โœ… 1. ๋จผ์ € Ajax๋Š” ์–ด๋–ป๊ฒŒ ์š”์ฒญ์„ ๋ณด๋‚ผ๊นŒ?

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๋ฐฉ์‹์€ ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ์–ด์š”.

๋ฐฉ๋ฒ• ๋“ฑ์žฅ ์‹œ๊ธฐ ๋น„๊ณ 
XMLHttpRequest ์˜ค๋ž˜๋จ (IE ์‹œ์ ˆ๋ถ€ํ„ฐ) ์˜ˆ์ „ ๋ฐฉ์‹
fetch() ์ตœ๊ทผ ๋“ฑ์žฅ (ES6 ์ดํ›„) ์ƒˆ๋กœ์šด ํ‘œ์ค€ ๋ฐฉ์‹

โœ… 2. XMLHttpRequest๋ž€?

๐Ÿ“ฆ โ€œXHRโ€์€ ์ด๋Ÿฐ ๋А๋‚Œ์ด์—์š”:

const xhr = new XMLHttpRequest();      // ์š”์ฒญ ๊ฐ์ฒด ๋งŒ๋“ค๊ธฐ
xhr.open("GET", "data.json");          // ์š”์ฒญ ์„ค์ •
xhr.send();                            // ์š”์ฒญ ์ „์†ก
xhr.onload = function () {             // ์‘๋‹ต ์ฒ˜๋ฆฌ
  console.log(xhr.responseText);       // ์‘๋‹ต ๋ณธ๋ฌธ
}

โœจ ํŠน์ง•

ํ•ญ๋ชฉ ์„ค๋ช…
๋ฌธ๋ฒ• ๊ธธ๊ณ  ๋ณต์žกํ•จ
์‘๋‹ต ์ฒ˜๋ฆฌ onload, onerror, onreadystatechange ๋“ฑ ์ฝœ๋ฐฑ ์‚ฌ์šฉ
์œ ์ง€๋ณด์ˆ˜ ํž˜๋“ฆ (์ฝœ๋ฐฑ์ง€์˜ฅ ๋ฐœ์ƒ ๊ฐ€๋Šฅ)
์‚ฌ์šฉ์ฒ˜ jQuery Ajax ๋‚ด๋ถ€์—์„œ๋„ ์‚ฌ์šฉํ•จ

โœ… 3. fetch()๋ž€?

fetch("data.json")
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(error => console.error("์˜ค๋ฅ˜:", error));

โœจ ํŠน์ง•

ํ•ญ๋ชฉ ์„ค๋ช…
๋ฌธ๋ฒ• ๊ฐ„๊ฒฐํ•˜๊ณ  ๊น”๋”ํ•จ
์‘๋‹ต ์ฒ˜๋ฆฌ Promise ๊ธฐ๋ฐ˜ (.then(), .catch())
์œ ์ง€๋ณด์ˆ˜ ํŽธ๋ฆฌํ•จ (async/await ์‚ฌ์šฉ ๊ฐ€๋Šฅ)
์ฒด์ด๋‹ ์‰ฌ์›€, ๊ฐ€๋…์„ฑ ์šฐ์ˆ˜

โœ… 4. ์ค‘ํ•™์ƒ๋„ ์•„๋Š” ์‰ฌ์šด ๋น„์œ 

ํ•ญ๋ชฉ XMLHttpRequest fetch
๋น„์œ  ์ˆ˜๋™์œผ๋กœ ์ „ํ™” ๊ฑธ๊ธฐ + ์‘๋‹ต ๊ธฐ๋‹ค๋ฆฌ๊ธฐ ์Šค๋งˆํŠธํฐ ์•ฑ์œผ๋กœ ์ž๋™ ์˜ˆ์•ฝํ•˜๊ธฐ
๋А๋‚Œ ๋ฒ„ํŠผ 5๋ฒˆ ๋ˆŒ๋Ÿฌ์•ผ ์ž‘๋™ํ•จ ํ•œ ๋ฒˆ์— ์•Œ์•„์„œ ์ฒ˜๋ฆฌ๋จ
์—๋Ÿฌ ์ฒ˜๋ฆฌ ์ˆ˜๋™ ํ™•์ธ ์ž๋™ ๊ฒฝ๊ณ  ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ (catch)

โœ… 5. ๊ณ ๊ธ‰ ๊ธฐ์ˆ  ์ฐจ์ด์  ์ •๋ฆฌ

ํ•ญ๋ชฉ XMLHttpRequest fetch()
์‚ฌ์šฉ์„ฑ ๋ณต์žก, ์ฝœ๋ฐฑ ๊ธฐ๋ฐ˜ ๊ฐ„๋‹จ, Promise ๊ธฐ๋ฐ˜
async ๊ธฐ๋ณธ ๊ธฐ๋ณธ์€ false ํ•ญ์ƒ true (๋น„๋™๊ธฐ ๊ธฐ๋ณธ)
JSON ์ฒ˜๋ฆฌ ์ง์ ‘ ํŒŒ์‹ฑ (JSON.parse) .json()์œผ๋กœ ์ž๋™ ์ฒ˜๋ฆฌ
ํŒŒ์ผ ์—…๋กœ๋“œ FormData๋กœ ๊ฐ€๋Šฅ ๋™์ผํ•˜๊ฒŒ ๊ฐ€๋Šฅ
์š”์ฒญ ์ทจ์†Œ ์–ด๋ ค์›€ (๋ถˆํŽธํ•œ abort) AbortController๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ทจ์†Œ
์ŠคํŠธ๋ฆฌ๋ฐ ์ œํ•œ์  ๊ฐ€๋Šฅ (ReadableStream)
์ง€์› ๋ธŒ๋ผ์šฐ์ € IE ํฌํ•จ ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ €๋งŒ
๋””๋ฒ„๊น… ์–ด๋ ต๊ณ  ๋ณต์žก ๊ฐ„๋‹จํ•˜๊ณ  ๋ชจ๋˜ํ•œ ํˆด๊ณผ ์ž˜ ๋งž์Œ

โœ… 6. ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ ์ฐจ์ด

๐Ÿ”ฌ fetch๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์ ์œผ๋กœ ๋” ์ข‹์€ ์ด์œ 

์š”์†Œ ์„ค๋ช…
GC์™€์˜ ํ˜ธํ™˜์„ฑ fetch๋Š” Promise ๊ธฐ๋ฐ˜์ด๋ผ GC์™€ ์ž˜ ๋งž์Œ (๋น„๋™๊ธฐ ๋Œ€๊ธฐ ์ค‘ ์ฐธ์กฐ ์ œ๊ฑฐ ์šฉ์ด)
์‘๋‹ต ์ฒ˜๋ฆฌ fetch๋Š” ์ฒด์ด๋‹์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋ถˆํ•„์š”ํ•œ ๋ณ€์ˆ˜/์ฐธ์กฐ๊ฐ€ ์ ์Œ
์ŠคํŠธ๋ฆผ ์ฒ˜๋ฆฌ fetch๋Š” ์ŠคํŠธ๋ฆฌ๋ฐ์œผ๋กœ ๋Œ€์šฉ๋Ÿ‰๋„ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ โ†’ ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ ์ข‹์Œ
๋ ˆ๊ฑฐ์‹œ ๊ตฌ์กฐ ํšŒํ”ผ XHR์€ ๋‚ด๋ถ€์— ๋งŽ์€ ์ƒํƒœ(state)๋ฅผ ๊ฐ–๊ณ  ์žˆ์–ด์„œ ๋ˆ„์ˆ˜ ๋ฐœ์ƒ ๊ฐ€๋Šฅ

โœ… 7. ์‹ค๋ฌด์—์„œ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ์˜ˆ์‹œ

let xhr = new XMLHttpRequest();
xhr.open("GET", "/bigfile.json");
xhr.send();
// ์ฝœ๋ฐฑ์—์„œ ์ฐธ์กฐ๋ฅผ ์žŠ์–ด๋ฒ„๋ฆฌ๋ฉด -> ๋ˆ„์ˆ˜ ๋ฐœ์ƒ ๊ฐ€๋Šฅ!

โ†’ ์ฝœ๋ฐฑ ์•ˆ์—์„œ ํฐ JSON์ด๋‚˜ DOM ๊ฐ์ฒด๋ฅผ ๊ณ„์† ์ฐธ์กฐํ•˜๋ฉด, GC๊ฐ€ ๋ชป ์น˜์›€ โ†’ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜


โœ… 8. ๊ณ ๊ธ‰ ๊ฐœ๋…: fetch + AbortController๋กœ ๋ˆ„์ˆ˜ ๋ฐฉ์ง€

const controller = new AbortController();
fetch("/slow-api", { signal: controller.signal })
  .then(res => res.json())
  .then(data => console.log(data))
  .catch(err => {
    if (err.name === "AbortError") console.log("์š”์ฒญ ์ค‘๋‹จ๋จ!");
  });

// ํ•„์š”์‹œ ์ค‘๋‹จ
controller.abort();

โœ… AbortController๋Š” ์š”์ฒญ์„ ์ค‘๊ฐ„์— ๋Š๊ณ , ๋ฉ”๋ชจ๋ฆฌ๋„ ํ•จ๊ป˜ ์ •๋ฆฌํ•ด์ค˜์š”!

โ†’ ์‹ค๋ฌด์—์„œ๋Š” ์Šคํฌ๋กค, ํƒญ ์ด๋™, ๋น ๋ฅธ ํด๋ฆญ ์‹œ ์š”์ฒญ ์ทจ์†Œ์šฉ์œผ๋กœ ์ž์ฃผ ์”๋‹ˆ๋‹ค.


โœ… 9. ์ •๋ฆฌ ์š”์•ฝ

๋น„๊ต ํ•ญ๋ชฉ XMLHttpRequest fetch
๋ฌธ๋ฒ• ๋ณต์žก ๊ฐ„๋‹จ
๋น„๋™๊ธฐ ๊ธฐ๋ณธ false ๊ธฐ๋ณธ true
์ฝœ๋ฐฑ ์ฒ˜๋ฆฌ ์ˆ˜๋™ Promise
JSON ์ฒ˜๋ฆฌ ์ˆ˜๋™ ํŒŒ์‹ฑ .json() ์ง€์›
์š”์ฒญ ์ทจ์†Œ ์–ด๋ ต๋‹ค AbortController๋กœ ๊ฐ€๋Šฅ
๋ฉ”๋ชจ๋ฆฌ ์˜ํ–ฅ ์ฐธ์กฐ ๋งŽ๊ณ  ๋ˆ„์ˆ˜ ๊ฐ€๋Šฅ ์ŠคํŠธ๋ฆผ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ + ๋ฉ”๋ชจ๋ฆฌ ์•ˆ์ „

โœ… ๊ธฐ์ˆ ๋ฉด์ ‘ ์งˆ๋ฌธ ์˜ˆ์‹œ + ํ•ด์„ค

โ“ Q. XMLHttpRequest์™€ fetch์˜ ๊ฐ€์žฅ ํฐ ์ฐจ์ด๋Š” ๋ฌด์—‡์ด๋ฉฐ, ์‹ค๋ฌด์—์„œ ์–ด๋–ค ๊ฒƒ์„ ์„ ํƒํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

โœ… A.


โœ… 1-2๋‹จ๊ณ„: ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง ์—”์ง„๊ณผ Ajax ๋™์ž‘

๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํ™”๋ฉด์„ ๊ทธ๋ฆฌ๋Š” ๊ณผ์ •๊ณผ Ajax๊ฐ€ ์—ฌ๊ธฐ์— ์–ด๋–ค ์˜ํ–ฅ์„ ์ฃผ๋Š”์ง€, ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ์ดํ•ดํ•˜๊ณ  ๊ณ ๊ธ‰ ๊ฐœ๋…๊นŒ์ง€ ๋ชจ๋‘ ๋‹ด๋Š” ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค.


๐Ÿง  1. ๋ธŒ๋ผ์šฐ์ €๋Š” ํ™”๋ฉด์„ ์–ด๋–ป๊ฒŒ ๊ทธ๋ฆด๊นŒ?

์šฐ๋ฆฌ๊ฐ€ ๋ณด๋Š” ์›น ํ™”๋ฉด์€ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ HTML + CSS๋ฅผ ํ•ด์„ํ•˜๊ณ  ๊ทธ๋ ค์„œ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒฐ๊ณผ์˜ˆ์š”.

๐Ÿ“ฆ ํฌ๊ฒŒ 3๋‹จ๊ณ„๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์–ด์š”

๋‹จ๊ณ„ ์„ค๋ช… ๋‚ด๋ถ€ ๊ตฌ์กฐ
1๏ธโƒฃ ํŒŒ์‹ฑ (Parsing) HTML/CSS ๋ถ„์„ํ•ด์„œ ๋‚˜๋ฌด(Tree)๋กœ ๋ฐ”๊ฟˆ DOM Tree, CSSOM Tree
2๏ธโƒฃ ๊ตฌ์„ฑ (Construction) ๋ณด์—ฌ์ค„ ๋‚ด์šฉ์„ ๊ตฌ์กฐ๋กœ ๋งŒ๋“ฆ Render Tree
3๏ธโƒฃ ๊ทธ๋ฆผ (Painting) ์‹ค์ œ ํ™”๋ฉด์— ๊ทธ๋ฆผ์„ ๊ทธ๋ฆผ Layout, Paint, Composite

๐ŸŒณ 2. DOM Tree, CSSOM Tree, Render Tree๋ž€?

โ‘  DOM Tree (Document Object Model)

HTML์„ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋‚˜๋ฌด์ฒ˜๋Ÿผ ๊ตฌ์กฐํ™”ํ•œ ๊ฒƒ

<body>
  <h1>Hello</h1>
  <p>World</p>
</body>

โ†’ ์ด๋ ‡๊ฒŒ ์ƒ๊ธด HTML์€ ๋‚ด๋ถ€์ ์œผ๋กœ

body
โ”œโ”€ h1
โ””โ”€ p

๐ŸŒณ DOM Tree๊ฐ€ ๋งŒ๋“ค์–ด์ ธ์š”.


โ‘ก CSSOM Tree (CSS Object Model)

CSS๋„ ํŠธ๋ฆฌ๋กœ ๋ฐ”๋€Œ์–ด์š”.

h1 { color: red; }
p { font-size: 16px; }

โ†’ ์ด๊ฒƒ๋„ ๋‚˜๋ฌด์ฒ˜๋Ÿผ CSSOM Tree๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.


โ‘ข Render Tree (๋ Œ๋” ํŠธ๋ฆฌ)

DOM + CSSOM์„ ํ•ฉ์ณ์„œ ์‹ค์ œ โ€œํ™”๋ฉด์— ๋ณด์ผ ๊ฒƒ๋งŒโ€ ๋ชจ์€ ๊ตฌ์กฐ์˜ˆ์š”.

Render Tree ์˜ˆ์‹œ:

- h1 [color: red]
- p [font-size: 16px]

๐Ÿ’ก display: none ์š”์†Œ๋Š” ์ด ํŠธ๋ฆฌ์— ํฌํ•จ๋˜์ง€ ์•Š์•„์š”!


๐Ÿงฉ 3. Ajax๋Š” ๋ Œ๋”๋ง์— ์–ด๋–ค ์˜ํ–ฅ์„ ์ค„๊นŒ?

Ajax๋Š” HTML ์ „์ฒด๋ฅผ ๋‹ค์‹œ ๊ทธ๋ฆฌ์ง€ ์•Š์•„์š” โŒ

โ†’ ๋Œ€์‹ , ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ๋™์ ์œผ๋กœ ๋ฐ›์•„์„œ DOM์— ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ:

fetch("user.html")
  .then(res => res.text())
  .then(data => document.body.innerHTML += data);

โœ… ์ƒˆ๋กœ๊ณ ์นจ ์—†์ด ๋ถ€๋ถ„๋งŒ ๋ณ€๊ฒฝ!

โœ… DOM Tree๋Š” ๋ฐ”๋€Œ์ง€๋งŒ ์ „์ฒด ๋ฆฌ๋ Œ๋”๋ง์€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ (์„ฑ๋Šฅ ์ข‹์Œ!)


๐Ÿ›  4. ๊ทธ๋Ÿฐ๋ฐ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ์–ด์š”: โ€œ๋ Œ๋”๋ง ๋™๊ธฐํ™”โ€

์˜ˆ: Ajax๋กœ DOM์„ ์ถ”๊ฐ€ํ•˜๊ณ  ๋ฐ”๋กœ .offsetHeight๋ฅผ ์ธก์ •ํ•˜๋ฉด?

document.body.innerHTML += "<div>์ถ”๊ฐ€๋จ</div>";
console.log(document.querySelector("div").offsetHeight);

โ— ์˜ˆ์ƒ๊ณผ ๋‹ค๋ฅด๊ฒŒ ๋†’์ด๊ฐ€ 0์ผ ์ˆ˜๋„ ์žˆ์–ด์š”. ์™œ?

๐Ÿ‘‰ ๋ธŒ๋ผ์šฐ์ €๋Š” ๋ Œ๋”๋ง์„ ์ง€์—ฐ(์ตœ์ ํ™”)ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด๊ฑธ ๊ฐ•์ œ ๋™๊ธฐํ™”๋ผ๊ณ  ํ•ด์š”

โ†’ DOM ๋ณ€๊ฒฝ ํ›„ ์ฆ‰์‹œ ์Šคํƒ€์ผ/์œ„์น˜ ์ธก์ •ํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ Œ๋”๋ง์„ ๋ฏธ๋ฆฌ ๊ฐ•์ œ๋กœ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค

โœ… ์ด๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๊ฒŒ ๋ฐ”๋กœโ€ฆ


โšก 5. Layout (Reflow), Paint, Composite

๐Ÿ“ Reflow (๋ ˆ์ด์•„์›ƒ ์žฌ๊ณ„์‚ฐ)

๐Ÿ”ด ์„ฑ๋Šฅ ๋ถ€๋‹ด ํผ (์ „์ฒด ํ™”๋ฉด ๋ ˆ์ด์•„์›ƒ ๋‹ค์‹œ ๊ณ„์‚ฐ)


๐ŸŽจ Repaint (์žฌ๊ทธ๋ฆผ)

๐ŸŸก ๋น„๊ต์  ๊ฐ€๋ณ์ง€๋งŒ ๋ฐ˜๋ณต๋˜๋ฉด ๋ถ€๋‹ด๋จ


๐Ÿงฉ Composite (ํ•ฉ์„ฑ)

โœ… ๊ฐ€์žฅ ๋น ๋ฆ„


๐Ÿงช Ajax + DOM ์กฐ์ž‘ โ†’ Reflow/Repaint ์œ ๋ฐœ ์‚ฌ๋ก€

for (let i = 0; i < 1000; i++) {
  let p = document.createElement("p");
  p.innerText = "์ถ”๊ฐ€๋จ";
  document.body.appendChild(p);
}

โ†’ โ— 1000๋ฒˆ์˜ Reflow๊ฐ€ ๋ฐœ์ƒ

โ†’ ์„ฑ๋Šฅ ์ €ํ•˜ ๊ฐ€๋Šฅ์„ฑ ๐Ÿ˜จ


โœ… ํ•ด๊ฒฐ๋ฒ•: Document Fragment, innerHTML ์ตœ์ ํ™”

let frag = document.createDocumentFragment();
for (let i = 0; i < 1000; i++) {
  let p = document.createElement("p");
  p.innerText = "์ถ”๊ฐ€๋จ";
  frag.appendChild(p);
}
document.body.appendChild(frag); // โœ… ๋‹จ 1๋ฒˆ๋งŒ Reflow ๋ฐœ์ƒ

โœ… 6. ๊ณ ๊ธ‰ ๋ Œ๋”๋ง ์ตœ์ ํ™” ๊ธฐ์ˆ 

๊ธฐ๋ฒ• ์„ค๋ช…
requestAnimationFrame() ์• ๋‹ˆ๋ฉ”์ด์…˜ ์‹œ Reflow ํƒ€์ด๋ฐ ์ตœ์ ํ™”
Virtual DOM React์ฒ˜๋Ÿผ DOM ์กฐ์ž‘์„ ์ตœ์†Œํ™”
Layer Promotion CSS transform, will-change๋กœ GPU ์‚ฌ์šฉ ์œ ๋„
Lazy Rendering ๋ณด์ด๋Š” ์š”์†Œ๋งŒ ๊ทธ๋ฆฌ๊ธฐ (IntersectionObserver ๋“ฑ)

โœ… 7. ์ •๋ฆฌ ์š”์•ฝ

๊ฐœ๋… ์„ค๋ช…
DOM Tree HTML ๊ตฌ์กฐ๋ฅผ ๋‚˜๋ฌด์ฒ˜๋Ÿผ ํ‘œํ˜„ํ•œ ๊ตฌ์กฐ
CSSOM Tree CSS ์Šคํƒ€์ผ ๊ตฌ์กฐ
Render Tree DOM + CSSOM โ†’ ์‹ค์ œ ๊ทธ๋ ค์งˆ ์š”์†Œ๋“ค๋งŒ ๋ชจ์Œ
Ajax ์˜ํ–ฅ ์ „์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ์ผ๋ถ€๋งŒ DOM ์ˆ˜์ • โ†’ ์„ฑ๋Šฅ ์ข‹์Œ
Reflow ์œ„์น˜/ํฌ๊ธฐ ๊ณ„์‚ฐ โ†’ ๋А๋ฆผ
Repaint ์ƒ‰์ƒ๋งŒ ๋ณ€๊ฒฝ โ†’ ๋น ๋ฆ„
Composite ์ตœ์ข… ํ™”๋ฉด ํ•ฉ์„ฑ โ†’ ๊ฐ€์žฅ ๋น ๋ฆ„

โœ… ๊ธฐ์ˆ ๋ฉด์ ‘ ์˜ˆ์‹œ ์งˆ๋ฌธ

โ“ Q. Ajax๋ฅผ ์ด์šฉํ•œ DOM ์กฐ์ž‘์ด ๋งŽ์•„์ง€๋ฉด ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง์— ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

โœ… A.