Vanilla Extract์ ์ฌ์ฉํด๋ณธ ๊ณ๊ธฐ๋ Next.js์ ์ฑ ๋ผ์ฐํฐ ํ๊ฒฝ์์ ๊ธฐ์กด CSS in js ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ํ๊ณ๋ฅผ ๋๊ผ๊ธฐ ๋๋ฌธ์ ๋๋ค.
css in js ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ CSR ํ๊ฒฝ์์ ๋์ํ๋๋ก ์ค๊ณ๋์์ผ๋ฏ๋ก Next.js์ ์๋ฒ ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ์ง ๋ชปํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ค์์ผ๋ก ๋ฌธ์ ๊ฐ ๋๋ ๊ฒ์ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ์ ์ฌ์ฉํ๋๋ผ๋ SSR ํ๊ฒฝ์์ ๋์ ํ ๋์ ์ด๊ธฐ ํ์ด๋๋ ์ด์
๊ณผ์ ์ ๊ฑฐ์น ๋์ ์๋ฒ์ ํด๋ผ์ด์ธํธ์ ๋ ๋๋ง ๊ฒฐ๊ณผ๊ฐ ๋ถ์ผ์นํ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
์๋ฒ ์ปดํฌ๋ํธ๊ฐ ๋์ ํ ๋์ ํ์ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ฅผ ์์ ๋ ๋๋งํ์ง ์๋๊ฒ์ด ์๋๋ผ ์ ์ ์ผ๋ก ํํ ๊ฐ๋ฅํ ๋ถ๋ถ์ ๊ฐ์ด ์๋ฒ์์ ๋ ๋๋งํด์ ๊ฒฐ๊ณผ๋ฅผ ๋ด๋ ค์ฃผ๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ ์ฒด html ๊ตฌ์กฐ๊ฐ ๊ฐ์ถ์ด์ง๊ณ ํด๋ผ์ด์ธํธ๋ก ์ ๋ฌ๋์ด ํด๋ผ์ด์ธํธ์์ ๋ ๋๋งํ๊ฒ๊ณผ ์๋ฒ์ ๋ ๋๋ง ๊ฒฐ๊ณผ๋ฅผ ๋น๊ตํ๋ฉด์ ์ด๊ธฐ ํ์ด๋๋ ์ด์
์ ์งํํ๊ฒ ๋ฉ๋๋ค.
์ด๋ CSS in js ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํด๋์ค๋ช
์ ๋๋คํ ํจํด์ผ๋ก ์์ฑํ๊ฒ ๋๋๋ฐ ์ด๋ก ์ธํด ์๋ฒ์ ํด๋ผ์ด์ธํธ ๊ฐ์ ๊ตฌ์กฐ๊ฐ ๋ถ์ผ์นํ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ฌ ํ์ด๋๋ ์ด์
์ ๋ฌธ์ ๊ฐ ์๊น๋๋ค.
์ด๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ css in js ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ SSR ํ๋ ์์ํฌ ๋๋ค ์ต์ ํ ํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํด์ผํฉ๋๋ค.
์๋ฅผ ๋ค์ด Styled components๋ ์๋ฒ ์ปดํฌ๋ํธ์ ํ๋ก๋ฐ์ด๋๋ฅผ ์ ์ธํ์ฌ ์๋ฒ ์ฌ์ด๋์์ ํด๋ผ์ด์ธํธ ์คํ์ผ์ ์์งํ๊ณ ์คํ์ผ์ํธ ์ธ์คํด์ค๋ฅผ ํด๋ผ์ด์ธํธ๋ก ๋ด๋ ค์ฃผ๊ฒ ๋์ด ํด๋น ์ธ์คํด์ค๋ก ํด๋ผ์ด์ธํธ๋ ์คํ์ผ์ผ๋ฅด ์ฌ์ฉํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ํด๋์ค๋ช ์ด ๋๋คํ๊ฒ ์๊ธฐ๋ ๋ฌธ์ ๋ Next.js ์ค์ ์์ ๊ฐ css in js ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํด ์ต์ ์ ์ ๊ณตํ์ฌ Next.js ์ปดํ์ผ ํ์์ ๊ฒฐ์ ์ ์ผ๋ก ํ๋์ Styled component๊ฐ ์์ฑํ๋ ํด๋์ค๋ช ์ด ์๋ฒ์ ํด๋ผ์ด์ธํธ์์ ๋์ผํ๊ฒ ์์ฑ ๋๋๋ก ๋ณด์ฅํ๋๋ก ์๊ณ ๋ฆฌ์ฆ์ ์ ๊ณตํด์ํฉ๋๋ค.
์ด๋ ๊ฒ SSR ํ๊ฒฝ์์ css in js ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ด๋ ต์ต๋๋ค.
๊ฒฐ๊ตญ ์ด๋ฌํ ๋ฌธ์ ๋ค๋ก ์ธํด ํ์๊ฐ์ ๊ฐ์ง๊ฒ ๋์์ต๋๋ค. ์ด๋ ๊ฒ ์ธ๊ฒ์ด๋ผ๋ฉด ๊ทธ๋ฅ ์ผ๋ฐ์ ์ธ sass๋ฅผ ์ด์ฉํด์ ์คํ์ผ์ ์ฌ์ฉํ๋ ๊ฒ์ด ํจ์ฌ ํธํ๊ฒ์ด๋ผ๋ ์๊ฐ์ด ๋ค์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฌ๋ฌ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ฐพ๋ ์ค css๋ฅผ ๋น๋ ํ์์ ๋ชจ๋ ์ ์ ์ผ๋ก ๋ง๋ค์ด์ ์๋ฒ์ ํด๋ผ์ด์ธํธ ๋ชจ๋ ์ฌ์ฉ ํ ๋ ๋ฌธ์ ๊ฐ ์๊ฒ ํ๋ ๋ฐฉ๋ฒ์ด ์์์ต๋๋ค.
๊ทธ๋ฐ ๋ฐฉ๋ฒ์ Vanilla Extract์ด ์ ๊ณตํ์ต๋๋ค.
SSR ํ๊ฒฝ์์ css in js ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์ Vanilla Extract์ ์ฌ์ฉํ์ง๋ง ๋ ๋ง์ ์ด์ ๋ค์ ๋ฐ๊ฒฌํ์ต๋๋ค.
๊ทธ๋ฐ๋ฐ ์๊ฐํด๋ณด๋ฉด ์ Styled components ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ๋น๋ ํ์์ ์ ์ ์ผ๋ก ์คํ์ผ์ ์์ฑํ์ง ๋ชปํ๋ ๊ฒ์ผ๊น ๊ถ๊ธํด์ก์ต๋๋ค.
์๋ํ๋ฉด Styled components๋ props๋ฅผ ๋ฐ์ ์ผ์ด์ค์ ๋ฐ๋ผ ์คํ์ผ์ ์ ์ํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๊ณ ๊ฒฐ๊ตญ ์ด๋ props์ ๋ฐ๋ผ ์ ์ ์ผ๋ก ์ปดํ์ผ ํ๋๊ฒ์ด ๊ฐ๋ฅํ๋ ์ด์ผ๊ธฐ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด props๋ก ํ์ ์ 'default' | 'outline' ์ด๋ผ๋ ํ์ ์ ์ ์ธํ๊ณ ํด๋น ํ์ ์ ๋ฐ๋ผ ์คํ์ผ์ ์ ์ํ๋ค๋ฉด ๊ฒฐ๊ตญ ์ด๊ฒ์ ๋น๋ํ์์ ์์ธก๊ฐ๋ฅํ ํด๋์ค๋ฅผ ์์ฑํ ์ ์๋ค ์๊ฐํ์ต๋๋ค.
๊ทธ๋ฌ๋ ์ค ๊ทผ๋ณธ์ ์ผ๋ก ํด๊ฒฐํ์ง ๋ชปํ๋ ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ๋๋ฐ ๊ทธ๊ฒ์ ๋ฐ๋ก ์ค์นผ๋ผ ๊ฐ์ด props๋ก ๋์ด์ฌ๋์์ต๋๋ค.
๋ฒ์๊ฐ ์ ํด์ง์ง ์์ ๊ฐ, ์ฆ ํฝ์
๋จ์์ ๊ฐ์ด props๋ก ์ ๋ฌ๋๊ณ ์ด ๊ฐ์ผ ์คํ์ผ์ ๋ฐ๋ก ๋ฐ์ธ๋ฉ ๋๋ค๋ฉด ๋น๋ํ์์ ์์ธก ํ ์ ์์์ต๋๋ค.
๊ทธ๋ฐ๋ฐ ์ด๊ฒ์ ๊ฒฐ๊ตญ Vanilla Extract ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ง์ฐฌ๊ฐ์ง๋ผ ์๊ฐํ์ต๋๋ค.
๊ทธ๋ฌ๋ฉด ์ด๋ฐ ๋ฌธ์ ๋ฅผ Vanilla Extract์์๋ ์ด๋ป๊ฒ ํด๊ฒฐ ํ ๊น์? ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ์์ด๋์ด๊ฐ ๋๋ผ์ ์ต๋๋ค.
๋ฐ๋ก css ๋ณ์๋ฅผ ๋ง๋ค๊ณ ์ด ๋ณ์๋ฅผ ํน์ ์คํ์ผ์ ๋ฐ์ธ๋ฉ์ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํฝ์ ๋จ์์ ๊ฐ์ ๋ฒ์๊ฐ ์ ํด์ง์ง ์์ ๊ฐ์ css ๋ณ์์ ๊ฐ์ผ๋ก ์ธ๋ถ์์ ์ฃผ์ ํด์ ๋์ ์ผ๋ก ์คํ์ผ์ ๋ณ๊ฒฝํ๊ฒ ๋ง๋๋ ์ ๋ต์ด์์ต๋๋ค.
์ด๋ ๋น๋ ํ ๋์๋ css ๋ณ์์ ํน์ ์คํ์ผ์ด ๋ฐ์ธ๋ฉ ๋๋ค๋ฉด ๋น๋ ํ๋๋ฐ ์๋ฌด๋ฐ ๋ฌธ์ ๊ฐ ๋์ง ์์์ต๋๋ค. ๋ค๋ง ๋ฐํ์์ ํด๋น css ๋ณ์์ ๊ฐ์ ๋ณ๊ฒฝํด๊ฐ๋ฉด์ ๋์ ์ผ๋ก ์คํ์ผ์ ๋ณ๊ฒฝํ๋ฉด ๊ทธ๋ง์ด์์ต๋๋ค.
๋ฌผ๋ก ๋ฐํ์ ๋น์ฉ์ด ์ ๋ก๋ ์๋๋๋ค. ํ์ง๋ง ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ค์ ๋์ ์ผ๋ก props๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์๋ก์ด ์คํ์ผ์ ์์ฑํ๋ ๋ฌธ์ ๊ฐ ์๋๋ฐ ์ด์ ๋นํด์๋ ์๋นํ ํจ์จ์ ์ผ๋ก ๋์ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ Vanilla Extract ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋น๋ ํ์์ ์์ธก ๊ฐ๋ฅํ๋๋ก ์์ฑํด์ผ ํ๋ฏ๋ก, ๋๋ถ๋ถ์ ์คํ์ผ์ Variant๋ฅผ ์ด์ฉํด์ ์ผ์ด์ค๋ฅผ ๋๋๊ณ ๊ฐ ์ผ์ด์ค์ ๋ํด ์คํ์ผ์ ์ ์ธํ๋ ๋ฐฉ์์ ๊ตฌ์ฑํ๋๋ก ์ ๋ํฉ๋๋ค.
์ด๋ฌํ ์ํคํ ์ฒ๋ css๋ฅผ ๊ตฌ์กฐ์ ์ผ๋ก ๋ง๋๋๋ฐ ์์ฃผ ์ข์ ๋ฐฉํฅ์ฑ์ ๋๋ค. css๋ ์๊ฒ ์์ํ์ง๋ง ํ๋ก์ ํธ๊ฐ ์ปค์ง๋ฉด ์ ์ ๊ด๋ฆฌํ๊ธฐ ์ด๋ ค์์ง๋ ๊ฒ ์ค ๋ํ์ ์ธ ์ฝ๋์ ๋๋ค. ๊ทธ๋ ๊ธฐ์ ์ฒ์๋ถํฐ ์คํ์ผ์ ๊ตฌ์กฐ์ ์ผ๋ก ์ ์ธํ์ฌ ์ฌ์ฉ ํ ์ ์๊ฒ ์ฝ๋๋ฅผ ์ง๋๋ก ์ ๋ํ๋ ๊ฒ์ ์ข์ต๋๋ค.
์ ๋ ์์ ํ๋ก์ ํธ๋ฅผ ์์ํ๋๋ผ๋ ํ ๋ง๋ฅผ ์๊ฒ๋๋ง ๋ง๋ค๊ณ ๊ทธ๋ ๊ฒ ๋ง๋ค์ด์ง ํ ๋ง๋ฅผ ์ด์ฉํด ui ์ปดํฌ๋ํธ๋ฅผ ๊ตฌ์ฑํ๋๋ฐ, Vanilla Extract์ ์ด๋ฐ ์ ์๊ฒ ์ ๋ง๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ Vanilla Extract์ ๋ฐฉํฅ์ฑ ์ค ํ๋๋ ์์ ํด๋์ค์์ ์ ํ์๋ก ํน์ ์๋ฆฌ๋จผํธ๋ฅผ ์ ํํ์ฌ ๊ฐ์ ํด๋์ค์ ์คํ์ผ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ ๋น๋ ํ์์ ์๋ฌ๋ฅผ ๋ฐ์์ํต๋๋ค. ์์์์ ํ์ ์ ํ์๋ก ์คํ์ผ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ ์คํ์ผ์ ๋ฎ์ด ์์ธ์ ์๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๊ทธ๋์ ํน์ ํด๋์ค๋ฅผ ์ง์ ํ๊ณ ํด๋น ํด๋์ค์ ๊ฐ์ ํด๋์ค์ ์คํ์ผ์ ๋ณ๊ฒฝํ๋๋ก ํฉ๋๋ค.
๋ง์ง๋ง์ผ๋ก ๋ถ๊ฐ์ ์ธ ํจํค์ง๋ก ๊ธฐ๋ฅ์ ์ ๊ณตํ๋๋ฐ ์ ์ฉํ ๊ฒ ์ค ๋ ์ํผ ๋ผ๋ ํจํค์ง๊ฐ ์กด์ฌํฉ๋๋ค. ์ด๊ฒ์ ์์์ ๋งํ ์คํ์ผ์ Variant๋ฅผ ํตํ ๊ตฌ์กฐ์ ์ธ css ์์ฑ์ ํ ์ ์๊ฒ ๋ง๋ญ๋๋ค.
์๋๋ ๋ ์ํผ๋ฅผ ์ด์ฉํ ์คํ์ผ ์ ์ํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ์ฝ๋๋ฅผ ๋ณด๋ฉด base ์์ฑ์ ํตํด ๋ชจ๋ variant๊ฐ ๋์ผํ๊ฒ ๊ฐ์ง๋ ์คํ์ผ์ ์ ์ธํ๊ณ variants ์์ฑ์ ํตํด ๊ฐ variant์ ๋ํ ํด๋์ค๋ฅผ ์ ์ธํฉ๋๋ค. ์ค์ ๋ก ์ฌ์ฉํ๋ ๋ฐฉ์์ ํจ์์ ์ธ์๋ก variant ๊ฐ์ ์ ๋ฌํ๊ฒ ๋๋ฉด ๊ทธ์ ๋ฐ๋ผ ๋์ ์ผ๋ก ์คํ์ผ์ด ๋ณ๊ฒฝ๋ฉ๋๋ค.
const Link = recipe({
base: {
fontSize: themeVars.text.size.sm,
color: themeVars.text.secondary,
textDecoration: 'none',
},
variants: {
active: {
true: {
fontWeight: themeVars.text.weight.medium,
textDecoration: 'underline',
textUnderlineOffset: '4px',
},
},
},
});
<Link className={Link({ active: pathName === '/' })} href="/">Home</Link>