๋คํฌ ๋ชจ๋ ๋์ ์ฑ๊ณต๊ธฐ
์คํจ์ ๊ธฐ๋ก, ๋ชจ๋ ๊ฒ์ ์์์
1๋ถ์ ๋ง์ง๋ง, ๋๋ '์ ๋ต์ ํํด'๋ผ๋ ์ด๋ฆ์ผ๋ก ๋คํฌ ๋ชจ๋ ๋์ ์ ์ ์ ์ค๋จํ๋ค. ๋ชจ๋ ๊ฒ์ด ์ ์์ ์ผ๋ก ๋์ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์์ง๋ง, ๊ฒฐ๊ณผ์ ์ผ๋ก ์๋ฌด๊ฒ๋ ๋ณํ์ง ์์๋ ๊ธฐ์ดํ ํ์. ๊ทธ ๋ฏธ์คํฐ๋ฆฌ๋ ํ๋ฆฌ์ง ์๋ ์์ ์ฒ๋ผ ๋จธ๋ฆฟ์์ ๋งด๋์๋ค.
ํฌ๊ธฐ๋ ์๋์๋ค. ๋ค๋ง, ๋ฌด์์ ๋ถ๋ชํ๋ ๋์ ํ ๊ฑธ์ ๋ฌผ๋ฌ์์ ๋ด๊ฐ ๋จ๊ธด ์คํจ์ ๊ธฐ๋ก๋ค์ ์ฒ์๋ถํฐ ๋ค์ ์ฝ์ด๋ณด๊ธฐ๋ก ํ๋ค. ๋ง์น ์ฌ๊ฑด ํ์ฅ์ ๋จ๊ฒจ์ง ์ฆ๊ฑฐ๋ค์ ๋ค์ ์ดํด๋ณด๋ ์์ฌ๊ด์ฒ๋ผ. "์ ์ ๋์ง?"๋ผ๋ ๋ง์ฐํ ํ์ ๋์ , "๋ด๊ฐ ๋์น๊ณ ์๋ ๋ช ๋ฐฑํ ๋จ์๋ ๋ฌด์์ธ๊ฐ?" ๋ผ๋ ์ง๋ฌธ์ผ๋ก ์ ๊ทผ ๋ฐฉ์์ ๋ฐ๊พธ์๋ค.
๊ทธ๋ ๊ฒ ์คํจ์ ์ฟ๋๋ฏธ ์์์, ๋๋ ์ด ๊ธฐ๋๊ธด ๋๋ฒ๊น ์ ๋๋ผ ์ฒซ ๋ฒ์งธ ์ค๋ง๋ฆฌ๋ฅผ ๋ฐ๊ฒฌํ๊ธฐ ์์ํ๋ค.
์๋ก์ด ๋จ์, ์๋ก์ด ์ ๋ต
๋ง์์ ๋น์ฐ๊ณ ์์ ์์ ๋ค์ ์์ํ ๋ฆฌ์์น๋ ์ด์ ๊ณผ๋ ๋ค๋ฅธ ๊ฒ๋ค์ ๋ณด์ฌ์ฃผ๊ธฐ ์์ํ๋ค. ์คํจ๋ฅผ ๊ฒฝํํ ๋์ผ๋ก ๋ณด๋, ๋ฌด์ฌ์ฝ ์ง๋์ณค๋ ๊ณต์ ๋ฌธ์์ ๋ฌธ์ฅ๊ณผ ๊ฐ๋ฐ ๋ธ๋ก๊ทธ์ ์ฝ๋ ์กฐ๊ฐ๋ค์ด ์๋ก์ด ์๋ฏธ๋ก ๋ค๊ฐ์๋ค.
๋จ์ 1: Toast UI์ ๋ ์ผ๊ตด
Toast UI Editor์ ๊ณต์ ๋ฌธ์๋ฅผ ๋ค์ ์ฝ๋ ์ค, theme prop์ ๋ํ ์ค๋ช
์ด ๋์ ๋ค์ด์๋ค. ์ด๊ธฐ ๋ ๋๋ง ์ ํ
๋ง๋ฅผ ์ง์ ํ๋ ์ญํ . ๊ทธ ์ด๋์๋ ๋์ ์ผ๋ก ํ
๋ง๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค๋ ๋ง์ ์์๋ค. ์ปค๋ฎค๋ํฐ์ ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์ ์ด๋ฏธ ์ด ๋ฌธ์ ๋ฅผ ๊ฒช์๊ณ , ๊ทธ๋ค์ ํด๊ฒฐ์ฑ
์ ํ๊ฒฐ๊ฐ์๋ค. "DOM์ ์ง์ .toastui-editor-dark ํด๋์ค๋ฅผ ์ฃผ์
ํ๋ผ." theme prop์ ํ์์ด์๊ณ , ์ง์ง๋ DOM ์กฐ์์ ์์๋ค.
โ
๋จ์ 2โ
: Tailwind v4์ ํจ๋ฌ๋ค์ ์ ํ
Tailwind v4์ ๋ฌธ์๋ tailwind.config.js์ darkMode: 'class'๊ฐ ๋ ์ด์ ํ์ค์ด ์๋์ ๋ช
ํํ ํ๊ณ ์์๋ค. ๋์ , CSS ํ์ผ ์์์ ์ง์ @custom-variant๋ฅผ ์ ์ธํ๋ ์๋ก์ด ๋ฐฉ์์ ์ ์ํ๋ค. ์คํ์ผ๋ง์ ์ ์ด๊ถ์ด JavaScript ์ค์ ํ์ผ์์ ์์ CSS๋ก ๋์ด์จ ๊ฒ์ด๋ค.
๋จ์ 3: Next.js์ ํด๋ผ์ด์ธํธ์ ์๊ฐ์ฐจ
App Router ํ๊ฒฝ์์์ ๋คํฌ ๋ชจ๋ ๊ตฌํ ์์ ๋ค์ ํ๋๊ฐ์ด suppressHydrationWarning ์์ฑ๊ณผ 'Mounted' ์ํ ํจํด์ ์ธ๊ธํ๊ณ ์์๋ค. ์๋ฒ๋ ์ฌ์ฉ์์ ํ
๋ง ์ค์ ์ ์์ง ๋ชปํ ์ฑ ํ์ด์ง๋ฅผ ๊ทธ๋ฆฌ๊ณ , ํด๋ผ์ด์ธํธ๋ ๋ค๋ฆ๊ฒ localStorage๋ฅผ ํ์ธํ์ฌ ํ
๋ง๋ฅผ ์ ์ฉํ๋ค. ์ด ์๊ฐ์ฐจ๋ก ์ธํด ๋ฐ์ํ๋ ์๋ฒ์ ํด๋ผ์ด์ธํธ์ HTML ๋ถ์ผ์น, ์ฆ ํ์ด๋๋ ์ด์
์ค๋ฅ๋ ๋ฐ๋์ ํด๊ฒฐํด์ผ ํ ๋ฌธ์ ์๋ค.
์ด ์ธ ๊ฐ์ง ๋จ์๋ ์๊ฐ ์์ ์๋ ๋ฒ์ธ์ ์ค๊ณฝ์ ๋๋ฌ๋ด๊ณ ์์๋ค. ๋ฒ์ธ์ '์ ์ ์๋ ๋น๋ ์์คํ '์ด๋ผ๋ ๊ฑฐ๋ํ ์ ๋ น์ด ์๋์๋ค. ๋ฒ์ธ์ ๋ฐ๋ก '๋ด๊ฐ ์ ํํ ์์ง ๋ชปํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ๋ ์์ํฌ์ ๊ตฌ์ฒด์ ์ธ ๋์ ๋ฐฉ์' ์ด์๋ค.
๊ฒฌ๊ณ ํ ํ ๋ ์๊ธฐ
์๋ก์ด ๋จ์๋ค์ ๋ฐํ์ผ๋ก, ๋๋ 1๋ถ์๋ ์ ๋ฐ๋์ ์ ๋ต์ ์ธ์ ๋ค. ๋ชจ๋ ๊ฒ์ Next.js์ ๋น๋ ์์คํ ์ ๋งก๊ธฐ๋ 'ํตํฉ'์ด ์๋, ๊ฐ์์ ์ญํ ์ ๋ช ํํ ์ ์ํ๊ณ ์ ์ดํ๋ '๋ถ๋ฆฌ'์ '์ ๊ตํ ์ ์ด' ์ ๋ต์ด์๋ค.
๋จผ์ , next-themes๋ฅผ ๋ค์ ์ค์นํ๊ณ ThemeProvider๋ฅผ ์ค์ ํ๋ค. ์ด๋ฒ์๋ defaultTheme="light", enableSystem={false} ์ต์
์ ๋ช
์ํ์ฌ, ์ค์ง ๋์ ์ฝ๋๋ง์ด ํ
๋ง๋ฅผ ์ ์ดํ ์ ์๋๋ก ํต์ ๊ถ์ ๊ฐ์ ธ์๋ค.
๋ค์์ผ๋ก, ํ์ด๋๋ ์ด์
์ค๋ฅ๋ฅผ ์์ฒ์ ์ผ๋ก ๋ด์ํ๊ธฐ ์ํด 'Mounted' ์ํ ํจํด์ ๋์
ํ๋ค. useEffect๋ฅผ ์ฌ์ฉํด ์ปดํฌ๋ํธ๊ฐ ํด๋ผ์ด์ธํธ์์ ์์ ํ ๋ ๋๋ง๋ ํ์๋ง ํ
๋ง ๊ด๋ จ ์คํ์ผ์ ์ ์ฉํ๋ ๋ฐฉ์์ด๋ค.
// Mounted ์ํ ํจํด ์์ const [mounted, setMounted] = useState(false); const { theme } = useTheme(); useEffect(() => { setMounted(true); }, []); // ๋ ๋๋ง ๋ถ๋ถ // theme === 'dark' && mounted ? 'dark-class' : ''
์ด ๊ฒฌ๊ณ ํ ๊ธฐ๋ฐ ์์, framer-motion์ ์ด์ฉํ ๋ถ๋๋ฌ์ด ์ ๋๋ฉ์ด์
ํ ๊ธ ๋ฒํผ์ ๊ตฌํํ๋ค. ์ด ์์ ์ฑ๊ณต์ ์์ผ๋ก ๋์๊ฐ ๊ธธ์ ๋ํ ํ์ ์ ์ฃผ์๋ค.
Editor์์ ์ฌํ, ์ฒซ ๋ฒ์งธ ์ฑ๊ณต
๊ณผ๊ฑฐ์ ์คํจ๋ฅผ ๋ฐ๋ณตํ์ง ์๊ธฐ ์ํด, Editor.tsx ์ปดํฌ๋ํธ๋ฅผ ์์ ํ๋ฉฐ ์๋ก์ด ์ ๋ต์ ์ ์ฉํ๋ค.
wrapperRefํจํด ๋์ : Editor ์ปดํฌ๋ํธ๋ฅผdiv๋ก ๊ฐ์ธ๊ณref๋ฅผ ์ฐ๊ฒฐํ๋ค. Editor์ ๋ด๋ถ API์ ์์กดํ๋ ๋์ , ์ดwrapper๋ด๋ถ์์ DOM์ ํ์ํ๋ ๋ฐฉ์์ ํจ์ฌ ์์ ์ ์ด๋ค.useLayoutEffect๋ฅผ ์ด์ฉํ ํด๋์ค ์ฃผ์ :theme์ํ๊ฐ ๋ฐ๋ ๋๋ง๋ค,wrapper๋ด๋ถ์์.toastui-editor-defaultUI์์๋ฅผ ์ฐพ์.toastui-editor-darkํด๋์ค๋ฅผ ์ง์ ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐํ๋ค.
// Editor.tsx์ ํต์ฌ ๋ก์ง useLayoutEffect(() => { const wrapper = wrapperRef.current; if (!wrapper) return; const tuiEl = wrapper.querySelector<HTMLElement>('.toastui-editor-defaultUI'); if (tuiEl) { if (theme === 'dark' && mounted) { tuiEl.classList.add('toastui-editor-dark'); } else { tuiEl.classList.remove('toastui-editor-dark'); } } }, [theme, mounted]);
๊ฒฐ๊ณผ๋ ๋๋ผ์ ๋ค. ํ ๋ง ํ ๊ธ ๋ฒํผ์ ๋๋ฅด์, ์๋ํฐ๋ ๊ฑฐ์ง๋ง์ฒ๋ผ ๋คํฌ ๋ชจ๋๋ก ์๋ฒฝํ๊ฒ ์ ํ๋์๋ค. ํด๋ฐ, ๋ฐฐ๊ฒฝ, ํ ์คํธ ์์๊น์ง ๋ชจ๋ ๊ฒ์ด ์ผ์ฌ๋ถ๋ํ๊ฒ ์์ง์๋ค. ๊ธธ๊ณ ๊ธธ์๋ ์ธ์์ ์ฒซ ๋ฒ์งธ ์น๋ฆฌ์๋ค.
์ด์ ๋ง์ง๋ง ๊ด๋ฌธ, Viewer๋ง์ด ๋จ์์์๋ค. ํ์ง๋ง ๋๋ ์์ง ๋ง์ง๋ง ์๋ จ์ด ๋๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ ์๋ค๋ ์ฌ์ค์ ์์ง ๋ชปํ๋ค.
์ตํ์ ๋๊ด: Tailwind prose์์ CSS ์ ์
Editor ์ ์ฉ์ ์ฑ๊ณตํ๋ฉฐ ์น๋ฆฌ๋ฅผ ์๊ฐํ์ง๋ง, ๋ง์ง๋ง ๊ด๋ฌธ์ธ Viewer์์ 1๋ถ์ ์ ๋ชฝ์ด ์ฌํ๋์๋ค. ๋คํฌ ๋ชจ๋๋ก ์ ํํด๋ ๋ณธ๋ฌธ ํ ์คํธ๊ฐ ๊น๋งฃ๊ฒ ๋จ์ ๊ฐ๋ ์ฑ์ด ์ ํ ํ๋ณด๋์ง ์์๋ค. ์ฝ๋ ๋ธ๋ก ์ฃผ๋ณ์๋ ์์น ์๋ ์ด์ค ํ ๋๋ฆฌ๊ฐ ์๊ฒจ ๋์์ธ์ ํด์น๊ณ ์์๋ค.
๋ฌธ์ ๋ ๋ ์ด์ ๋ฏธ๊ถ ์์ ์์ง ์์๋ค. ๋๋ ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ๋ผ๋ ๊ฐ์ฅ ๊ฐ๋ ฅํ ๋ฌด๊ธฐ๋ฅผ ๋ค๊ณ '๊ณผํ ์์ฌ'์ ์ฐฉ์ํ๋ค. Styles ํญ๊ณผ Computed ํญ์ ์ค๊ฐ๋ฉฐ ๋ชจ๋ CSS ๊ท์น์ ๋์ง๊ธฐ๊ฒ ์ถ์ ํ ๋์, ๋ง์นจ๋ด ์ง์ง ๋ฒ์ธ์ ์ ์ฒด๋ฅผ ๋ฐํ๋๋ค.
๋ฒ์ธ์ Toast UI๋, Next.js๋ ์๋์๋ค. ๋ฐ๋ก ๋ด๊ฐ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ๋ Tailwind Typography ํ๋ฌ๊ทธ์ธ, @tailwindcss/typography์ prose ํด๋์ค์๋ค.
prose๋ ๋งํฌ๋ค์ด ์ฝํ
์ธ ๋ฅผ ์๋ฆ๋ต๊ฒ ๊พธ๋ฉฐ์ฃผ๊ธฐ ์ํด ๋งค์ฐ ๊ตฌ์ฒด์ ์ด๊ณ ๊ฐ๋ ฅํ ์คํ์ผ ๊ท์น๋ค์ ์์ฑํ๋ค. ์ด ๊ท์น๋ค์ด Toast UI์ ๋คํฌ ๋ชจ๋ ์คํ์ผ๋ณด๋ค ์ฐ์ ์์๊ฐ ๋์, ๋ด ๋ชจ๋ ๋
ธ๋ ฅ์ ๋ฎ์ด์ฐ๊ณ ์์๋ ๊ฒ์ด๋ค. ์ด CSS ์ฐ์ ์์(Specificity) ์ ์์์ ์ด๊ธฐ์ง ๋ชปํ๋ฉด, ๋คํฌ ๋ชจ๋๋ ์์ํ ๋ฏธ์์ฑ์ผ๋ก ๋จ์ ํฐ์๋ค.
์ญ์ ์ ์ฝ๋: ๋จ ํ ์ค์ CSS๋ก ์ ์์ ๋๋ด๋ค
prose์์ ์ ์์์ ์ด๊ธฐ๊ธฐ ์ํ ์ ๋ต์ ๋ช
ํํ๋ค. prose์ ๊ท์น๋ณด๋ค ๋ ๊ตฌ์ฒด์ ์ธ, ์ฐ๋ฆฌ๋ง์ ๊ท์น์ ๋ง๋ค์ด ์ ์ธ๋ฅผ ๋ค์ง๋ ๊ฒ์ด์๋ค.
๋จผ์ , ์ฝ๋ ๋ธ๋ก์ ์ด์ค ํ
๋๋ฆฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด globals.css์ ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ค.
/* globals.css */ .prose pre { border: none !important; background-color: transparent !important; }
!important ํค์๋๋ prose๊ฐ ์ค์ ํ ๋ชจ๋ border์ background๋ฅผ ๊ฐ์ ๋ก ๋ฌด๋ ฅํ์์ผฐ๋ค. ์ด๋ก์จ react-syntax-highlighter์ materialDark ํ
๋ง์ ๋ด๊ฐ ์ง์ ๋ง๋ ์ปค์คํ
ํ
๋๋ฆฌ๋ง ํ๋ฉด์ ๋จ๊ฒ ๋์๋ค.
๋ค์์ผ๋ก, ๊ฐ์ฅ ์ค์ํ๋ ํ
์คํธ ๊ฐ๋
์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ฐจ๋ก์๋ค. prose์ Toast UI์ ๋คํฌ ๋ชจ๋ ํด๋์ค๋ฅผ ์กฐํฉํ, ๋๊ตฌ๋ณด๋ค ๊ฐ๋ ฅํ ์ ํ์๋ฅผ ๋ง๋ค์ด๋๋ค.
/* globals.css */ .prose.toastui-editor-dark { --tw-prose-body: theme('colors.gray.300'); --tw-prose-headings: theme('colors.gray.100'); --tw-prose-links: theme('colors.blue.400'); /* ... ๋ฑ๋ฑ */ }
์ด ์ฝ๋๋ Tailwind Typography์ ๊ณต์์ ์ธ ๋คํฌ ๋ชจ๋ ์ค๋ฒ๋ผ์ด๋ ๋ฐฉ์์ด๋ค. .prose์ .toastui-editor-dark ํด๋์ค๊ฐ ํ ์์์ ๋์์ ์กด์ฌํ ๋, prose๊ฐ ์ฌ์ฉํ๋ ๋ชจ๋ ์์ ๋ณ์๋ฅผ ๋ด๊ฐ ์ํ๋ ๋คํฌ ๋ชจ๋์ฉ ์์์ผ๋ก ๊ต์ฒดํ๋ผ๋ ๋ช
๋ น์ด๋ค.
๋ง์ง๋ง์ผ๋ก, ์ด CSS ๊ท์น์ด ๋์ํ ์ ์๋๋ก HTML ๊ตฌ์กฐ๋ฅผ ์ ๋ฆฌํ๋ค. MarkdownViewer๋ฅผ ๊ฐ์ธ๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ์ธ PostContent๊ฐ prose ํด๋์ค์ ํจ๊ป ๋คํฌ ๋ชจ๋์ผ ๋ toastui-editor-dark ํด๋์ค๋ฅผ ๊ฐ๋๋ก ์ฑ
์์ ์์ํ๋ค.
// PostContent.tsx const articleClassName = ` prose ... ${theme === 'dark' && mounted ? 'toastui-editor-dark' : ''} `; return ( <article className={articleClassName}> <MarkdownViewer ... /> </article> );
์ด ๋ง์ง๋ง ํผ์ฆ ์กฐ๊ฐ์ด ๋ง์ถฐ์ง๋ ์๊ฐ, ๋ชจ๋ ๊ฒ์ด ๋ฐ๋์๋ค.
๋ฒฝ ๋๋จธ์ ํ๊ฒฝ
ํ ๋ง ํ ๊ธ ๋ฒํผ์ ๋ค์ ํด๋ฆญํ๋ค. ๋คํฌ ๋ชจ๋๋ก ์ ํ๋ ํ๋ฉด์๋, ๋ด๊ฐ ๊ฟ๊พธ๋ ๋ชจ๋ ๊ฒ์ด ์๋ฒฝํ๊ฒ ๊ตฌํ๋์ด ์์๋ค.

