โ† ๋ชฉ๋ก์œผ๋กœ
Vanilla Extract

๋„์ž… ๋ฐฐ๊ฒฝ

Vanilla Extract์„ ์‚ฌ์šฉํ•ด๋ณธ ๊ณ„๊ธฐ๋Š” Next.js์˜ ์•ฑ ๋ผ์šฐํ„ฐ ํ™˜๊ฒฝ์—์„œ ๊ธฐ์กด CSS in js ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์˜ ํ•œ๊ณ„๋ฅผ ๋А๊ผˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

css in js ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” CSR ํ™˜๊ฒฝ์—์„œ ๋™์ž‘ํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์œผ๋ฏ€๋กœ Next.js์˜ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ์œผ๋กœ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ๊ฒƒ์€ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ์— ์‚ฌ์šฉํ•˜๋”๋ผ๋„ SSR ํ™˜๊ฒฝ์—์„œ ๋™์ž‘ ํ•  ๋•Œ์— ์ดˆ๊ธฐ ํ•˜์ด๋“œ๋ ˆ์ด์…˜ ๊ณผ์ •์„ ๊ฑฐ์น ๋•Œ์— ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ์˜ ๋ Œ๋”๋ง ๊ฒฐ๊ณผ๊ฐ€ ๋ถˆ์ผ์น˜ํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

SSR ํ™˜๊ฒฝ์—์„œ์˜ ๋ฌธ์ œ์ 

์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋™์ž‘ ํ• ๋•Œ์— ํ•˜์œ„ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์•„์˜ˆ ๋ Œ๋”๋งํ•˜์ง€ ์•Š๋Š”๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ •์ ์œผ๋กœ ํ‘œํ˜„ ๊ฐ€๋Šฅํ•œ ๋ถ€๋ถ„์€ ๊ฐ™์ด ์„œ๋ฒ„์—์„œ ๋ Œ๋”๋งํ•ด์„œ ๊ฒฐ๊ณผ๋ฅผ ๋‚ด๋ ค์ฃผ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ „์ฒด html ๊ตฌ์กฐ๊ฐ€ ๊ฐ–์ถ”์–ด์ง€๊ณ  ํด๋ผ์ด์–ธํŠธ๋กœ ์ „๋‹ฌ๋˜์–ด ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ Œ๋”๋งํ•œ๊ฒƒ๊ณผ ์„œ๋ฒ„์˜ ๋ Œ๋”๋ง ๊ฒฐ๊ณผ๋ฅผ ๋น„๊ตํ•˜๋ฉด์„œ ์ดˆ๊ธฐ ํ•˜์ด๋“œ๋ ˆ์ด์…˜์„ ์ง„ํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
์ด๋•Œ CSS in js ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ํด๋ž˜์Šค๋ช…์„ ๋žœ๋คํ•œ ํŒจํ„ด์œผ๋กœ ์ƒ์„ฑํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ์ด๋กœ ์ธํ•ด ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๊ฐ„์˜ ๊ตฌ์กฐ๊ฐ€ ๋ถˆ์ผ์น˜ํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ํ•˜์ด๋“œ๋ ˆ์ด์…˜์˜ ๋ฌธ์ œ๊ฐ€ ์ƒ๊น๋‹ˆ๋‹ค.

๊ธฐ์กด ํ•ด๊ฒฐ์ฑ…์˜ ํ•œ๊ณ„

์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” css in js ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ SSR ํ”„๋ ˆ์ž„์›Œํฌ ๋‘˜๋‹ค ์ตœ์ ํ™” ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด Styled components๋Š” ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์— ํ”„๋กœ๋ฐ”์ด๋”๋ฅผ ์„ ์–ธํ•˜์—ฌ ์„œ๋ฒ„ ์‚ฌ์ด๋“œ์—์„œ ํด๋ผ์ด์–ธํŠธ ์Šคํƒ€์ผ์„ ์ˆ˜์ง‘ํ•˜๊ณ  ์Šคํƒ€์ผ์‹œํŠธ ์ธ์Šคํ„ด์Šค๋ฅผ ํด๋ผ์ด์–ธํŠธ๋กœ ๋‚ด๋ ค์ฃผ๊ฒŒ ๋˜์–ด ํ•ด๋‹น ์ธ์Šคํ„ด์Šค๋กœ ํด๋ผ์ด์–ธํŠธ๋Š” ์Šคํƒ€์ผ์œผ๋ฅด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ํด๋ž˜์Šค๋ช…์ด ๋žœ๋คํ•˜๊ฒŒ ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ๋Š” Next.js ์„ค์ •์—์„œ ๊ฐ css in js ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•ด ์˜ต์…˜์„ ์ œ๊ณตํ•˜์—ฌ Next.js ์ปดํŒŒ์ผ ํƒ€์ž„์— ๊ฒฐ์ •์ ์œผ๋กœ ํ•˜๋‚˜์˜ Styled component๊ฐ€ ์ƒ์„ฑํ•˜๋Š” ํด๋ž˜์Šค๋ช…์ด ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ์—์„œ ๋™์ผํ•œ๊ฒŒ ์ƒ์„ฑ ๋˜๋„๋ก ๋ณด์žฅํ•˜๋„๋ก ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ œ๊ณตํ•ด์•„ํ•ฉ๋‹ˆ๋‹ค.

