๐ ์น ๋ธ๋ผ์ฐ์ง ๊ณผ์
1. ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฒ์์ HTML์ ๊ฐ์ ธ์ค๊ณ ํ๋ฉด์ ๋ ๋๋งํ๋ ๊ณผ์ ์ ์ค๋ช ํด์ฃผ์ธ์โ
๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฒ์์ HTML์ ์ด๋ป๊ฒ ๊ฐ์ ธ์ค๊ณ , ํ๋ฉด์ ์ด๋ป๊ฒ ๋ ๋๋งํ๋์ง ์ค๋ช ํด์ฃผ์ธ์
1. ์์ฒญ ์์โ
- URL ์ ๋ ฅ: ์ฌ์ฉ์๊ฐ ๋ธ๋ผ์ฐ์ ์ URL์ ์ ๋ ฅํ๊ฑฐ๋ ๋งํฌ๋ฅผ ํด๋ฆญํ๋ฉด, ๋ธ๋ผ์ฐ์ ๋ ํด๋น URL์ ํ์ฑํ์ฌ ์ด๋ ์๋ฒ์ ์์ฒญ์ ๋ณด๋ผ์ง ํ์ธํฉ๋๋ค.
- DNS ์กฐํ: ๋ธ๋ผ์ฐ์ ๊ฐ DNS ์กฐํ๋ฅผ ์คํํ์ฌ ํด๋น ์๋ฒ์ IP ์ฃผ์๋ฅผ ์ฐพ์ต๋๋ค.
- ์ฐ๊ฒฐ ์๋ฆฝ: ๋ธ๋ผ์ฐ์ ๋ ์ธํฐ๋ท์ ํตํด HTTP ๋๋ HTTPS ํ๋กํ ์ฝ์ ์ฌ์ฉํ์ฌ ์๋ฒ์ IP ์ฃผ์๋ก ์์ฒญ์ ๋ณด๋ ๋๋ค. HTTPS ํ๋กํ ์ฝ์ธ ๊ฒฝ์ฐ SSL/TLS ์ฐ๊ฒฐ๋ ์ํํด์ผ ํฉ๋๋ค.
2. ์๋ฒ ์๋ตโ
- ์์ฒญ ์ฒ๋ฆฌ: ์๋ฒ๊ฐ ์์ฒญ์ ์์ ํ๋ฉด, ์์ฒญ ๊ฒฝ๋ก์ ๋งค๊ฐ๋ณ์์ ๋ฐ๋ผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ํด๋น ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ต๋๋ค.
- Response ์ ์ก: ์ดํ HTML ํ์ผ์ HTTP Response์ ์ผ๋ถ๋ก ๋ธ๋ผ์ฐ์ ์ ๋ฐํํฉ๋๋ค. Response์๋ ์ํ ์ฝ๋๋ ๊ธฐํ ๋งค๊ฐ๋ณ์(CORS, content-type ๋ฑ)๋ ํฌํจ๋ฉ๋๋ค.
3. HTML ํ์ฑโ
- DOM Tree ๊ตฌ์ถ: ๋ธ๋ผ์ฐ์ ๊ฐ HTML ํ์ผ์ ์ฝ๊ธฐ ์์ํ๋ฉฐ, HTML ํ์ผ์ ํ๊ทธ์ ์์ฑ์ ๋ฐ๋ผ DOM์ผ๋ก ๋ณํํ๊ณ ๋ฉ๋ชจ๋ฆฌ์ DOM Tree๋ฅผ ๊ตฌ์ถํฉ๋๋ค.
- ํ์ ๋ฆฌ์์ค ์์ฒญ(requesting subresources): HTML ํ์ผ์ ํ์ฑํ๋ ๊ณผ์ ์์ CSS, JavaScript, ์ด๋ฏธ์ง ๋ฑ์ ์ธ๋ถ ๋ฆฌ์์ค๋ฅผ ๋ฐ๊ฒฌํ๋ฉด, ๋ธ๋ผ์ฐ์ ๋ ์๋ฒ์ ์ถ๊ฐ ์์ฒญ์ ๋ณด๋ด ํด๋น ๋ฆฌ์์ค๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
4. ํ์ด์ง ๋ ๋๋ง(Render Page)โ
- CSSOM Tree ๊ตฌ์ถ: ๋ธ๋ผ์ฐ์ ๊ฐ CSS ํ์ผ์ ํ์ฑํ์ฌ CSSOM Tree๋ฅผ ๊ตฌ์ถํฉ๋๋ค.
- Render Tree: ๋ธ๋ผ์ฐ์ ๊ฐ DOM Tree์ CSSOM Tree๋ฅผ ํฉ์ณ Render Tree๋ฅผ ์์ฑํฉ๋๋ค. ์ด ํธ๋ฆฌ์๋ ๋ ๋๋งํ ๋ชจ๋ ๋ ธ๋์ ํด๋น ์คํ์ผ์ด ํฌํจ๋ฉ๋๋ค.
- Layout(๋ ์ด์์): ๋ธ๋ผ์ฐ์ ๊ฐ ๋ ์ด์์(Layout ๋๋ Reflow)์ ์ํํ์ฌ ๊ฐ ๋ ธ๋์ ์์น์ ํฌ๊ธฐ๋ฅผ ๊ณ์ฐํฉ๋๋ค.
- Paint(ํ์ธํ ): ๋ง์ง๋ง์ผ๋ก ๋ธ๋ผ์ฐ์ ๊ฐ ํ์ธํ (painting) ๋จ๊ณ๋ฅผ ๊ฑฐ์ณ ๊ฐ ๋ ธ๋์ ๋ด์ฉ์ ํ์ด์ง์ ๊ทธ๋ฆฝ๋๋ค.
5. JavaScript ์ํธ์์ฉโ
- JavaScript ์คํ: HTML์ JavaScript๊ฐ ํฌํจ๋์ด ์์ผ๋ฉด ๋ธ๋ผ์ฐ์ ๊ฐ ์ด๋ฅผ ํ์ฑํ๊ณ ์คํํฉ๋๋ค. ์ด ๊ณผ์ ์์ DOM์ ๋ณ๊ฒฝํ๊ฑฐ๋ ์คํ์ผ์ ์์ ํ ์ ์์ต๋๋ค.
์ ์ฒด ๊ณผ์ ์ ์ ์ง์ ์ผ๋ก ์งํ๋ฉ๋๋ค. ์ด๋ก ์ ์ผ๋ก ์ฌ์ฉ์๋ ๋จผ์ ์ผ๋ถ ์น ํ์ด์ง ๋ด์ฉ์ ๋ณด๊ณ , ๋ง์ง๋ง์ ์ ์ฒด ์น ํ์ด์ง๋ฅผ ๋ณด๊ฒ ๋ฉ๋๋ค. ์ด ๊ณผ์ ์์ ์ฌ๋ฌ ๋ฒ์ Reflow์ Repaint๊ฐ ๋ฐ์ํ ์ ์์ผ๋ฉฐ, ํนํ ๋ณต์กํ ์คํ์ผ์ด๋ ์ธํฐ๋์ ํจ๊ณผ๊ฐ ์๋ ์น ํ์ด์ง์์ ๋๋๋ฌ์ง๋๋ค. ์ด๋ ๋ธ๋ผ์ฐ์ ์์ฒด์ ์ต์ ํ ์ธ์๋ ๊ฐ๋ฐ์๋ ๋ณดํต ์ฌ์ฉ์ ๊ฒฝํ์ ๋ ๋ถ๋๋ฝ๊ฒ ๋ง๋ค๊ธฐ ์ํ ๋ค์ํ ๋ฐฉ๋ฒ์ ์ ์ฉํฉ๋๋ค.
2. Reflow์ Repaint๋ฅผ ์ค๋ช ํด์ฃผ์ธ์โ
Reflow(๋ฆฌํ๋ก์ฐ)โ
์น ํ์ด์ง์ DOM์ ๋ณํ๊ฐ ์๊ฒจ ๋ธ๋ผ์ฐ์ ๊ฐ ์์์ ์์น๋ฅผ ๋ค์ ๊ณ์ฐํ์ฌ ์ฌ๋ฐ๋ฅธ ์์น์ ๋ฐฐ์นํด์ผ ํ๋ ๊ฒ์ ๋งํฉ๋๋ค. ์ฝ๊ฒ ๋งํ๋ฉด, Layout์ ๋ค์ ์์ฑํ์ฌ ์์๋ฅผ ์ฌ๋ฐฐ์นํ๋ ๊ฒ์ ๋๋ค.
Reflow ๋ฐ์ ์กฐ๊ฑดโ
Reflow๋ ๋ ๊ฐ์ง ์๋๋ฆฌ์ค๊ฐ ์์ต๋๋ค. ํ๋๋ ์ ์ฒด ํ์ด์ง์ ๋ณํ๊ฐ ์๊ธฐ๋ ๊ฒ์ด๊ณ , ๋ค๋ฅธ ํ๋๋ ์ผ๋ถ ์ปดํฌ๋ํธ ์์ญ์ ๋ณํ๊ฐ ์๊ธฐ๋ ๊ฒ์ ๋๋ค.
- ํ์ด์ง ์ด๊ธฐ ์ง์ ์๊ฐ ๊ฐ์ฅ ํฐ ์ํฅ์ ๋ฏธ์น๋ Reflow์ ๋๋ค
- DOM ์์ ์ถ๊ฐ ๋๋ ์ญ์
- ์์์ ํฌ๊ธฐ ๋ณ๊ฒฝ, ์๋ฅผ ๋ค์ด ๋ด์ฉ ์ถ๊ฐ๋ ๊ธ์ ํฌ๊ธฐ ๋ณ๊ฒฝ ๋ฑ
- ์์์ ๋ ์ด์์ ์กฐ์ , ์๋ฅผ ๋ค์ด margin์ด๋ padding์ ํตํ ์ด๋
- ๋ธ๋ผ์ฐ์ ์์ฒด์ ์ฐฝ ํฌ๊ธฐ ๋ณ๊ฒฝ
- ์์ฌ ํด๋์ค ํธ๋ฆฌ๊ฑฐ, ์๋ฅผ ๋ค์ด hover ํจ๊ณผ
Repaint(๋ฆฌํ์ธํธ)โ
Layout์ ๋ณ๊ฒฝ ์์ด ์์ํ๊ฒ ์์๋ฅผ ์ ๋ฐ์ดํธํ๊ฑฐ๋ ๋ณ๊ฒฝํ๋ ๊ฒ์ ๋๋ค. ์์ ์์ฒด๊ฐ Layout์ ํฌํจ๋์ด ์์ผ๋ฏ๋ก, Reflow๊ฐ ๋ฐ์ํ๋ฉด ๋ฐ๋์ Repaint๋ ๋ฐ์ํ์ง๋ง, Repaint๋ง ๋ฐ์ํ๋ค๊ณ ํด์ ๋ฐ๋์ Reflow๊ฐ ๋ฐ์ํ๋ ๊ฒ์ ์๋๋๋ค.
Repaint ๋ฐ์ ์กฐ๊ฑดโ
- ์์์ ์์์ด๋ ๋ฐฐ๊ฒฝ ๋ณ๊ฒฝ, ์๋ฅผ ๋ค์ด color๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ background ์์ฑ์ ์กฐ์ ํ๋ ๊ฒ ๋ฑ
- ์์์ ๊ทธ๋ฆผ์๋ border๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ๋ Repaint์ ํด๋น
Reflow ๋๋ Repaint ์ต์ ํ ๋ฐฉ๋ฒโ
- table ๋ ์ด์์์ ์ฌ์ฉํ์ง ๋ง์ธ์. table ์์ฑ์ ์์ฑ ๋ณ๊ฒฝ์ผ๋ก ์ธํด ๋ ์ด์์์ด ์ฌ๋ฐฐ์น๋๊ธฐ ์ฝ์ต๋๋ค. ๋ถ๋์ดํ๊ฒ ์ฌ์ฉํด์ผ ํ ๊ฒฝ์ฐ, ๋งค๋ฒ ํ ํ๋ง ๋ ๋๋งํ๋๋ก ๋ค์ ์์ฑ์ ์ถ๊ฐํ์ฌ ์ ์ฒด ํ
์ด๋ธ ๋ฒ์์ ์ํฅ์ ์ฃผ์ง ์๋๋ก ํ์ธ์. ์:
table-layout: auto;๋๋table-layout: fixed; - DOM์ ์ง์ ์กฐ์ํ์ฌ ์คํ์ผ์ ํ๋์ฉ ์กฐ์ ํ์ง ๋ง๊ณ , ๋ณ๊ฒฝ์ด ํ์ํ ์คํ์ผ์ class๋ก ์ ์ํ ํ JS๋ฅผ ํตํด ์ ํํด์ผ ํฉ๋๋ค.
- Vue ํ๋ ์์ํฌ๋ฅผ ์๋ก ๋ค๋ฉด, class ๋ฐ์ธ๋ฉ ๋ฐฉ์์ผ๋ก ์คํ์ผ์ ์ ํํ ์ ์์ผ๋ฉฐ, function์ผ๋ก ์ง์ ์คํ์ผ์ ์์ ํ๋ ๊ฒ์ ํผํด์ผ ํฉ๋๋ค.
- ์์ฃผ ์ ํ์ด ํ์ํ ์๋๋ฆฌ์ค, ์๋ฅผ ๋ค์ด ํญ ์ ํ์ ๊ฒฝ์ฐ,
v-if๋ณด๋คv-show๋ฅผ ์ฐ์ ์ ์ผ๋ก ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์ ์๋ CSS์display: none;์์ฑ๋ง ์ฌ์ฉํ์ฌ ์จ๊ธฐ์ง๋ง, ํ์๋ ์๋ช ์ฃผ๊ธฐ๋ฅผ ํธ๋ฆฌ๊ฑฐํ์ฌ ์์๋ฅผ ์ฌ์์ฑํ๊ฑฐ๋ ์๋ฉธ์ํค๋ฏ๋ก ๋ ํฐ ์ฑ๋ฅ ์๋น๊ฐ ๋ฐ์ํฉ๋๋ค. - ๋ถ๋์ดํ๊ฒ Reflow๋ฅผ ํธ๋ฆฌ๊ฑฐํด์ผ ํ๋ ๊ฒฝ์ฐ,
requestAnimationFrame์ ํตํด ์ต์ ํํ ์ ์์ต๋๋ค(์ด API๋ ์ ๋๋ฉ์ด์ ์ ์ํด ์ค๊ณ๋์ด ๋ธ๋ผ์ฐ์ ์ ํ๋ ์ ์๋์ ๋๊ธฐํํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค). ์ด๋ ๊ฒ ํ๋ฉด ์ฌ๋ฌ ๋ฒ์ Reflow๋ฅผ ํ ๋ฒ์ผ๋ก ํฉ์น๊ณ Repaint ํ์๋ฅผ ์ค์ผ ์ ์์ต๋๋ค.- ์๋ฅผ ๋ค์ด ํน์ ์ ๋๋ฉ์ด์
์ด ํ์ด์ง์์ ๋ชฉํ๋ฅผ ํฅํด ์ด๋ํด์ผ ํ ๋,
requestAnimationFrame์ ํตํด ๋งค๋ฒ์ ์ด๋์ ๊ณ์ฐํ ์ ์์ต๋๋ค. - ๋ง์ฐฌ๊ฐ์ง๋ก, CSS3์ ์ผ๋ถ ์์ฑ์ ํด๋ผ์ด์ธํธ ์ธก ํ๋์จ์ด ๊ฐ์์ ํธ๋ฆฌ๊ฑฐํ์ฌ ์ ๋๋ฉ์ด์
์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค. ์:
transformopacityfiltersWill-change
- ์๋ฅผ ๋ค์ด ํน์ ์ ๋๋ฉ์ด์
์ด ํ์ด์ง์์ ๋ชฉํ๋ฅผ ํฅํด ์ด๋ํด์ผ ํ ๋,
- ๊ฐ๋ฅํ๋ค๋ฉด ํ์ ๋ ๋ฒจ์ DOM ๋ ธ๋์์ ์คํ์ผ์ ๋ณ๊ฒฝํ์ฌ, ๋ถ๋ชจ ์์์ ์คํ์ผ ๋ณ๊ฒฝ์ผ๋ก ์ธํด ๋ชจ๋ ํ์ ์์๊ฐ ์ํฅ์ ๋ฐ๋ ๊ฒ์ ๋ฐฉ์งํ์ธ์.
- ์ ๋๋ฉ์ด์
์ ์คํํด์ผ ํ๋ ๊ฒฝ์ฐ, ์ ๋ ์์น(
absolute,fixed) ์์์์ ์ฌ์ฉํ๋ฉด ๋ค๋ฅธ ์์์ ๋ํ ์ํฅ์ด ์ ์ผ๋ฉฐ, Repaint๋ง ํธ๋ฆฌ๊ฑฐํ์ฌ Reflow๋ฅผ ํผํ ์ ์์ต๋๋ค.
Exampleโ
// bad
const element = document.querySelector('.wrapper');
element.style.margin = '4px';
element.style.padding = '6px';
element.style.borderRadius = '10px';
// good
.update {
margin: 4px;
padding: 6px;
border-radius: 10px;
}
const element = document.querySelector('.wrapper');
element.classList.add('update');
Referenceโ
- Render-tree Construction, Layout, and Paint
- ๋ธ๋ผ์ฐ์ ์ Reflow์ Repaint
- Reflow์ Repaint ์๊ฐ ๋ฐ ์ต์ ํ ๋ฐฉ๋ฒ
3. ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฒ์ OPTIONS ์์ฒญ์ ๋ณด๋ด๋ ์์ ์ ์ค๋ช ํด์ฃผ์ธ์โ
๋ธ๋ผ์ฐ์ ๊ฐ ์ธ์ ์๋ฒ์ OPTIONS ์์ฒญ์ ๋ณด๋ด๋์ง ์ค๋ช ํด์ฃผ์ธ์
๋๋ถ๋ถ์ ๊ฒฝ์ฐ, CORS ์๋๋ฆฌ์ค์ ์ ์ฉ๋ฉ๋๋ค. ์ค์ ์์ฒญ์ ๋ณด๋ด๊ธฐ ์ ์ preflight(์ฌ์ ๊ฒ์ฌ) ๊ณผ์ ์ด ์์ผ๋ฉฐ, ๋ธ๋ผ์ฐ์ ๊ฐ ๋จผ์ OPTIONS ์์ฒญ์ ๋ณด๋ด ์๋ฒ๊ฐ ์ด ๊ต์ฐจ ์ถ์ฒ ์์ฒญ์ ํ์ฉํ๋์ง ํ์ธํฉ๋๋ค. ์๋ฒ๊ฐ ํ์ฉํ๋ค๊ณ ์๋ตํ๋ฉด ๋ธ๋ผ์ฐ์ ๊ฐ ์ค์ ์์ฒญ์ ๋ณด๋ด๊ณ , ํ์ฉํ์ง ์์ผ๋ฉด ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฌ๋ฅผ ๋ฐ์์ํต๋๋ค.
๋ํ, ์์ฒญ์ method๊ฐ GET, HEAD, POST๊ฐ ์๋ ๊ฒฝ์ฐ์๋ OPTIONS ์์ฒญ์ด ํธ๋ฆฌ๊ฑฐ๋ฉ๋๋ค.