Development
Chakra UI 3 ๋ฒ์ Migration ์ด์ผ๊ธฐ
2/5/2025


ํ๋ก ํธ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ๋์๋ Charkra UI๋ผ๋ ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ณค ํฉ๋๋ค. ์ปดํฌ๋ํธ ์คํ์ผ๋ง ๊ฐ์ React Props๋ก ๋๊น๋๋ค. ์ด๋ฌํ ํน์ง์ผ๋ก Typescript์ ํจ๊ป ์ฌ์ฉํ๋ฉด ์์ง ๋ชปํ๋ CSS ์์๊น์ง ์ฝ๊ฒ ํ์ํ๊ณ ์ฌ์ฉํ ์ ์๋ ์ฅ์ ์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฒ๋ผ ์ด์ฌํ ์ฌ์ฉํด๋ณด์ง๋ ์์์ ๋น๊ต๋ ๋ถ๊ฐํ์ง๋ง ์ ์ด๋ ์ ์๋ง์๋ ๊ฐ์ฅ ๋ง๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ ๊ฒ ๊ฐ์ต๋๋ค.

์ด๊ฑฐ ์์ผ๋ฉด ํ๋ก ํธ๊ฐ๋ฐ ๋ชปํฉ๋๋ค..
Chakra 3.0 ๋ฑ์ฅ
2024๋ 10์, ์ฆ ์ ๊ฐ ํ์ฐธ ํ๊ต๊ณต๋ถ๋ฅผ ํ๊ณ ์์ ์๊ฐ์ 3.0 ๋ฒ์ ์ด ์ถ์๋์์ต๋๋ค. ๋น์์๋ ์ถ์๋ ์ง๋ ๋ชฐ๋์ผ๋ฉฐ ์ต๊ทผ์ ๋ค๋ฅธ ํ๋ก์ ํธ๋ฅผ ํ๋ฉด์ 3.0์ ๋ฑ์ฅ์ ์๊ฒ ๋์์ต๋๋ค. ์ด๋ฏธ ์ด ์์ ์๋ 3.5.1 ๋ฒ์ ์ด ๋์จ ์ํ์์ต๋๋ค.
๊ฐ๋ฐ ์ค ๋ญ๊ฐ ์์ ์ด๋ UI๊ฐ ์กฐ๊ธ์ฉ ๋ค๋ฅธ ๋๋์ด ์์ด์ ์ด์ํจ์ ๋๋ผ๋ ์ฐฐ๋ ํฐ ๋ฒ์ ์ ๋ฐ์ดํธ๊ฐ ์์ด์ ๊ทธ๋ฌ๋ค๋ ๊ฒ์ ์ธ์งํ์ต๋๋ค. ์ดํ ๋ฌธ์๋ฅผ ์ฐจ๊ทผ์ฐจ๊ทผ ์ดํด๋ณด๋ ์๋ก์ด ๊ธฐ๋ฅ์ด ๋ง์์ ธ์ ๊ด์๋ฆฌ ์ค๋ ์์ต๋๋ค. ์ด ๊ธ์์๋ ๋ช๊ฐ๋ง ์ดํด๋ณด๊ธฐ๋ก ํ๊ฒ ์ต๋๋ค.
For
์ปดํฌ๋ํธ์ ๋ชฉ๋ก์ ๋ ๋๋งํ ๋ ์ฌ์ฉํ๋ ์ปดํฌ๋ํธ์ ๋๋ค.
import { Box, For, Stack, Text } from "@chakra-ui/react";
const Demo = () => {
return (
<Stack>
<For
each={[
{ name: "Naruto", powers: ["Shadow Clone", "Rasengan"] },
{ name: "Sasuke", powers: ["Chidori", "Sharingan"] },
{ name: "Sakura", powers: ["Healing", "Super Strength"] },
]}
>
{(item, index) => (
<Box borderWidth="1px" key={index} p="4">
<Text fontWeight="bold">{item.name}</Text>
<Text color="fg.muted">Powers: {item.powers.join(", ")}</Text>
</Box>
)}
</For>
</Stack>
);
};์ด๋ค ๊ฐ์ ํ ๋๋ก ๋ชฉ๋ก์ ๋ ๋๋งํ๋ค๋ semanticํ ์๋ฏธ๊ฐ ์กฐ๊ธ ๋ ๋๋ฌ๋๋ ๊ฒ ๊ฐ์ง๋ง ํน๋ณํ๊ฒ ์จ์ผํ ์ด์ ๋ฅผ ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๊ทธ๋ฅ map ํจ์๋ฅผ ์ธ ๋๋ณด๋ค ์ฝ๋๊ฐ ์ค์ด๋ค์ง๋ ์๋ ๊ฒ ๊ฐ๊ณ , ์คํ๋ ค ์ฝ๋๊ฐ ๋ ๋ณต์กํด์ง๋ ๊ฒ ๊ฐ์์ ์ ์์ฐ๊ฒ ๋๋ ์ปดํฌ๋ํธ์์ต๋๋ค.
QR Code
Petefolio QR Code
Chakra UI๋ก ๋ง๋ QR ์ฝ๋์ ๋๋ค.
import { QrCode } from "@chakra-ui/react"
const Demo = () => {
return (
<QrCode.Root value='https://www.petefolio.xyz'>
<QrCode.Frame>
<QrCode.Pattern />
</QrCode.Frame>
</QrCode.Root>
);
}์ด์ ์ปดํฌ๋ํธ ๊ธฐ๋ฐ์ผ๋ก QR ์ฝ๋๋ ๋ง๋ค ์ ์๊ฒ ๋ฉ๋๋ค. ๋งํฌ๋ง ๋ฃ์ด์ฃผ๋ฉด ๋๋ฑ์ ๋๋ค. ์ ๋ง ๊ฐํธํ๊ฒ ๋ง๋ค ์ ์์ง๋ง ๋ฑํ ์ฌ์ฉํ ๊ธฐํ๊ฐ ์์ ๊ฒ ๊ฐ๊ธฐ๋ ํฉ๋๋ค. ์ด๋ฒ ํ๋ก์ ํธ์ ์ด๋ป๊ฒ๋ ์ต์ง๋ก ํ๋ฒ ๋ฃ์ด๋ด์ผ๊ฒ ์ต๋๋ค.
Timeline