์ด๋์ด ๋ฐฐ๊ฒฝ ์๋ก ๋ฐ๊ฒ ๋น๋๋ ํ
์คํธ, materialDark ์คํ์ผ์ ์ ์งํ๋ฉด์๋ ๋ช
ํํ ๊ฒฝ๊ณ๋ฅผ ๊ฐ์ง ์ฝ๋ ๋ธ๋ก, ๋ชจ๋ ๊ฒ์ด ์๋ฒฝํ ์กฐํ๋ฅผ ์ด๋ฃจ๊ณ ์์๋ค. ๊ธธ๊ณ ํ๋ํ๋ ๋๋ฒ๊น
์ฌ์ ์ ์ข
์ฐฉ์ง์๋ค.
์ด๋ฒ ๊ฒฝํ์ ํตํด ๋๋ ๊ฐ๋น์ผ ๊ตํ์ ์ป์๋ค. '๊ทธ๋ฅ ์๋๋ค'๋ ๊ฒ์ ์์๋ค. ๋จ์ง '์์ง ๋ด๊ฐ ๋ชจ๋ฅด๋ ๊ฒ'์ด ์์ ๋ฟ์ด์๋ค. ๋ฌธ์ ํด๊ฒฐ์ ํต์ฌ์ ํ๋ คํ ๊ธฐ์ ์ด ์๋, ๊ฐ์ค์ ์ธ์ฐ๊ณ , ๊ฐ๋ฐ์ ๋๊ตฌ๋ก ๊ฒ์ฆํ๊ณ , ์์ธ์ ์ง์ํ๊ฒ ํ๊ณ ๋๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ํ๋์ ์์๋ค.
1๋ถ์ ๋ง์ง๋ง, ๋๋ ๋ฐ๋์ ์ด ๋ฒฝ์ ๋๊ฒ ๋ค๊ณ ์ฝ์ํ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ง์นจ๋ด, ๊ทธ ์ฝ์์ ์ง์ผฐ๋ค. ๐
์ํ๋ก๊ทธ: ๋น์ด ๋ฟ์ง ์๋ ๊ณณ๊น์ง, ๋คํฌ ๋ชจ๋์ ์์ฑ
๊ฐ์ฅ ํฐ ์ฐ์ด์๋ Editor์ Viewer๋ฅผ ์ ๋ณตํ๊ณ ๋๋, ๋์์ ๋์ ํ์์ด ํผ์ณ์ง ๊ธฐ๋ถ์ด์๋ค. ๊ฐ์ฅ ๋ณต์กํ๊ณ ์์ธก ๋ถ๊ฐ๋ฅํ๋ ๋ฌธ์ ๋ค์ด ํด๊ฒฐ๋ ์ง๊ธ, ๋จ์ ์์ ์ ์ฐ๋ฆฌ๊ฐ ๊ตฌ์ถํ ๊ฒฌ๊ณ ํ ๊ธฐ๋ฐ ์์ ์ผ๊ด๋ ๋์์ธ ์์น์ ์ ์ฉํ๋, ์ฆ๊ฑฐ์ด '๋ง๋ฌด๋ฆฌ' ๋จ๊ณ์๋ค.
์๋ก์ด '๊ณจ๋ ๋ฃฐ'์ ํ์
๋ณต์กํ CSS ์ค๋ฒ๋ผ์ด๋๋ !important์์ ์ ์์ ๋๋ฌ๋ค. ์ด์ ์ฐ๋ฆฌ์๊ฒ๋ ๋ชจ๋ ๊ฒ์ ํด๊ฒฐํ ์ ์๋ ๋จ์ํ๊ณ ๊ฐ๋ ฅํ ๊ท์น, '๊ณจ๋ ๋ฃฐ'์ด ์๊ฒผ๋ค. ๋ฐ๋ก Tailwind CSS์ dark: ์ ๋์ฌ์๋ค.
bg-white๊ฐ ํ์ํ ๊ณณ์dark:bg-stone-800์,text-gray-800์ด ํ์ํ ๊ณณ์dark:text-gray-200์ ์ถ๊ฐํ๋ ์์ .
์ด ๋จ์ํ ํจํด์ ๋ฐ๋ณต๋ง์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ชจ๋ ๊ตฌ์์ ์ด๋ ์ ๋ด๋ฆด ์ ์์๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ผ๋ก์ ํ์ฅ: ์ ์ง์ ์์ฑ์ ์ฆ๊ฑฐ์
์ฐ๋ฆฌ๋ ์ฒด๊ณ์ ์ธ ์ฒดํฌ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค์ด, ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ชจ๋ ์ปดํฌ๋ํธ์ ๋คํฌ ๋ชจ๋๋ฅผ ์ ์ง์ ์ผ๋ก ์ ์ฉํด๋๊ฐ๋ค.
- ๊ธ๋ก๋ฒ UI (Footer, PostCard): ๊ฐ์ฅ ๋จผ์ ์ฌ์ฉ์์ ๋ง์ฃผํ๋ Footer์ ํํ์ด์ง์ PostCard๋ถํฐ ์์ํ๋ค.
Header์PostContent์์ ํ๋ฆฝํ ๋์์ธ ์ธ์ด๋ฅผ ๊ทธ๋๋ก ์ ์ฉํ์ฌ ์ ์ฒด์ ์ธ ํต์ผ์ฑ์ ๋ง์ถ์๋ค. ๋ก๋ฉ ์ํ๋ฅผ ๋ณด์ฌ์ฃผ๋ ์ค์ผ๋ ํค UI๊น์ง ๋ํ ์ผํ๊ฒ ์ฑ๊ธฐ๋ ๊ฒ๋ ์์ง ์์๋ค.

