React์ ๋ณตํฉ ์ปดํฌ๋ํธ ํจํด์ ๋ง์คํฐํ์ฌ ์ ์ฐํ๊ณ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๋ฉฐ ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ด ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌ์ถํ์ธ์. ๊ฐ๋ ฅํ ์ปดํฌ๋ํธ API๋ฅผ ๋ง๋๋ ์ค์ฉ์ ์ธ ์์ ์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ดํด๋ด ๋๋ค.
React ๋ณตํฉ ์ปดํฌ๋ํธ: ์ ์ฐํ๊ณ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ API ๋ง๋ค๊ธฐ
React ๊ฐ๋ฐ์ ์ธ๊ณ์์๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๊ณ ์ ์ฐํ ์ปดํฌ๋ํธ๋ฅผ ๊ตฌ์ถํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ค์ํฉ๋๋ค. ์ด๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ ๊ฐ๋ ฅํ ํจํด ์ค ํ๋๊ฐ ๋ฐ๋ก ๋ณตํฉ ์ปดํฌ๋ํธ(Compound Component) ํจํด์ ๋๋ค. ์ด ํจํด์ ์ฌ์ฉํ๋ฉด ์์์ ์ผ๋ก ์ํ์ ๋์์ ๊ณต์ ํ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค ์ ์์ด, ์ฌ์ฉ์์๊ฒ ๋ ์ ์ธ์ ์ด๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ด API๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค. ์ด ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์์๋ ๋ณตํฉ ์ปดํฌ๋ํธ์ ๋ณต์ก์ฑ์ ํํค์น๊ณ , ๊ทธ ์ด์ , ๊ตฌํ ๋ฐฉ๋ฒ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๋ณตํฉ ์ปดํฌ๋ํธ๋ ๋ฌด์์ธ๊ฐ?
๋ณตํฉ ์ปดํฌ๋ํธ๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ์์ ์ปดํฌ๋ํธ์ ์์์ ์ผ๋ก ์ํ ๋ฐ ๋ก์ง์ ๊ณต์ ํ๋ ํจํด์ ๋๋ค. ๊ฐ ์์์๊ฒ ๋ช ์์ ์ผ๋ก props๋ฅผ ์ ๋ฌํ๋ ๋์ , ๋ถ๋ชจ๊ฐ ์ค์ ์กฐ์ ์ ์ญํ ์ ํ์ฌ ๊ณต์ ์ํ๋ฅผ ๊ด๋ฆฌํ๊ณ ์ปจํ ์คํธ๋ ๋ค๋ฅธ ๋ฉ์ปค๋์ฆ์ ํตํด ์ ๊ทผ์ ์ ๊ณตํฉ๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ์์ ์ปดํฌ๋ํธ๋ค์ด ๋ถ๋ชจ์ ๋ช ์์ ์ธ ๋ชจ๋ ์ํธ์์ฉ ์กฐ์จ ์์ด ์๋ก ์ํธ์์ฉํ ์ ์๊ฒ ํ์ฌ, ๋ ์์ง๋ ฅ ์๊ณ ์ฌ์ฉ์ ์นํ์ ์ธ API๋ฅผ ๋ง๋ญ๋๋ค.
Tabs
์ปดํฌ๋ํธ๋ฅผ ์์ํด ๋ณด์ธ์. ์ฌ์ฉ์๊ฐ ์ด๋ค ํญ์ด ํ์ฑ ์ํ์ธ์ง ์๋์ผ๋ก ๊ด๋ฆฌํ๊ณ ๊ทธ ์ ๋ณด๋ฅผ ๊ฐ Tab
์ปดํฌ๋ํธ์ ์ ๋ฌํ๋๋ก ๊ฐ์ํ๋ ๋์ , ๋ณตํฉ Tabs
์ปดํฌ๋ํธ๋ ๋ด๋ถ์ ์ผ๋ก ํ์ฑ ์ํ๋ฅผ ์ฒ๋ฆฌํ๊ณ ๊ฐ Tab
์ปดํฌ๋ํธ๊ฐ ์์ ์ ๋ชฉ์ ๊ณผ ๋ด์ฉ๋ง ์ ์ธํ๋๋ก ํฉ๋๋ค. Tabs
์ปดํฌ๋ํธ๊ฐ ์ ์ฒด ์ํ๋ฅผ ๊ด๋ฆฌํ๊ณ ๊ทธ์ ๋ฐ๋ผ UI๋ฅผ ์
๋ฐ์ดํธํฉ๋๋ค.
๋ณตํฉ ์ปดํฌ๋ํธ ์ฌ์ฉ์ ์ด์
- ํฅ์๋ ์ฌ์ฌ์ฉ์ฑ: ๋ณตํฉ ์ปดํฌ๋ํธ๋ ๋ณต์กํ ๋ก์ง์ ๋จ์ผ ์ปดํฌ๋ํธ ๋ด์ ์บก์ํํ๊ธฐ ๋๋ฌธ์ ์ฌ์ฌ์ฉ์ฑ์ด ๋งค์ฐ ๋์ต๋๋ค. ์ด๋ก ์ธํด ๋ก์ง์ ๋ค์ ์์ฑํ ํ์ ์์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค๋ฅธ ๋ถ๋ถ์์ ์ปดํฌ๋ํธ๋ฅผ ์ฝ๊ฒ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ๊ฐํ๋ ์ ์ฐ์ฑ: ์ด ํจํด์ ์ปดํฌ๋ํธ ์ฌ์ฉ ๋ฐฉ์์ ๋ ํฐ ์ ์ฐ์ฑ์ ์ ๊ณตํฉ๋๋ค. ๊ฐ๋ฐ์๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ์ ์ฝ๋๋ฅผ ์์ ํ ํ์ ์์ด ์์ ์ปดํฌ๋ํธ์ ๋ชจ์๊ณผ ๋์์ ์ฝ๊ฒ ์ฌ์ฉ์ ์ ์ํ ์ ์์ต๋๋ค.
- ์ ์ธ์ API: ๋ณตํฉ ์ปดํฌ๋ํธ๋ ๋ ์ ์ธ์ ์ธ API๋ฅผ ์ด์งํฉ๋๋ค. ์ฌ์ฉ์๋ ์ด๋ป๊ฒ ๋ฌ์ฑํ ๊ฒ์ธ์ง๊ฐ ์๋๋ผ ๋ฌด์์ ๋ฌ์ฑํ๊ณ ์ถ์์ง์ ์ง์คํ ์ ์์ต๋๋ค. ์ด๋ ์ปดํฌ๋ํธ๋ฅผ ๋ ์ฝ๊ฒ ์ดํดํ๊ณ ์ฌ์ฉํ ์ ์๊ฒ ๋ง๋ญ๋๋ค.
- Prop Drilling ๊ฐ์: ๊ณต์ ์ํ๋ฅผ ๋ด๋ถ์ ์ผ๋ก ๊ด๋ฆฌํจ์ผ๋ก์จ ๋ณตํฉ ์ปดํฌ๋ํธ๋ ์ฌ๋ฌ ๊ณ์ธต์ ์ปดํฌ๋ํธ๋ฅผ ํตํด props๋ฅผ ์ ๋ฌํ๋ prop drilling์ ํ์์ฑ์ ์ค์ฌ์ค๋๋ค. ์ด๋ ์ปดํฌ๋ํธ ๊ตฌ์กฐ๋ฅผ ๋จ์ํํ๊ณ ์ ์ง๋ณด์๋ฅผ ๋ ์ฝ๊ฒ ๋ง๋ญ๋๋ค.
- ํฅ์๋ ์ ์ง๋ณด์์ฑ: ๋ถ๋ชจ ์ปดํฌ๋ํธ ๋ด์ ๋ก์ง๊ณผ ์ํ๋ฅผ ์บก์ํํ๋ฉด ์ฝ๋์ ์ ์ง๋ณด์์ฑ์ด ํฅ์๋ฉ๋๋ค. ์ปดํฌ๋ํธ์ ๋ด๋ถ ์๋ ๋ฐฉ์ ๋ณ๊ฒฝ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค๋ฅธ ๋ถ๋ถ์ ์ํฅ์ ๋ฏธ์น ๊ฐ๋ฅ์ฑ์ด ์ค์ด๋ญ๋๋ค.
React์์ ๋ณตํฉ ์ปดํฌ๋ํธ ๊ตฌํํ๊ธฐ
React์์ ๋ณตํฉ ์ปดํฌ๋ํธ ํจํด์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์๋ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ต๋๋ค. ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ React Context๋ React.cloneElement๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค.
React Context ์ฌ์ฉํ๊ธฐ
React Context๋ ํธ๋ฆฌ์ ๋ชจ๋ ๋ ๋ฒจ์ ํตํด ๋ช ์์ ์ผ๋ก prop์ ์ ๋ฌํ์ง ์๊ณ ๋ ์ปดํฌ๋ํธ ๊ฐ์ ๊ฐ์ ๊ณต์ ํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ ๋ณตํฉ ์ปดํฌ๋ํธ๋ฅผ ๊ตฌํํ๋ ๋ฐ ์ด์์ ์ธ ์ ํ์ ๋๋ค.
๋ค์์ React Context๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํ๋ Toggle
์ปดํฌ๋ํธ์ ๊ธฐ๋ณธ ์์ ์
๋๋ค:
import React, { createContext, useContext, useState, useCallback } from 'react';
const ToggleContext = createContext();
function Toggle({ children }) {
const [on, setOn] = useState(false);
const toggle = useCallback(() => {
setOn(prevOn => !prevOn);
}, []);
const value = { on, toggle };
return (
{children}
);
}
function ToggleOn({ children }) {
const { on } = useContext(ToggleContext);
return on ? children : null;
}
function ToggleOff({ children }) {
const { on } = useContext(ToggleContext);
return on ? null : children;
}
function ToggleButton() {
const { on, toggle } = useContext(ToggleContext);
return ;
}
Toggle.On = ToggleOn;
Toggle.Off = ToggleOff;
Toggle.Button = ToggleButton;
export default Toggle;
// Usage
function App() {
return (
The button is on
The button is off
);
}
export default App;
์ด ์์ ์์ Toggle
์ปดํฌ๋ํธ๋ ToggleContext
๋ผ๋ ์ปจํ
์คํธ๋ฅผ ์์ฑํฉ๋๋ค. ์ํ(on
)์ ํ ๊ธ ํจ์(toggle
)๊ฐ ์ปจํ
์คํธ๋ฅผ ํตํด ์ ๊ณต๋ฉ๋๋ค. Toggle.On
, Toggle.Off
, Toggle.Button
์ปดํฌ๋ํธ๋ ์ด ์ปจํ
์คํธ๋ฅผ ์๋นํ์ฌ ๊ณต์ ๋ ์ํ์ ๋ก์ง์ ์ ๊ทผํฉ๋๋ค.
React.cloneElement ์ฌ์ฉํ๊ธฐ
React.cloneElement
๋ ๊ธฐ์กด ์๋ฆฌ๋จผํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๋ก์ด React ์๋ฆฌ๋จผํธ๋ฅผ ์์ฑํ๋ฉด์ props๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์์ ํ ์ ์๊ฒ ํด์ค๋๋ค. ์ด๋ ๊ณต์ ์ํ๋ฅผ ์์ ์ปดํฌ๋ํธ๋ก ์ ๋ฌํ๋ ๋ฐ ์ ์ฉํ ์ ์์ต๋๋ค.
React Context๊ฐ ์ผ๋ฐ์ ์ผ๋ก ๋ณต์กํ ์ํ ๊ด๋ฆฌ์ ์ ํธ๋์ง๋ง, React.cloneElement
๋ ๋ ๊ฐ๋จํ ์๋๋ฆฌ์ค๋ ์์์๊ฒ ์ ๋ฌ๋๋ props๋ฅผ ๋ ์ธ๋ฐํ๊ฒ ์ ์ดํด์ผ ํ ๋ ์ ํฉํ ์ ์์ต๋๋ค.
๋ค์์ React.cloneElement
๋ฅผ ์ฌ์ฉํ ์์ ์
๋๋ค(๋ณดํต์ ์ปจํ
์คํธ๊ฐ ๋ ๋์ ์ ํ์
๋๋ค):
import React, { useState } from 'react';
function Accordion({ children }) {
const [activeIndex, setActiveIndex] = useState(null);
const handleClick = (index) => {
setActiveIndex(activeIndex === index ? null : index);
};
return (
{React.Children.map(children, (child, index) => {
return React.cloneElement(child, {
index,
isActive: activeIndex === index,
onClick: () => handleClick(index),
});
})}
);
}
function AccordionItem({ children, index, isActive, onClick }) {
return (
{isActive && {children}}
);
}
Accordion.Item = AccordionItem;
function App() {
return (
This is the content of section 1.
This is the content of section 2.
This is the content of section 3.
);
}
export default App;
์ด Accordion
์์ ์์ ๋ถ๋ชจ ์ปดํฌ๋ํธ๋ React.Children.map
์ ์ฌ์ฉํ์ฌ ์์๋ค์ ์ํํ๊ณ ์ถ๊ฐ์ ์ธ props(index
, isActive
, onClick
)์ ํจ๊ป ๊ฐ ์์ ์๋ฆฌ๋จผํธ๋ฅผ ๋ณต์ ํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ถ๋ชจ๋ ์์๋ค์ ์ํ์ ๋์์ ์์์ ์ผ๋ก ์ ์ดํ ์ ์์ต๋๋ค.
๋ณตํฉ ์ปดํฌ๋ํธ ๊ตฌ์ถ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
- ์ํ ๊ด๋ฆฌ๋ฅผ ์ํด React Context ์ฌ์ฉํ๊ธฐ: React Context๋ ํนํ ๋ ๋ณต์กํ ์๋๋ฆฌ์ค์์ ๋ณตํฉ ์ปดํฌ๋ํธ์ ๊ณต์ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐ ์ ํธ๋๋ ๋ฐฉ๋ฒ์ ๋๋ค.
- ๋ช ํํ๊ณ ๊ฐ๊ฒฐํ API ์ ๊ณตํ๊ธฐ: ๋ณตํฉ ์ปดํฌ๋ํธ์ API๋ ์ดํดํ๊ณ ์ฌ์ฉํ๊ธฐ ์ฌ์์ผ ํฉ๋๋ค. ๊ฐ ์์ ์ปดํฌ๋ํธ์ ๋ชฉ์ ์ด ๋ช ํํ๊ณ ๊ทธ๋ค ๊ฐ์ ์ํธ์์ฉ์ด ์ง๊ด์ ์ธ์ง ํ์ธํ์ธ์.
- ์ปดํฌ๋ํธ ์์ธํ ๋ฌธ์ํํ๊ธฐ: ๋ณตํฉ ์ปดํฌ๋ํธ์ ๋ํ ๋ช ํํ ๋ฌธ์๋ฅผ ์ ๊ณตํ์ธ์. ์ฌ์ฉ ๋ฐฉ๋ฒ ์์์ ๋ค์ํ ์์ ์ปดํฌ๋ํธ์ ๋ํ ์ค๋ช ์ ํฌํจํด์ผ ํฉ๋๋ค. ์ด๋ ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์ด ์ปดํฌ๋ํธ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ดํดํ๊ณ ์ฌ์ฉํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
- ์ ๊ทผ์ฑ ๊ณ ๋ คํ๊ธฐ: ๋ณตํฉ ์ปดํฌ๋ํธ๊ฐ ์ฅ์ ๊ฐ ์๋ ์ฌ์ฉ์๋ฅผ ํฌํจํ ๋ชจ๋ ์ฌ์ฉ์์๊ฒ ์ ๊ทผ ๊ฐ๋ฅํ๋๋ก ํ์ธ์. ARIA ์์ฑ๊ณผ ์๋งจํฑ HTML์ ์ฌ์ฉํ์ฌ ๋ชจ๋์๊ฒ ์ข์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ์ธ์.
- ์ปดํฌ๋ํธ ์ฒ ์ ํ ํ ์คํธํ๊ธฐ: ๋จ์ ํ ์คํธ์ ํตํฉ ํ ์คํธ๋ฅผ ์์ฑํ์ฌ ๋ณตํฉ ์ปดํฌ๋ํธ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๊ณ ์์ ์ปดํฌ๋ํธ ๊ฐ์ ๋ชจ๋ ์ํธ์์ฉ์ด ์์๋๋ก ๊ธฐ๋ฅํ๋์ง ํ์ธํ์ธ์.
- ๊ณผ๋ํ ๋ณต์ก์ฑ ํผํ๊ธฐ: ๋ณตํฉ ์ปดํฌ๋ํธ๋ ๊ฐ๋ ฅํ ์ ์์ง๋ง, ์ง๋์น๊ฒ ๋ณต์กํ๊ฒ ๋ง๋ค์ง ๋ง์ธ์. ๋ก์ง์ด ๋๋ฌด ๋ณต์กํด์ง๋ฉด ๋ ์๊ณ ๊ด๋ฆฌํ๊ธฐ ์ฌ์ด ์ปดํฌ๋ํธ๋ก ๋๋๋ ๊ฒ์ ๊ณ ๋ คํ์ธ์.
- TypeScript ์ฌ์ฉํ๊ธฐ (์ ํ ์ฌํญ์ด์ง๋ง ๊ถ์ฅ): TypeScript๋ ์ค๋ฅ๋ฅผ ์กฐ๊ธฐ์ ๋ฐ๊ฒฌํ๊ณ ๋ณตํฉ ์ปดํฌ๋ํธ์ ์ ์ง๋ณด์์ฑ์ ํฅ์์ํค๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. ์ปดํฌ๋ํธ์ props์ ์ํ์ ๋ํ ๋ช ํํ ํ์ ์ ์ ์ํ์ฌ ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉ๋๋๋ก ํ์ธ์.
์ค์ ์ ํ๋ฆฌ์ผ์ด์ ์์์ ๋ณตํฉ ์ปดํฌ๋ํธ ์์
๋ณตํฉ ์ปดํฌ๋ํธ ํจํด์ ๋ง์ ์ธ๊ธฐ ์๋ React ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋๋ฆฌ ์ฌ์ฉ๋ฉ๋๋ค. ๋ช ๊ฐ์ง ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- React Router: React Router๋ ๋ณตํฉ ์ปดํฌ๋ํธ ํจํด์ ๊ด๋ฒ์ํ๊ฒ ์ฌ์ฉํฉ๋๋ค.
<BrowserRouter>
,<Route>
,<Link>
์ปดํฌ๋ํธ๊ฐ ํจ๊ป ์๋ํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ ์ธ์ ๋ผ์ฐํ ์ ์ ๊ณตํฉ๋๋ค. - Formik: Formik์ React์์ ํผ์ ๊ตฌ์ถํ๊ธฐ ์ํ ์ธ๊ธฐ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์
๋๋ค. ํผ ์ํ ๋ฐ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด ๋ณตํฉ ์ปดํฌ๋ํธ ํจํด์ ์ฌ์ฉํฉ๋๋ค.
<Formik>
,<Form>
,<Field>
์ปดํฌ๋ํธ๊ฐ ํจ๊ป ์๋ํ์ฌ ํผ ๊ฐ๋ฐ์ ๋จ์ํํฉ๋๋ค. - Reach UI: Reach UI๋ ์ ๊ทผ์ฑ ๋์ UI ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์
๋๋ค.
<Dialog>
๋<Menu>
์ปดํฌ๋ํธ์ ๊ฐ์ ๋ง์ ์ปดํฌ๋ํธ๋ค์ด ๋ณตํฉ ์ปดํฌ๋ํธ ํจํด์ ์ฌ์ฉํ์ฌ ๊ตฌํ๋์์ต๋๋ค.
๊ตญ์ ํ(i18n) ๊ณ ๋ ค์ฌํญ
์ ์ธ๊ณ ์ฌ์ฉ์๋ฅผ ์ํ ๋ณตํฉ ์ปดํฌ๋ํธ๋ฅผ ๊ตฌ์ถํ ๋๋ ๊ตญ์ ํ(i18n)๋ฅผ ๊ณ ๋ คํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๋ค์์ ์ ๋ ํด์ผ ํ ๋ช ๊ฐ์ง ํต์ฌ ์ฌํญ์ ๋๋ค:
- ํ
์คํธ ๋ฐฉํฅ(RTL/LTR): ์ปดํฌ๋ํธ๊ฐ ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ(LTR)๊ณผ ์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ(RTL) ํ
์คํธ ๋ฐฉํฅ์ ๋ชจ๋ ์ง์ํ๋์ง ํ์ธํ์ธ์.
direction
๋ฐunicode-bidi
์ ๊ฐ์ CSS ์์ฑ์ ์ฌ์ฉํ์ฌ ํ ์คํธ ๋ฐฉํฅ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํ์ธ์. - ๋ ์ง ๋ฐ ์๊ฐ ํ์: ์ฌ์ฉ์์ ๋ก์ผ์ผ์ ๋ฐ๋ผ ๋ ์ง์ ์๊ฐ ํ์์ ์ง์ ํ๋ ค๋ฉด
Intl
์ด๋date-fns
์ ๊ฐ์ ๊ตญ์ ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ธ์. - ์ซ์ ํ์: ๊ตญ์ ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ํตํ ๊ธฐํธ, ์์์ ๊ตฌ๋ถ ๊ธฐํธ, ์ฒ ๋จ์ ๊ตฌ๋ถ ๊ธฐํธ๋ฅผ ํฌํจํ์ฌ ์ฌ์ฉ์์ ๋ก์ผ์ผ์ ๋ฐ๋ผ ์ซ์๋ฅผ ํ์ํํ์ธ์.
- ํตํ ์ฒ๋ฆฌ: ํตํ๋ฅผ ๋ค๋ฃฐ ๋, ์ฌ์ฉ์์ ์์น์ ๋ฐ๋ผ ๋ค๋ฅธ ํตํ ๊ธฐํธ, ํ์จ ๋ฐ ์์ ๊ท์น์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค. ์: ์ ๋ก ํ์ํ๋ฅผ ์ํด `new Intl.NumberFormat('de-DE', { style: 'currency', currency: 'EUR' }).format(amount);`
- ์ธ์ด๋ณ ๊ณ ๋ ค์ฌํญ: ๋ณต์ํ ๊ท์น์ด๋ ๋ฌธ๋ฒ ๊ตฌ์กฐ์ ๊ฐ์ ์ธ์ด๋ณ ๊ณ ๋ ค์ฌํญ์ ์ธ์งํ์ธ์.
- ๋ค๋ฅธ ์ธ์ด์ ๋ํ ์ ๊ทผ์ฑ: ์คํฌ๋ฆฐ ๋ฆฌ๋๋ ์ธ์ด์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ์๋ํ ์ ์์ต๋๋ค. ์ฌ์ฉ๋๋ ์ธ์ด์ ๊ด๊ณ์์ด ์ปดํฌ๋ํธ๊ฐ ์ ๊ทผ์ฑ์ ์ ์งํ๋๋ก ํ์ธ์.
- ์์ฑ์ ํ์งํ:
aria-label
์ด๋title
๊ณผ ๊ฐ์ ์์ฑ์ ์ฌ์ฉ์์๊ฒ ์ฌ๋ฐ๋ฅธ ๋งฅ๋ฝ์ ์ ๊ณตํ๊ธฐ ์ํด ํ์งํ๊ฐ ํ์ํ ์ ์์ต๋๋ค.
์ผ๋ฐ์ ์ธ ํจ์ ๊ณผ ์ด๋ฅผ ํผํ๋ ๋ฐฉ๋ฒ
- ๊ณผ๋ํ ์์ง๋์ด๋ง: ๊ฐ๋จํ ๊ฒฝ์ฐ์๋ ๋ณตํฉ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ์ง ๋ง์ธ์. props๋ฅผ ์ฌ์ฉํ๋ ์ผ๋ฐ ์ปดํฌ๋ํธ๋ก ์ถฉ๋ถํ๋ค๋ฉด ๊ทธ ๋ฐฉ๋ฒ์ ๊ณ ์ํ์ธ์. ๋ณตํฉ ์ปดํฌ๋ํธ๋ ๋ณต์ก์ฑ์ ๋ํฉ๋๋ค.
- ๊ฐํ ๊ฒฐํฉ: ์์ ์ปดํฌ๋ํธ๊ฐ ๋ถ๋ชจ์๊ฒ ์์ ํ ์์กดํ์ฌ ๋ ๋ฆฝ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ ๊ฐํ๊ฒ ๊ฒฐํฉ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์ง ๋ง์ธ์. ์ด๋ ์ ๋์ ๋ชจ๋์ฑ์ ๋ชฉํ๋ก ํ์ธ์.
- ์ฑ๋ฅ ๋ฌธ์ : ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ์์ฃผ ๋ฆฌ๋ ๋๋ง๋๋ฉด, ํนํ ์์ ์ปดํฌ๋ํธ๊ฐ ๋ณต์กํ ๊ฒฝ์ฐ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์์ต๋๋ค. ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํด ๋ฉ๋ชจ์ด์ ์ด์
๊ธฐ๋ฒ(
React.memo
,useMemo
,useCallback
)์ ์ฌ์ฉํ์ธ์. - ๋ช ํํ ์ํต์ ๋ถ์ฌ: ์ ์ ํ ๋ฌธ์์ ๋ช ํํ API ์์ด๋ ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์ด ๋ณตํฉ ์ปดํฌ๋ํธ๋ฅผ ์ดํดํ๊ณ ์ฌ์ฉํ๋ ๋ฐ ์ด๋ ค์์ ๊ฒช์ ์ ์์ต๋๋ค. ์ข์ ๋ฌธ์ํ์ ํฌ์ํ์ธ์.
- ์ฃ์ง ์ผ์ด์ค ๋ฌด์: ๊ฐ๋ฅํ ๋ชจ๋ ์ฃ์ง ์ผ์ด์ค๋ฅผ ๊ณ ๋ คํ๊ณ ์ปดํฌ๋ํธ๊ฐ ์ด๋ฅผ ์ฐ์ํ๊ฒ ์ฒ๋ฆฌํ๋๋ก ํ์ธ์. ์ฌ๊ธฐ์๋ ์ค๋ฅ ์ฒ๋ฆฌ, ๋น ์ํ, ์๊ธฐ์น ์์ ์ฌ์ฉ์ ์ ๋ ฅ์ด ํฌํจ๋ฉ๋๋ค.
๊ฒฐ๋ก
๋ณตํฉ ์ปดํฌ๋ํธ ํจํด์ React์์ ์ ์ฐํ๊ณ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๋ฉฐ ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ด ์ปดํฌ๋ํธ๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ํ ๊ฐ๋ ฅํ ๊ธฐ์ ์ ๋๋ค. ์ด ํจํด์ ์์น์ ์ดํดํ๊ณ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ฉด ์ฌ์ฉํ๊ธฐ ์ฝ๊ณ ํ์ฅํ๊ธฐ ์ข์ ์ปดํฌ๋ํธ API๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ์ ์ธ๊ณ ์ฌ์ฉ์๋ฅผ ์ํ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ๋ฐํ ๋๋ ๊ตญ์ ํ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๊ณ ๋ คํ๋ ๊ฒ์ ์์ง ๋ง์ธ์. ์ด ํจํด์ ์ฑํํจ์ผ๋ก์จ React ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์ง๊ณผ ์ ์ง๋ณด์์ฑ์ ํฌ๊ฒ ํฅ์์ํค๊ณ ํ์ ๋ ๋์ ๊ฐ๋ฐ์ ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
๊ฐ ์ ๊ทผ ๋ฐฉ์์ ์ฅ๋จ์ ์ ์ ์คํ๊ฒ ๊ณ ๋ คํ๊ณ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ฉด, ๋ณตํฉ ์ปดํฌ๋ํธ์ ํ์ ํ์ฉํ์ฌ ๋ ๊ฒฌ๊ณ ํ๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ด React ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์์ต๋๋ค.