Timeline ์ปดํฌ๋ํธ์ ๋๋ค. ๋ธ๋ก๊ทธ์ About me ํ์ด์ง์ ๋ฃ์ผ๋ฉด ์ฐฐ๋ก์ผ ๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ ํ์ต๋๋ค. ์ฌ์ฉํ๊ธฐ ์ด๋ ต์ง๋ ์์์ง๋ง ์ข์ธก ๋๊ทธ๋ผ๋ฏธ์ ํฌ๊ธฐ ๋ณ๊ฒฝ ๊ธฐ๋ฅ์ ์ ํ์ด ์์๊ณ , ์์๋ก ์กฐ์ ํ๋ฉด line์ด ์ด๊ธ๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์์ต๋๋ค.
Timeline์ ๋น๋กฏํ ๋ช๋ช ์ปดํฌ๋ํธ๋ค์ '@chakra-ui/react' ๋ก importํ๋ ๊ฒ ๋์ ์, chakra-cli๋ฅผ ์ฌ์ฉํ์ฌ ์์ค์ฝ๋๋ฅผ ๋ก์ปฌ ํ๋ก์ ํธ์ ์์ฑํ๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ ๊ฒ์ ๋ฌธ์์์ ๋ช ์ํ๊ณ ์์์ต๋๋ค. ์์ธ์ง๋ ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์๋ง ์์ง ์คํ์ ์ธ ์ปดํฌ๋ํธ๋ค์ ์์ ์ฑ์ด ๋จ์ด์ ธ ์ฌ์ฉ์์๊ฒ ์ปค์คํฐ๋ง์ด์ง์ ๋งก๊ธฐ๊ธฐ ์ํจ์ด์์๊น์? ์๋ฌดํผ ์ ๋ ํ์๋ผ์ธ์ About Me ํ์ด์ง์์๋ง ์ฌ์ฉํ ๊ฒ์ด์์ผ๋ฏ๋ก cli๋ก ์์ฑ๋ ์ปดํฌ๋ํธ ์์ฒด๋ฅผ ์์ ํ์ฌ ์ข์ธก ๋๊ทธ๋ผ๋ฏธ ํฌ๊ธฐ์ ๋ง๊ฒ ์ ์ ๋ฐฐ์น์์ผฐ์ต๋๋ค.