-
๊ฒ์๊ธ ์์ธ ํ์ด์ง์ ๋๋จธ์ง ์กฐ๊ฐ๋ค: ์ด๋ฏธ ์์ฑ๋ ๋ณธ๋ฌธ์ ์ค์ฌ์ผ๋ก,
PostHeader,PostAuthorProfile๋ฑ ์ฃผ๋ณ UI ์์๋ค์ ์์์ ์กฐ์ ํ๋ค. ์ด ๊ณผ์ ์ ๋ง์น ์ ์ง์ธ ํผ์ฆ์ ๋ง์ง๋ง ์กฐ๊ฐ๋ค์ ๋ง์ถ๋ ๊ฒ์ฒ๋ผ ์ฆ๊ฑฐ์ ๋ค. -
๋๊ธ ์์คํ ๊ณผ ์ธ์ฆ ํ์ด์ง: ์ฌ์ฉ์์ ์ธํฐ๋์ ์ด ๊ฐ์ฅ ํ๋ฐํ ๋๊ธ ์์คํ ๊ณผ ๋ก๊ทธ์ธ/ํ์๊ฐ์ ํ์ด์ง์๋ ๋์ผํ ๊ท์น์ ์ ์ฉํ๋ค. ๋ณต์กํ ์ํ ๋ณํ๊ฐ ๋ง์ ์ปดํฌ๋ํธ์์ง๋ง, '๊ณจ๋ ๋ฃฐ' ์์์๋ ๋ชจ๋ ๊ฒ์ด ๊ฐ๋จํ๋ค. ๊ฐ ํผ ์์์ ๋ฒํผ, ์๋ด ๋ฉ์์ง์
dark:์ ๋์ฌ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ๋ง์ผ๋ก ๋ชจ๋ ์์ ์ด ๋๋ฌ๋ค.