SSR ํ™˜๊ฒฝ์—์„œ CSS-in-JS ์‚ฌ์šฉ์˜ ์–ด๋ ค์›€

์ด๋ ‡๊ฒŒ SSR ํ™˜๊ฒฝ์—์„œ css in js ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

  1. ํ”„๋ ˆ์ž„์›Œํฌ ์ปดํŒŒ์ผ ๊ณผ์ •์—์„œ ์ดˆ๊ธฐ ํ•˜์ด๋“œ๋ ˆ์ด์…˜ ๋ถˆ์ผ์น˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ปดํŒŒ์ผ ์˜ต์…˜์„ ๋ณ„๋„๋กœ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  2. ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋™์ผํ•œ ์Šคํƒ€์ผ ์ •๋ณด๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์„œ๋ฒ„์—์„œ ๋ณ„๋„์˜ ์Šคํƒ€์ผ ์ˆ˜์ง‘ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  3. ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์—์„œ css in js ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋กœ ๊ฐ์‹ผ ํ›„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋“ค๋กœ ์ธํ•ด ํšŒ์˜๊ฐ์„ ๊ฐ€์ง€๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์“ธ๊ฒƒ์ด๋ผ๋ฉด ๊ทธ๋ƒฅ ์ผ๋ฐ˜์ ์ธ sass๋ฅผ ์ด์šฉํ•ด์„œ ์Šคํƒ€์ผ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ํŽธํ•˜๊ฒƒ์ด๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์ฐพ๋˜ ์ค‘ css๋ฅผ ๋นŒ๋“œ ํƒ€์ž„์— ๋ชจ๋‘ ์ •์ ์œผ๋กœ ๋งŒ๋“ค์–ด์„œ ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๋ชจ๋‘ ์‚ฌ์šฉ ํ• ๋•Œ ๋ฌธ์ œ๊ฐ€ ์—†๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฐ ๋ฐฉ๋ฒ•์„ Vanilla Extract์ด ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค.

Vanilla Extract์˜ ์žฅ์ 

SSR ํ™˜๊ฒฝ์—์„œ css in js ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ ์ž Vanilla Extract์„ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ ๋” ๋งŽ์€ ์ด์ ๋“ค์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

๋นŒ๋“œ ํƒ€์ž„ ์Šคํƒ€์ผ๋ง์˜ ๊ณผ์ œ

๊ทธ๋Ÿฐ๋ฐ ์ƒ๊ฐํ•ด๋ณด๋ฉด ์™œ Styled components ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์€ ๋นŒ๋“œ ํƒ€์ž„์— ์ •์ ์œผ๋กœ ์Šคํƒ€์ผ์„ ์ƒ์„ฑํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์ผ๊นŒ ๊ถ๊ธˆํ•ด์กŒ์Šต๋‹ˆ๋‹ค.

์™œ๋ƒํ•˜๋ฉด Styled components๋„ props๋ฅผ ๋ฐ›์•„ ์ผ€์ด์Šค์— ๋”ฐ๋ผ ์Šคํƒ€์ผ์„ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๊ณ  ๊ฒฐ๊ตญ ์ด๋Š” props์— ๋”ฐ๋ผ ์ •์ ์œผ๋กœ ์ปดํŒŒ์ผ ํ•˜๋Š”๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋Š” ์ด์•ผ๊ธฐ ์˜€์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด props๋กœ ํƒ€์ž…์„ 'default' | 'outline' ์ด๋ผ๋Š” ํƒ€์ž…์„ ์„ ์–ธํ•˜๊ณ  ํ•ด๋‹น ํƒ€์ž…์— ๋”ฐ๋ผ ์Šคํƒ€์ผ์„ ์ •์˜ํ•œ๋‹ค๋ฉด ๊ฒฐ๊ตญ ์ด๊ฒƒ์€ ๋นŒ๋“œํƒ€์ž„์— ์˜ˆ์ธก๊ฐ€๋Šฅํ•œ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ• ์ˆ˜ ์žˆ๋‹ค ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๋™์  ์Šค์นผ๋ผ ๊ฐ’ ์ฒ˜๋ฆฌ์˜ ๋ฌธ์ œ

