** ๐ 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
,Ajax
,DOM
, ์ด๋ฐ ๊ฑธ ์ง์ ํ ์ ์์ด์. - ๋์ ๋ธ๋ผ์ฐ์ ๊ฐ ์ด๋ฐ ๊ธฐ๋ฅ์ ๋ฐ๋ก Web API ๊ณต๊ฐ์์ ๋์ ์ฒ๋ฆฌํด์ค์.
setTimeout(() => console.log("๋ฆ๊ฒ ์คํ๋จ"), 1000);
โ ์ด ํจ์๋ Call Stack์ ๋ฒ์ด๋์ Web API ๊ณต๊ฐ์์ ์คํ๋ผ์!
๐ฅ 3) Callback Queue (์ฝ๋ฐฑ ๋๊ธฐ์ด)
- Web API ์์ ์ด ๋๋๋ฉด โ โ๋ ์ค๋น๋์ด!โ ํ๋ฉด์ ์ฌ๊ธฐ์ ๋๊ธฐํด์.
- ์๋ฃ๋ ์์ ๋ค์ Call Stack์ ๋ค์ด๊ฐ๋ ค๊ณ ์ค์ ์์.
๐ 4) Event Loop (๊ฐ์์)
- Call Stack์ด ๋น์ด์๋์ง ๊ณ์ ๊ฐ์ํด์.
- ๋น๋ฉด โ Callback Queue์์ ํ๋ ๊บผ๋ด์ ์คํ์์ผ์ค์.
โ 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.
XMLHttpRequest
๋ ๋ ๊ฑฐ์ ๊ธฐ๋ฐ์ ์ฝ๋ฐฑ ๊ตฌ์กฐ๋ก ๊ด๋ฆฌ๊ฐ ์ด๋ ต๊ณ , ๋ฉ๋ชจ๋ฆฌ ์ฐธ์กฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ธฐ ์ฌ์fetch
๋ Promise ๊ธฐ๋ฐ์ด๋ฉฐ, async/await ์ง์,AbortController
,stream
,์ฒด์ด๋
๋ฑ ํ๋ ์น ํ๊ฒฝ์ ๋ ์ ํฉํฉ๋๋ค.- ์ต์ ๋ธ๋ผ์ฐ์ ๊ธฐ์ค์์๋ fetch ์ฌ์ฉ์ด ๊ถ์ฅ๋๋ฉฐ, backwards compatibility๊ฐ ํ์ํ ๊ฒฝ์ฐ์๋ง XHR ์ฌ์ฉ์ ๊ณ ๋ คํฉ๋๋ค.
โ 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 (๋ ์ด์์ ์ฌ๊ณ์ฐ)
- DOM์ ๊ตฌ์กฐ๋ ํฌ๊ธฐ/์์น๊ฐ ๋ฐ๋ ๋ ์ ์ฒด๋ฅผ ๋ค์ ๊ณ์ฐ
- ์:
style.height
,classList.add
,appendChild()
๋ฑ
๐ด ์ฑ๋ฅ ๋ถ๋ด ํผ (์ ์ฒด ํ๋ฉด ๋ ์ด์์ ๋ค์ ๊ณ์ฐ)
๐จ Repaint (์ฌ๊ทธ๋ฆผ)
- ์์, ๋ฐฐ๊ฒฝ ๋ฑ ์๊ฐ์ ์์๋ง ๋ฐ๋ ๋
- ์์น/๊ตฌ์กฐ๋ ์ ๋ฐ๋๋ ๊ฒฝ์ฐ
๐ก ๋น๊ต์ ๊ฐ๋ณ์ง๋ง ๋ฐ๋ณต๋๋ฉด ๋ถ๋ด๋จ
๐งฉ Composite (ํฉ์ฑ)
- ์ฌ๋ฌ ๋ ์ด์ด๋ฅผ ์กฐํฉํด์ ํ๋ฉด์ ์ถ๋ ฅํ๋ ๋ง์ง๋ง ๋จ๊ณ
- GPU ์ฌ์ฉ
โ ๊ฐ์ฅ ๋น ๋ฆ
๐งช 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.
- Ajax๋ ๋ถ๋ถ DOM ์ ๋ฐ์ดํธ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ์ฌ ์ ์ฒด ํ์ด์ง ๋ฆฌ๋ ๋๋ง์ ํผํ ์ ์์ด ์ฑ๋ฅ์ ์ด์ ์ด ์์
- ํ์ง๋ง DOM์ ๋ฐ๋ณต์ ์ผ๋ก ์กฐ์ํ ๊ฒฝ์ฐ Reflow์ Repaint๊ฐ ๊ณผ๋ํ๊ฒ ๋ฐ์ํ๋ฉด CPU ์ฌ์ฉ๋ฅ ์ด ๋์์ง๊ณ ๋ธ๋ผ์ฐ์ ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ ์ ์์
- ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด DocumentFragment ์ฌ์ฉ, batch DOM ์ ๋ฐ์ดํธ, Virtual DOM ์ ์ฉ ๋ฑ์ ์ ๋ต์ด ํ์ํฉ๋๋ค