์ต์ข ์ปค์คํฐ๋ง์ด์ง: ๋๋ง์ ์์ ์ ํ๋ค
๋ชจ๋ ๊ธฐ๋ฅ ๊ตฌํ์ด ๋๋ ํ, ๋ง์ง๋ง์ผ๋ก globals.css์ ๊ฐ ์ปดํฌ๋ํธ์ ํฉ์ด์ ธ ์๋ ์์ ์ฝ๋๋ค์ ๋ด ์ทจํฅ์ ๋ง๊ฒ ๋ฏธ์ธ ์กฐ์ ํ๋ ์๊ฐ์ ๊ฐ์ก๋ค. ์ด ๊ณผ์ ์ ๋ง์น ์ ๋ง๋ค์ด์ง ์๋์ฐจ์ ์์์ ๊ณ ๋ฅด๋ ๊ฒ์ฒ๋ผ, ๊ธฐ๋ฅ์ ๋ํ ๊ฑฑ์ ์์ด ์์ํ๊ฒ ๋ฏธ์ ์ธ ๋ถ๋ถ์๋ง ์ง์คํ ์ ์๋ ๋จ๊ณ์๋ค.
๊ฒฐ๋ก
๊ธธ๊ณ ํ๋ํ๋ ๋คํฌ ๋ชจ๋ ๋์ ์ฌ์ ์ ์ด๋ ๊ฒ ๋ง์ ๋ด๋ ธ๋ค. ์๋ง์ ์คํจ์ ๋๋ฒ๊น ๋์ ์ป์ ๊ฒ์ ๋จ์ํ ๊ฒ์ ํ๋ฉด์ด ์๋์๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋์ ์๋ฆฌ๋ฅผ ๊น์ด ์ดํดํ๊ณ , CSS์ ์ ์์์ ์น๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ ์ผ๋ฉฐ, ๋ฌด์๋ณด๋ค ์ด๋ค ๋ฌธ์ ๋ ๊ฒฐ๊ตญ ํด๊ฒฐํ ์ ์๋ค๋ ์์ ๊ฐ์ ์ป์๋ค.
์ด์ ๋์ ๋ธ๋ก๊ทธ๋ ๋ฎ์๋, ๋ฐค์๋ ์ฌ์ฉ์๋ฅผ ํธ์ํ๊ฒ ๋ง์ดํ ์ค๋น๋ฅผ ๋ง์ณค๋ค.
