React 컴포넌트를 만들 때 가장 고민되는 부분:
// 1. 여러 곳에서 재사용되는 Toast
function SomePage() {
// Toast를 여러 곳에서 각각 이렇게 만들어야 할까요?
const [isOpen, setIsOpen] = useState(false);
const closeToast = () => {
setTimeout(() => setIsOpen(false), 3000);
};
}
// 2. 여러 컴포넌트와 연결된 Tab
function TabPage() {
// Tab의 상태가 여러 컴포넌트에 영향을 미칩니다
const [currentTab, setCurrentTab] = useState('home');
// API 호출도 필요하고// URL도 변경해야 하고// 다른 컴포넌트도 업데이트해야 하고...
}
A. 내부 상태 관리가 좋은 경우
// ✅ 좋은 예: 내부 상태 관리
function Toast({ isOpen, message }) {
const [isVisible, setIsVisible] = useState(false);
useEffect(() => {
if (isOpen) {
setIsVisible(true);
const timer = setTimeout(() => setIsVisible(false), 3000);
return () => clearTimeout(timer);
}
}, [isOpen]);
return isVisible ? <div>{message}</div> : null;
}
// 사용하기 쉽습니다
<Toast message="성공!" />
이렇게 하면 좋은 점:
B. 외부 상태 관리가 좋은 경우
// ✅ 좋은 예: 외부 상태 관리
function Tab({ currentTab, onTabChange }) {
return (
<div>
{items.map(item => (
<button onClick={() => onTabChange(item.id)}>
{item.label}
</button>
))}
</div>
);
}
// 사용하는 쪽에서 필요한 모든 동작을 정의할 수 있어요
function ParentPage() {
const handleTabChange = async (tabId) => {
setCurrentTab(tabId);
await fetchData(tabId);
updateURL(tabId);
};
return <Tab onTabChange={handleTabChange} />;
}
이렇게 하면 좋은 점:
// 어디서 써도 같은 방식으로 동작하는 Toast
<Toast message="저장 완료!" />
<Toast message="오류 발생!" />
// 상황마다 다르게 동작하는 Alert
<Alert onConfirm={handleDelete} />// 삭제 확인
<Alert onConfirm={handleSave} />// 저장 확인
<Alert onConfirm={handleLogout} />// 로그아웃 확인
🌟 1. 내부 상태 관리 (Toast)
예시
👍 추가 이점
🌟 2. 외부 상태 관리 (Tab, Alert)
예시
👍 추가 이점
🤔 3. 추가 고려 사항
성능
사용 편의성
전역 상태 관리 도구
ToastManager
나 AlertProvider
를 만들어 전역적으로 상태 관리.💡 결론
적용 예시