๊ธฐ์กด ๋์์ธ๋ณด๋ค ํจ์ฌ ๋ณด๊ธฐ ์ข์์ง ๊ฒ ๊ฐ์ ๊ธฐ๋ถ์ด ์ข์ต๋๋ค.
Migration์ ํ๋ ์์ค์๋ ์ ๋ฐ์ดํธ๋ ๊ณ์๋๋ค.
Timeline์ ๋ธ๋ก๊ทธ์ ๋๋ฌด ๋ฃ๊ณ ์ถ์ด์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฒ์ ๋ง์ด๊ทธ๋ ์ด์ ์ ์ต๊ทผ 5์ผ์ ๊ฑฐ์ณ ์ํํ์ต๋๋ค. ๋ฒ์ ์ ๋ฐ์ดํธ๋ฅผ ํ๋ ์๊ฐ ๋ธ๋ก๊ทธ ์ฑ์ ์คํ๋ ๋์ง ์์๊ณ , ๊ผฌ๋ฐ 2์๊ฐ์ ์ฝ๋๋ฅผ ๊ณ ์ณ์์ผ ๊ฒจ์ฐ ํ๋ฉด์ ๋ณผ ์ ์์์ต๋๋ค. ๋ฌผ๋ก UI๋ ๋ค ๊นจ์ง ์ํ๋ก์.
์ ๋ง ์ ๋ง ๋ง์ ์ฝ๋๋ฅผ ๊ณ ์ณค์ต๋๋ค.
์ค๋ฅ๊ฐ ๋ฐ์ํ์ฌ ํ๋ฉด์ ๋ณผ ์ ์์๋ ์ด์ ๋ cli๋ก ์ค์นํ ์์ค์ฝ๋๋ฅผ import ํด์ผํ๋ ๋ช๋ช ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์๊ธฐ ๋๋ฌธ์ ๋๋ค. select, tag, toaster ๋ฑ์ด ๊ทธ๋ฌ์ต๋๋ค. ์ด๋ฐ ๋ฐฉ์์ snippet์ด๋ผ๊ณ ๋ฌธ์์์ ๋ณธ ๊ฒ ๊ฐ์๋ฐ, ์ ํํ ์ ์ด๋ฐ ๋ฐฉ์์ ์ฐ๋์ง๋ ๋์ค์ ํ๋ฒ ์์๋ด์ผ๊ฒ ์ต๋๋ค.
2๋ฒ์ ์์ ํ ์คํธ๋ฅผ ๋์ฐ๊ธฐ ์ํด ์ฌ์ฉํ๋ useToast๋ ์์ด์ก์ต๋๋ค. ์ด๋ toaster ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ ธ์ ์์ ํ ์๋กญ๊ฒ ๊ตฌํํด์ผ ํ์ต๋๋ค.
์์์ ๋ถ์ฌํ๋ ์์ฑ์ด์๋ colorScheme๋ฅผ ์ ๋ถ colorPalette๋ก ๋ฐ๊พธ์ด์ผ ํ์ต๋๋ค. ๋คํํ๋ ์ด๋ Import ๋ฌธ์ ์๋ ์๊ด ์์๊ธฐ์ ํ๋ฉด์ ๋ณด๋ฉด์ ์์์ด ์ ์ฉ๋์ง ์์ ๊ฒ๋ง ๋ฐ๊ฟ์ฃผ์์ต๋๋ค. Palette๋ผ๋ ๋จ์ด ๋ฐฐ์ด์ด ๋ญ๊ฐ ์ด์ํด ๊ณ์ Pallete๋ก ์์ฑํ๋ค๊ฐ ์ปดํ์ผ ์๋ฌ๋ฅผ ์ฌ๋ฟ ๋ณด์์ต๋๋ค
๋ํ 2๋ฒ์ ์์๋ <Show above='md'>...</Show> ์ ๊ฐ์ ๋ฐฉ์์ ํตํด ํ๋ฉด ํฌ๊ธฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ปดํฌ๋ํธ๋ฅผ ์กฐ๊ฑด๋ถ ๋ ๋๋ง ํ ์ ์์๋๋ฐ, ์ด ๊ธฐ๋ฅ์ด ๋ชจ๋ ์ฌ๋ผ์ ธ๋ฒ๋ ธ์ต๋๋ค. ๋ชจ๋ ์ฝ๋์์ ์ด ์ปดํฌ๋ํธ๋ฅผ ์์ ์ฃผ๊ณ , display์ ์กฐ๊ฑด๋ถ ์์ฑ์ ์ฃผ๋ ๋ฐฉ์์ผ๋ก ๊ธฐ์กด๊ณผ ๊ฐ์ ๋ฐ์ํ์ ์ ์ง์์ผ์ค์ผ ํ์ต๋๋ค.
๊ตฌ๋ถ์ ์ธ Divider๋ Separator๋ก ๋ฐ๋์์ต๋๋ค. ๊ธฐ๋ฅ์ ์ ์ฌํ ๊ฒ ๊ฐ์ต๋๋ค.
๋ํ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ๊ฐ๋ ์ฌ๋ฌ ์ปดํฌ๋ํธ์ ๊ณตํต ์ปดํฌ๋ํธ ์ด๋ฆ์ ๊ณต์ ํ๋๋ก ๋ง๋๋ ํจํด์ด ๋ํ๋ฌ์ต๋๋ค. ์ด ๋ถ๋ถ์ด ๊ฐ์ฅ ์๊ฐ์ ๋ง์ด ์๊ฒ ํ๋ฉด์๋ ๊ฐ์ฅ ๋ง์ ๋๋ ๋ถ๋ถ์ด๊ธฐ๋ ํฉ๋๋ค. ๋ด๋ถ์ ํ์ํ ์์๋ฅผ ์ง๊ด์ ์ผ๋ก ๋ถ๋ฌ์ฌ ์๋ ์๊ณ ์๋ชป๋ ์์๋ฅผ ๊ฐ์ ธ๋ค ์ฐ๋ ์ผ๋ ๋ฐฉ์งํด์ฃผ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์๋จ์ import ๋ฌธ๋ค์ด ๊น๋ํด์ง๋ ํจ๊ณผ๋ ์์ต๋๋ค.
//2.x
<UnorderedList>
<ListItem>
</ListItem>
</UnorderedList>
//3.x
<List.Root as='ol'>
<List.Item>
</List.Item>
</List.Root>์ด๋ ๊ฒ ๋ฉฐ์น ๊ฐ ๋ง์ด๊ทธ๋ ์ด์ ์ ํ๋๋ฐ, ๊ทธ ์ฌ์ด์ 3.5.1 ์ด์๋ ๋ฒ์ ์ 3.6.0, ๋ ๋์๊ฐ 3.7.0๊น์ง ๋์์ต๋๋ค. ๊ทธ๊ฐ์ ๋ณ๊ฒฝ ๋๋ฌธ์ snippet ๋ฐฉ์์ผ๋ก ๋ฐ๊ฟ์ฃผ์๋ Tag ์ปดํฌ๋ํธ๋ฅผ ๋ ๋ค์ ์์ํ๋ก ๋ฐ๊ฟ์ผํ๋ ์ด์ํ ์ผ๊น์ง ๊ฒช์์ต๋๋ค.

