
useContext와 컴포넌트 역할 분리React 애플리케이션에서 컴포넌트 간의 데이터 전달과 상태 관리는 매우 중요한 요소입니다. 이를 효과적으로 관리하기 위해 컴포넌트의 역할을 명확하게 분리하고, 각 컴포넌트가 특정한 역할에 충실하도록 설계할 필요가 있습니다.
Form 컴포넌트 (TodoForm)
Provider)에 전달Provider 컴포넌트 (TodoProvider)
TodoContext.Provider를 통해 데이터를 공급Context 컴포넌트 (TodoContext)
Form 컴포넌트에서 데이터를 생성하고, Provider에 전달Provider는 받은 데이터를 그대로 받아 상태에 추가상태를 업데이트하는 함수는 단순한 작업만 수행
Form 컴포넌트에서 처리상태 관리 코드의 단순화로 다른 상황에서도 쉽게 재사용 가능
Provider는 상태 관리의 중심으로, 데이터를 가공하거나 처리하지 않음
Form 컴포넌트는 데이터 처리와 가공에 집중하여 다양한 입력 형태나 데이터 처리 로직에 대응 가능
위 개념을 바탕으로 Todo 관리 시스템의 구현을 살펴보겠습니다.
addTodos 함수에 전달const handleSubmit = (e) => {
e.preventDefault();
if (!newTodo.trim()) return; // 빈 입력 방지
const newTodoObj = {
id: crypto.randomUUID(),
text: newTodo,
completed: false,
};
addTodos(newTodoObj); // Provider에 정의된 addTodos 함수 호출
setNewTodo(""); // 입력 필드 초기화
};
addTodos 함수를 통해 새로운 Todo를 목록에 추가const addTodos = (newTodo) => {
setTodos([...todos, newTodo]); // 전달된 newTodo 객체를 상태에 추가
};
// 상태와 함수를 Provider로 공급
return (
<TodoContext.Provider value={{ todos, addTodos, toggleCompleted, handleDelete }}>
{children}
</TodoContext.Provider>
);
export const TodoContext = createContext({
todos: [],
addTodos: () => {},
toggleCompleted: () => {},
handleDelete: () => {},
});
이와 같은 컴포넌트 분리 및 역할 명확화는 다음과 같은 장점이 있습니다:
이 원칙은 Todo 관리 시스템뿐만 아니라 다양한 애플리케이션의 데이터 흐름과 상태 관리에 적용될 수 있습니다. Form 컴포넌트에서 데이터를 처리하고, Provider에서 상태로 관리함으로써, 컴포넌트의 역할이 명확해지고, 코드의 복잡도가 줄어들며, 확장 가능성이 높은 애플리케이션을 만들 수 있습니다. 이러한 접근 방식은 React의 기본적인 설계 철학에 부합하며, 다양한 프로젝트에서 유용하게 활용될 수 있습니다. 😊