CSS-in-JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ต์ ํ, ์ฑ๋ฅ ๊ฐ์ , ์ผ๋ฐ์ ์ธ ๋ ๋๋ง ๋ฌธ์ ๋ฐฉ์ง๋ฅผ ์ํ React์ useInsertionEffect ํ ์ ์ดํด๋ณด์ธ์.
React useInsertionEffect: CSS-in-JS ์ต์ ํ ์ฌ์ธต ๋ถ์
React์ useInsertionEffect๋ CSS-in-JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ด๋ จ๋ ํน์ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ค๊ณ๋ ๋น๊ต์ ์๋ก์ด ํ
์
๋๋ค. ์ด๋ฅผ ํตํด React๊ฐ ๋ ์ด์์ ๊ณ์ฐ์ ์ํํ๊ธฐ ์ ์ DOM์ CSS ๊ท์น์ ์ฝ์
ํ ์ ์์ผ๋ฏ๋ก ์ ํ๋ฆฌ์ผ์ด์
์ ์ธ์ง๋ ์ฑ๋ฅ๊ณผ ์๊ฐ์ ์์ ์ฑ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค. ์ด๋ ์คํ์ผ๋ง์ด ๋ ์ด์์์ ์ํฅ์ ๋ฏธ์น๋ ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์
์์ ํนํ ์ค์ํฉ๋๋ค.
CSS-in-JS ์ดํด
CSS-in-JS๋ CSS ์คํ์ผ์ด JavaScript ์ฝ๋ ๋ด์์ ์์ฑ๋๊ณ ๊ด๋ฆฌ๋๋ ๊ธฐ์ ์ ๋๋ค. Styled Components, Emotion ๋ฐ Linaria์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ด ์ ๊ทผ ๋ฐฉ์์ ๋๋ฆฌ ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋ฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ปดํฌ๋ํธ ์์ค ์คํ์ผ๋ง, props์ ๊ธฐ๋ฐํ ๋์ ์คํ์ผ๋ง, ํฅ์๋ ์ฝ๋ ๊ตฌ์ฑ๊ณผ ๊ฐ์ ์ด์ ์ ์ ๊ณตํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฃผ์ํด์ ์ฌ์ฉํ์ง ์์ผ๋ฉด ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ด ๋ฐ์ํ ์๋ ์์ต๋๋ค.
์ฃผ์ ์ฑ๋ฅ ๋ฌธ์ ๋ CSS ์ฝ์ ์์ ์์ ๋ฐ์ํฉ๋๋ค. ์ ํต์ ์ผ๋ก CSS-in-JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ React๊ฐ ์ปดํฌ๋ํธ๋ฅผ DOM์ ์ปค๋ฐํ ํ ์คํ์ผ์ ์ฝ์ ํฉ๋๋ค. ์ด๋ก ์ธํด ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
- ์คํ์ผ์ด ์ง์ ๋์ง ์์ ์ฝํ ์ธ ๊น๋ฐ์(FOUC): ์ฝํ ์ธ ๊ฐ ์คํ์ผ ์์ด ํ์๋๋ ์งง์ ๊ธฐ๊ฐ.
- ๋ ์ด์์ ์ค๋์ฑ: ๋ธ๋ผ์ฐ์ ๊ฐ ๋จ์ผ ํ๋ ์์์ ๋ ์ด์์์ ์ฌ๋ฌ ๋ฒ ๋ค์ ๊ณ์ฐํ์ฌ ์ฑ๋ฅ ์ ํ๋ฅผ ์ ๋ฐํฉ๋๋ค.
- ์ฒซ ๋ฒ์งธ ์๋ฏธ ์๋ ํ์ธํธ๊น์ง์ ์๊ฐ ์ฆ๊ฐ(TTFMP): ์ฌ์ฉ์๊ฐ ํ์ด์ง๊ฐ ์์ ํ ๋ก๋๋๊ณ ์คํ์ผ์ด ์ ์ฉ๋ ๋๊น์ง ๋ ๊ธด ์ง์ฐ ์๊ฐ์ ๊ฒฝํํฉ๋๋ค.
useInsertionEffect์ ์ญํ
useInsertionEffect๋ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ ์ด์์ ๊ณ์ฐ์ ์ํํ๊ธฐ ์ ์ CSS ๊ท์น์ ์ฝ์
ํ ์ ์๋๋ก ํ์ฌ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ฝํ
์ธ ๊ฐ ํ์๋๊ธฐ ์ ์ ์คํ์ผ์ด ์ ์ฉ๋์ด FOUC๋ฅผ ์ต์ํํ๊ณ ๋ ์ด์์ ์ค๋์ฑ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ด ์๊ฐํ์ญ์์ค. ์ง์ ์ง๋๋ค๊ณ ์์ํด ๋ณด์ธ์. useInsertionEffect๊ฐ ์์ผ๋ฉด ๋ฒฝ(React ์ปดํฌ๋ํธ)์ ์ง๊ณ *๋ค์์* ํ์ธํธ์น (CSS ์ฝ์
)์ ํฉ๋๋ค. ์ด๋ก ์ธํด ์ง์ฐ์ด ๋ฐ์ํ๊ณ ๋๋ก๋ ํ์ธํธ์น ํ์ ์กฐ์ ์ด ํ์ํฉ๋๋ค. useInsertionEffect๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฒฝ์ด ์์ ํ ์ธ์์ง๊ธฐ *์ ์* ๋ฒฝ์ ํ์ธํธ์น ์ ํ์ฌ ๋ ์ด์์ ๋ฌธ์ ๋ฅผ ์ผ์ผํค์ง ์๊ณ ํ์ธํธ๊ฐ ๋ถ๋๋ฝ๊ฒ ์ ์ฉ๋๋๋ก ํฉ๋๋ค.
useInsertionEffect ์๋ ๋ฐฉ์
React ํ
์ ์คํ ์์๋ useInsertionEffect๋ฅผ ์ดํดํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. ๋ค์์ useInsertionEffect๊ฐ ๊ฐ์กฐ ํ์๋ ์์์
๋๋ค.
useSyncExternalStore: ์ธ๋ถ ๋ฐ์ดํฐ ์์ค์ ๋๊ธฐํํฉ๋๋ค.useDeferredValue: ๋ ์ค์ํ ์ ๋ฐ์ดํธ๋ฅผ ์ฐ๊ธฐํฉ๋๋ค.useTransition: ์ํ ์ ํ์ ๊ด๋ฆฌํ๊ณ ์ ๋ฐ์ดํธ์ ์ฐ์ ์์๋ฅผ ์ง์ ํฉ๋๋ค.useInsertionEffect: ๋ ์ด์์ ์ ์ CSS ๊ท์น์ ์ฝ์ ํฉ๋๋ค.useLayoutEffect: ๋ ์ด์์ ํ DOM ์ธก์ ๋ฐ ๋๊ธฐ ์ ๋ฐ์ดํธ๋ฅผ ์ํํฉ๋๋ค.useEffect: ๋ธ๋ผ์ฐ์ ๊ฐ ํ์ธํธ์น ์ ํ ํ ์ฌ์ด๋ ์ดํํธ๋ฅผ ์ํํฉ๋๋ค.
useInsertionEffect๋ useLayoutEffect ์ ์ CSS ๊ท์น์ ์ฝ์
ํ์ฌ React๊ฐ ๋ ์ด์์ ๊ณ์ฐ์ ์ํํ ๋ ์คํ์ผ์ ์ฌ์ฉํ ์ ์๋๋ก ํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์คํ์ผ์ด ์ ์ฉ๋ ํ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ ์ด์์์ ๋ค์ ๊ณ์ฐํ ํ์๊ฐ ์์ต๋๋ค.
useInsertionEffect vs. useLayoutEffect vs. useEffect
useInsertionEffect๋ฅผ useLayoutEffect ๋ฐ useEffect์ ๊ตฌ๋ณํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๋ค์์ ๋น๊ต์
๋๋ค.
useInsertionEffect: ๋ ์ด์์ ์ ์ ๋๊ธฐ์ ์ผ๋ก ์คํ๋ฉ๋๋ค. ์ฃผ๋ก CSS-in-JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ DOM์ ์คํ์ผ์ ์ฝ์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. DOM์ ๋ํ ์ก์ธ์ค๊ฐ ์ ํ๋์ด ์์ผ๋ฉฐ ๋๋ฌผ๊ฒ ์ฌ์ฉํด์ผ ํฉ๋๋ค.useInsertionEffect๋ด์์ ์์ฝ๋ ๋ณ๊ฒฝ ์ฌํญ์ ๋ธ๋ผ์ฐ์ ๊ฐ ํ์ธํธ์น ์ *ํ๊ธฐ ์ ์* ์คํ๋ฉ๋๋ค.useLayoutEffect: ๋ ์ด์์ ํ์, ๊ทธ๋ฌ๋ ๋ธ๋ผ์ฐ์ ๊ฐ ํ์ธํธ์น ์ *ํ๊ธฐ ์ ์* ๋๊ธฐ์ ์ผ๋ก ์คํ๋ฉ๋๋ค. DOM์ ์ก์ธ์คํ ์ ์์ผ๋ฉฐ ์ธก์ ๋ฐ ๋๊ธฐ ์ ๋ฐ์ดํธ๋ฅผ ์ํํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ณผ๋ํ๊ฒ ์ฌ์ฉํ๋ฉด ๋ธ๋ผ์ฐ์ ๊ฐ ํ์ธํธ์น ์ ํ์ง ๋ชปํ๊ฒ ํ๋ฏ๋ก ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.useEffect: ๋ธ๋ผ์ฐ์ ๊ฐ ํ์ธํธ์น ์ *ํ ํ* ๋น๋๊ธฐ์ ์ผ๋ก ์คํ๋ฉ๋๋ค. ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ฑฐ๋, ๊ตฌ๋ ์ ์ค์ ํ๊ฑฐ๋, ์ค์ํ์ง ์์ ๋ฐฉ์์ผ๋ก DOM์ ์กฐ์ํ๋ ๋ฑ ๋๋ถ๋ถ์ ์ฌ์ด๋ ์ดํํธ์ ์ ํฉํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ๊ฐ ํ์ธํธ์น ์ ํ์ง ๋ชปํ๊ฒ ํ์ง ์์ผ๋ฏ๋ก ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ์ ์ต๋๋ค.
์ฃผ์ ์ฐจ์ด์ ์์ฝ:
| ํ | ์คํ ์์ | DOM ์ก์ธ์ค | ์ฃผ์ ์ฌ์ฉ ์ฌ๋ก | ์ ์ฌ์ ์ฑ๋ฅ ์ํฅ |
|---|---|---|---|---|
useInsertionEffect |
๋ ์ด์์ ์ ์ ๋๊ธฐ์ ์ผ๋ก | ์ ํ๋จ | CSS-in-JS ์คํ์ผ ์ฝ์ | ๊ฐ์ฅ ๋ฎ์(์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉ๋ ๊ฒฝ์ฐ) |
useLayoutEffect |
๋ ์ด์์ ํ, ํ์ธํธ์น ์ ์ ๋๊ธฐ์ ์ผ๋ก | ์ ์ฒด | DOM ์ธก์ ๋ฐ ๋๊ธฐ ์ ๋ฐ์ดํธ | ๋์(๊ณผ๋ํ๊ฒ ์ฌ์ฉ๋ ๊ฒฝ์ฐ) |
useEffect |
ํ์ธํธ์น ํ ๋น๋๊ธฐ์ ์ผ๋ก | ์ ์ฒด | ๋๋ถ๋ถ์ ์ฌ์ด๋ ์ดํํธ(๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ, ๊ตฌ๋ ๋ฑ) | ๋ฎ์ |
์ค์ ์์
๊ฐ์์ CSS-in-JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ(๋ฐ๋ชจ์ฉ์ผ๋ก ๋จ์ํ๋จ)์์ useInsertionEffect๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช
ํด ๋ณด๊ฒ ์ต๋๋ค.
์์ 1: ๊ธฐ๋ณธ ์คํ์ผ ์ฝ์
function MyComponent() {
const style = `
.my-component {
color: blue;
font-size: 16px;
}
`;
useInsertionEffect(() => {
// ์คํ์ผ ์์๋ฅผ ๋ง๋ค๊ณ ํค๋์ ์ถ๊ฐํฉ๋๋ค.
const styleElement = document.createElement('style');
styleElement.textContent = style;
document.head.appendChild(styleElement);
// ์ปดํฌ๋ํธ๊ฐ ์ธ๋ง์ดํธ๋ ๋ ์คํ์ผ ์์๋ฅผ ์ ๊ฑฐํ๋ ์ ๋ฆฌ ํจ์
return () => {
document.head.removeChild(styleElement);
};
}, [style]);
return <div className="my-component">Hello, world!</div>;
}
์ค๋ช :
- ์ปดํฌ๋ํธ ๋ด์์ CSS ์คํ์ผ ๋ฌธ์์ด์ ์ ์ํฉ๋๋ค.
useInsertionEffect๋<style>์์๋ฅผ ๋ง๋ค๊ณ , ํด๋น ํ ์คํธ ์ฝํ ์ธ ๋ฅผ ์คํ์ผ ๋ฌธ์์ด๋ก ์ค์ ํ๊ณ , ๋ฌธ์์<head>์ ์ถ๊ฐํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.- ์ ๋ฆฌ ํจ์๋ ์ปดํฌ๋ํธ๊ฐ ์ธ๋ง์ดํธ๋ ๋ ์คํ์ผ ์์๋ฅผ ์ ๊ฑฐํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํฉ๋๋ค.
- ์ข
์์ฑ ๋ฐฐ์ด
[style]์ ์คํ์ผ ๋ฌธ์์ด์ด ๋ณ๊ฒฝ๋ ๋๋ง ํจ๊ณผ๊ฐ ์คํ๋๋๋ก ํฉ๋๋ค.
์์ 2: ๋จ์ํ๋ CSS-in-JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํจ๊ป ์ฌ์ฉ
injectGlobal ํจ์๊ฐ ์๋ ๋จ์ํ๋ CSS-in-JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์์ํด ๋ณด๊ฒ ์ต๋๋ค.
// ๋จ์ํ๋ CSS-in-JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ
const styleSheet = {
inserted: new Set(),
injectGlobal: (css) => {
if (styleSheet.inserted.has(css)) return;
styleSheet.inserted.add(css);
const styleElement = document.createElement('style');
styleElement.textContent = css;
document.head.appendChild(styleElement);
},
};
function MyComponent() {
useInsertionEffect(() => {
styleSheet.injectGlobal(`
body {
background-color: #f0f0f0;
}
`);
}, []);
return <div>My Component</div>;
}
์ค๋ช :
- ๋ฌธ์์
<head>์ CSS ๊ท์น์ ์ฝ์ ํ๋injectGlobalํจ์๊ฐ ์๋ ๊ฐ๋จํstyleSheet๊ฐ์ฒด๋ฅผ ์ ์ํฉ๋๋ค. useInsertionEffect๋ ์ ์ญ์ ์ผ๋ก ์ ์ฉํ๋ ค๋ CSS ๊ท์น์ผ๋กstyleSheet.injectGlobal์ ํธ์ถํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.- ๋น ์ข
์์ฑ ๋ฐฐ์ด
[]์ ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ๋ ๋ ํจ๊ณผ๊ฐ ํ ๋ฒ๋ง ์คํ๋๋๋ก ํฉ๋๋ค.
์ค์ ์ฐธ๊ณ ์ฌํญ: ์ด๋ฌํ ์์ ๋ ๋ฐ๋ชจ ๋ชฉ์ ์ผ๋ก ๋จ์ํ๋์์ต๋๋ค. ์ค์ CSS-in-JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋์ฑ ๋ณต์กํ๊ณ ์คํ์ผ ๊ด๋ฆฌ, ๊ณต๊ธ์ ์ฒด ์ ๋์ฌ ๋ฐ ๊ธฐํ CSS ์ธก๋ฉด์ ๋ณด๋ค ํจ๊ณผ์ ์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค.
useInsertionEffect ์ฌ์ฉ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
- ๋๋ฌผ๊ฒ ์ฌ์ฉํ์ญ์์ค.
useInsertionEffect๋ CSS-in-JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ ์ด์์ ์ ์ CSS ๊ท์น์ ์ฝ์ ํด์ผ ํ๋ ์ํฉ์์ ์ฃผ๋ก ์ฌ์ฉํด์ผ ํฉ๋๋ค. ๋ค๋ฅธ ์ฌ์ด๋ ์ดํํธ์๋ ์ฌ์ฉํ์ง ๋ง์ญ์์ค. - ์ต์ํ์ผ๋ก ์ ์งํ์ญ์์ค.
useInsertionEffect๋ด๋ถ์ ์ฝ๋๋ ๋ธ๋ผ์ฐ์ ๊ฐ ํ์ธํธ์น ์ ํ์ง ๋ชปํ๊ฒ ํ์ง ์๋๋ก ๊ฐ๋ฅํ ํ ์ต์ํ์ผ๋ก ์ ์งํด์ผ ํฉ๋๋ค. CSS ์ฝ์ ์๋ง ์ง์คํ์ญ์์ค. - ์ข
์์ฑ ๋ฐฐ์ด์ด ์ค์ํฉ๋๋ค. ๋ถํ์ํ ๋ค์ ์คํ์ ๋ฐฉ์งํ๋ ค๋ฉด ํญ์
useInsertionEffect์ ์ข ์์ฑ ๋ฐฐ์ด์ ์ ๊ณตํ์ญ์์ค. ์ข ์์ฑ ๋ฐฐ์ด์ ํจ๊ณผ๊ฐ ์ข ์๋ ๋ชจ๋ ๊ฐ์ด ํฌํจ๋์ด ์๋์ง ํ์ธํ์ญ์์ค. - ์ ๋ฆฌ๊ฐ ํ์์ ์ ๋๋ค. ์ปดํฌ๋ํธ๊ฐ ์ธ๋ง์ดํธ๋ ๋ ์ฝ์ ๋ CSS ๊ท์น์ ์ ๊ฑฐํ๊ธฐ ์ํด ํญ์ ์ ๋ฆฌ ํจ์๋ฅผ ๋ฐํํ์ญ์์ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ๊ณ ๋ ์ด์ ํ์ํ์ง ์์ ์คํ์ผ์ด ์ ๊ฑฐ๋๋๋ก ํฉ๋๋ค.
- ํ๋กํ์ผ๋ง ๋ฐ ์ธก์ : React DevTools ๋ฐ ๋ธ๋ผ์ฐ์ ์ฑ๋ฅ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์
์ ํ๋กํ์ผ๋งํ๊ณ
useInsertionEffect๊ฐ ์ฑ๋ฅ์ ๋ฏธ์น๋ ์ํฅ์ ์ธก์ ํ์ญ์์ค. ์ค์ ๋ก ์ฑ๋ฅ์ด ํฅ์๋๊ณ ์๋์ง, ์๋ก์ด ๋ณ๋ชฉ ํ์์ด ๋ฐ์ํ์ง ์๋์ง ํ์ธํ์ญ์์ค.
์ ์ฌ์ ๋จ์ ๋ฐ ๊ณ ๋ ค ์ฌํญ
- ์ ํ๋ DOM ์ก์ธ์ค:
useInsertionEffect๋ DOM์ ๋ํ ์ก์ธ์ค๊ฐ ์ ํ๋์ด ์์ต๋๋ค. ์ด ํ ๋ด๋ถ์์ ๋ณต์กํ DOM ์กฐ์์ ์ํํ์ง ๋ง์ญ์์ค. - ๋ณต์ก์ฑ: React ํ
์ ์คํ ์์์ CSS-in-JS์ ๋์์ค๋ฅผ ์ดํดํ๋ ๊ฒ์ ์ด๋ ค์ธ ์ ์์ต๋๋ค.
useInsertionEffect๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์ ํ์ด ์ด๋ฌํ ๊ฐ๋ ์ ํ์คํ๊ฒ ์ดํดํ๊ณ ์๋์ง ํ์ธํ์ญ์์ค. - ์ ์ง ๊ด๋ฆฌ: CSS-in-JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ฐ์ ํจ์ ๋ฐ๋ผ
useInsertionEffect์ ์ํธ ์์ฉํ๋ ๋ฐฉ์์ด ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ด๋ฆฌ์์ ์ต์ ๋ชจ๋ฒ ์ฌ๋ก ๋ฐ ๊ถ์ฅ ์ฌํญ์ ์ต์ ์ํ๋ก ์ ์งํ์ญ์์ค. - ์๋ฒ ์ธก ๋ ๋๋ง(SSR): CSS-in-JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ
useInsertionEffect๊ตฌํ์ด ์๋ฒ ์ธก ๋ ๋๋ง๊ณผ ํธํ๋๋์ง ํ์ธํ์ญ์์ค. ๋ค๋ฅธ ํ๊ฒฝ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ฝ๋๋ฅผ ์กฐ์ ํด์ผ ํ ์๋ ์์ต๋๋ค.
useInsertionEffect์ ๋ํ ๋์
useInsertionEffect๊ฐ CSS-in-JS๋ฅผ ์ต์ ํํ๋ ๋ฐ ๊ฐ์ฅ ์ ํฉํ ์ ํ์ธ ๊ฒฝ์ฐ๊ฐ ๋ง์ง๋ง ํน์ ์ํฉ์์๋ ๋ค์๊ณผ ๊ฐ์ ๋์์ ๊ณ ๋ คํ์ญ์์ค.
- CSS ๋ชจ๋: CSS ๋ชจ๋์ CSS-in-JS์ ๋ํ ๋ ๊ฐ๋จํ ๋์์
๋๋ค. CSS-in-JS์ ๋ฐํ์ ์ค๋ฒํค๋ ์์ด ์ปดํฌ๋ํธ ์์ค ์คํ์ผ๋ง์ ์ ๊ณตํฉ๋๋ค. CSS๊ฐ ์ผ๋ฐ์ ์ผ๋ก ๋น๋ ํ๋ก์ธ์ค ์ค์ ์ถ์ถ๋์ด ์ฝ์
๋๊ธฐ ๋๋ฌธ์
useInsertionEffect๊ฐ ํ์ํ์ง ์์ต๋๋ค. - Styled Components(SSR ์ต์ ํ ํฌํจ): Styled Components๋ CSS ์ฝ์
๊ณผ ๊ด๋ จ๋ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ์ํํ ์ ์๋ ๊ธฐ๋ณธ ์ ๊ณต SSR ์ต์ ํ๋ฅผ ์ ๊ณตํฉ๋๋ค.
useInsertionEffect์ ์์กดํ๊ธฐ ์ ์ ์ด๋ฌํ ์ต์ ํ๋ฅผ ์ดํด๋ณด์ญ์์ค. - ์ฌ์ ๋ ๋๋ง ๋๋ ์ ์ ์ฌ์ดํธ ์์ฑ(SSG): ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋๋ถ๋ถ ์ ์ ์ธ ๊ฒฝ์ฐ ์ฌ์ ๋ ๋๋งํ๊ฑฐ๋ ์ ์ ์ฌ์ดํธ ์์ฑ๊ธฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ฐํ์ CSS ์ฝ์ ์ ํ์์ฑ์ ์์ ํ ์์จ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
useInsertionEffect๋ CSS-in-JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ต์ ํํ๊ณ React ์ ํ๋ฆฌ์ผ์ด์
์ ์ฑ๋ฅ์ ํฅ์์ํค๋ ๋ฐ ์ ์ฉํ ํ
์
๋๋ค. ๋ ์ด์์ ์ ์ CSS ๊ท์น์ ์ฝ์
ํ๋ฉด FOUC๋ฅผ ๋ฐฉ์งํ๊ณ , ๋ ์ด์์ ์ค๋์ฑ์ ์ค์ด๊ณ , ์ ํ๋ฆฌ์ผ์ด์
์ ์ธ์ง๋ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ ๋์์ค๋ฅผ ์ดํดํ๊ณ , ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๊ณ , ์ ํ๋ฆฌ์ผ์ด์
์ ํ๋กํ์ผ๋งํ์ฌ ์ค์ ๋ก ์ฑ๋ฅ์ด ํฅ์๋๊ณ ์๋์ง ํ์ธํ๋ ๊ฒ์ด ํ์์ ์
๋๋ค. ๋์์ ๊ณ ๋ คํ๊ณ ํน์ ์๊ตฌ ์ฌํญ์ ๊ฐ์ฅ ์ ํฉํ ์ ๊ทผ ๋ฐฉ์์ ์ ํํ์ญ์์ค.
useInsertionEffect๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ดํดํ๊ณ ์ ์ฉํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ ๋์ฑ ๋ฐ์ด๋ ์ฑ๋ฅ๊ณผ ์๊ฐ์ ์ผ๋ก ๋งค๋ ฅ์ ์ธ React ์ ํ๋ฆฌ์ผ์ด์
์ ๋ง๋ค์ด ์ ์ธ๊ณ ์์ฒญ์์๊ฒ ๋ ๋์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ต๋๋ค. ์ด๋ ์ฑ๋ฅ ์ต์ ํ๊ฐ ์ฌ์ฉ์ ๋ง์กฑ๋์ ํฐ ์ํฅ์ ๋ฏธ์น ์ ์๋ ์ธํฐ๋ท ์ฐ๊ฒฐ ์๋๊ฐ ๋๋ฆฐ ์ง์ญ์์ ํนํ ์ค์ํฉ๋๋ค.