๊ทธ๋Ÿฌ๋˜ ์ค‘ ๊ทผ๋ณธ์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ๋Š”๋ฐ ๊ทธ๊ฒƒ์€ ๋ฐ”๋กœ ์Šค์นผ๋ผ ๊ฐ’์ด props๋กœ ๋„˜์–ด์˜ฌ๋•Œ์˜€์Šต๋‹ˆ๋‹ค.

๋ฒ”์œ„๊ฐ€ ์ •ํ•ด์ง€์ง€ ์•Š์€ ๊ฐ’, ์ฆ‰ ํ”ฝ์…€ ๋‹จ์œ„์˜ ๊ฐ’์ด props๋กœ ์ „๋‹ฌ๋˜๊ณ  ์ด ๊ฐ’์œผ ์Šคํƒ€์ผ์— ๋ฐ”๋กœ ๋ฐ”์ธ๋”ฉ ๋œ๋‹ค๋ฉด ๋นŒ๋“œํƒ€์ž„์— ์˜ˆ์ธก ํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฐ๋ฐ ์ด๊ฒƒ์€ ๊ฒฐ๊ตญ Vanilla Extract ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋ผ ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

Vanilla Extract์˜ ํ•ด๊ฒฐ์ฑ…: CSS ๋ณ€์ˆ˜ ํ™œ์šฉ

๊ทธ๋Ÿฌ๋ฉด ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ Vanilla Extract์—์„œ๋Š” ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐ ํ• ๊นŒ์š”? ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์•„์ด๋””์–ด๊ฐ€ ๋†€๋ผ์› ์Šต๋‹ˆ๋‹ค.

๋ฐ”๋กœ css ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ  ์ด ๋ณ€์ˆ˜๋ฅผ ํŠน์ • ์Šคํƒ€์ผ์— ๋ฐ”์ธ๋”ฉ์„ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ”ฝ์…€ ๋‹จ์œ„์™€ ๊ฐ™์€ ๋ฒ”์œ„๊ฐ€ ์ •ํ•ด์ง€์ง€ ์•Š์€ ๊ฐ’์€ css ๋ณ€์ˆ˜์˜ ๊ฐ’์œผ๋กœ ์™ธ๋ถ€์—์„œ ์ฃผ์ž…ํ•ด์„œ ๋™์ ์œผ๋กœ ์Šคํƒ€์ผ์„ ๋ณ€๊ฒฝํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ์ „๋žต์ด์˜€์Šต๋‹ˆ๋‹ค.

์ด๋Š” ๋นŒ๋“œ ํ• ๋•Œ์—๋Š” css ๋ณ€์ˆ˜์™€ ํŠน์ • ์Šคํƒ€์ผ์ด ๋ฐ”์ธ๋”ฉ ๋œ๋‹ค๋ฉด ๋นŒ๋“œ ํ•˜๋Š”๋ฐ ์•„๋ฌด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ ๋Ÿฐํƒ€์ž„์— ํ•ด๋‹น css ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด๊ฐ€๋ฉด์„œ ๋™์ ์œผ๋กœ ์Šคํƒ€์ผ์„ ๋ณ€๊ฒฝํ•˜๋ฉด ๊ทธ๋งŒ์ด์˜€์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก  ๋Ÿฐํƒ€์ž„ ๋น„์šฉ์ด ์ œ๋กœ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋“ค์€ ๋™์ ์œผ๋กœ props๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์ƒˆ๋กœ์šด ์Šคํƒ€์ผ์„ ์ƒ์„ฑํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š”๋ฐ ์ด์— ๋น„ํ•ด์„œ๋Š” ์ƒ๋‹นํžˆ ํšจ์œจ์ ์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

๊ตฌ์กฐ์  CSS ์ž‘์„ฑ ์œ ๋„

๊ทธ๋ฆฌ๊ณ  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>