3์ผ ์

18์๊ฐ ์
์ด๋ค๋ค์ ์ ๋ฐ์ดํธ๊ฐ ์์ด๋ฆฌ ์ฆ์๊น์? ์๋์ ๋ฐ๋ผ๊ฐ๋ ค๋ฉด ๋ถ๋จํ ๊ณต๋ถํด์ผํ ๊ฒ ๊ฐ์ต๋๋ค.
์์ฌ์ด ์
ํฌ๊ธฐ
์ ๋ฐ์ ์ผ๋ก ์ปดํฌ๋ํธ ๋ฐ ๊ธ์จ ํฌ๊ธฐ๊ฐ ์์์ก์ต๋๋ค. ๊ธฐ์กด ๋ฒ์ ์์์ ํฌ๊ธฐ๋ฅผ ์์น๋ก ๊ธฐ์ตํ์ง๋ ๋ชปํ์ง๋ง, ๊ฐ์ ์ฌ์ด์ฆ ์ด๋ฆ (Ex. 'md', 'xl') ์ ๊ฐ์ง ๊ธ์ ํน์ ๋ฒํผ ๋ฑ์์ ํ์ฐํ ํฌ๊ธฐ๊ฐ ์์์ง์ ๋๊ผ์ต๋๋ค. ๋น๊ต์ ํฐ ์ปดํฌ๋ํธ๋ฅผ ๋์์ธํ ๋ ๊ธฐ์กด์๋ '2xl', '3xl' ๋ฑ์ผ๋ก ์์ฑํ๊ณ ๊ทธ๊ฒ์ ๋ง์กฑํ์๋๋ฐ, 3๋ฒ์ ์ด ๋ ์ดํ๋ก๋ ์ฌ์ด์ฆ๋ช ์ผ๋ก ์ถฉ๋ถํ ํฌ๊ธฐ๊ฐ ๋์ค์ง ์์ ๊ตฌ์ฒด์ ์ธ ํฝ์ ์ ์ง์ ํด์ฃผ์ด์ผ ํ์ต๋๋ค. ๊ตฌ์ฒด์ ์ธ ํฝ์ ์์ฑ์ ๋ชจ๋ฐ์ผ๋ก ๋ฐ๋ ๋์ ํฌ๊ธฐ๊น์ง ์ง์ ํ๋๋ก ์๊ตฌํ๊ธฐ์ ๊ต์ฅํ ๋ฒ๊ฑฐ๋ก์ด ์ผ์ด ๋์์ต๋๋ค.
๊ธฐ๋ณธ ์์
์ฒ์์๋ ๋ญ๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น์ ์ค๋ฅ๊ฐ ์๊ธด์ค ์์์ต๋๋ค. ๋ฒํผ์ ๊ธฐ๋ณธ ์์์ด ์๊น๋ง์์ผ๋ก ๊ณ์ ๋ํ๋ฌ๋ ๊ฒ๋๋ค. colorPalette์ gray, white, black์ ์ค๋ด๋ ๋ณํจ์ด ์์์ต๋๋ค. ํน์ theme ์ค์ ์ด ์๋ชป๋์๋ ํ๊ณ ํ ๋ง ์ค์ ๋ฌธ์๋ ํ์ฐธ์ ์ฐพ์๋ณด์์ต๋๋ค.

์๊ณ ๋ณด๋ ๊ทธ๋ฅ ๊ธฐ๋ณธ ์์์ด ๋ธ๋์ด ๋์ด๋ฒ๋ฆฐ ๊ฒ์ด์์ต๋๋ค. 2๋ฒ์ ์์ ๊ธฐ๋ณธ ์์์ ํ์์ด์ด์ ๊ทธ๋ญ์ ๋ญ ๋ธ๋ก๊ทธ์ ์ด์ธ๋ ค์ ์ฌ์ฉํ์ง๋ง, ๋ธ๋์ด ๋๊ณ ๋๋ ์ข ๋ณด๊ธฐ ์ซ์ด์ ๋ชจ๋ Button์ ์์ ์์ฑ์ ๋ฐ๊พธ๊ฒ ๋์์ต๋๋ค. 2๋ฒ์ ์ ๋ฒํผ๊ณผ ์ ์ฌํ ๋์์ธ์ Button์ ๊ธฐ๋ณธ colorPalette์ variant๋ฅผ subtleํน์ surface๋ฅผ ์ฃผ์ด ๊ตฌํํ ์ ์์์ต๋๋ค.