해결된 질문
작성
·
127
·
수정됨
0
Context 분리하기 강의 중 3분 55초에 나오는 컴포넌트의 계층 구조 표를 보면,
기존의 Context를 TodoStateContext와 TodoDispatchContext로 분리하면서 TodoDispatchContext가 TodoStateContext의 하위에 존재하는 것을 봤는데요,
이 부분에서 의문이 생긴 것이 TodoStateContext와 TodoDispatchContext가 형제 위치에 존재하면 안되는걸까요..?
제 생각에는 TodoDispatchContext가 하위에 존재하지 않고 StateContext와 형제 위치에 있다면 DispatchContext가 todos에 영향을 받지 않아 리랜더링도 발생하지 않을 것 같은데,
해당 방법이 안되는 이유가 있을까요?
답변 2
2
안녕하세요 🙂 정환님이 휴가를 가셔서, 제가 대신 답변드립니다!!
React에서 'StateContext.Provider'
와 'DispatchContext.Provider'
가 무조건 부모-자식 관계일 필요는 없습니다. 일반적으로는 StateContext.Provider
가 바깥에, 그리고 그 안에 DispatchContext.Provider
를 중첩해서 사용하는데요, 형제 위치에 배치하고 싶다면 다음과 같이 작성해보시면 될 것 같습니다!
<StateContext.Provider value={state}>
<ComponentUsingState />
</StateContext.Provider>
<DispatchContext.Provider value={dispatch}>
<ComponentUsingDispatch />
</DispatchContext.Provider>
다만, 위와 같이 작성하게 되면 ComponentUsingState
컴포넌트는 DispatchContextProvider
에 접근할 수 없고, ComponentUsingDispatch
컴포넌트는 StateContextProvider
에 접근할 수 없다는 단점이 있으니, 프로젝트에 알맞게 작성해주시면 될 것 같습니다 🙂
1
안녕하세요, 인프런 AI 인턴입니다. lny1203님!
질문에서 언급하신 Context API를 이용한 상태 및 액션 분리와 관련된 사항은, 주로 컴포넌트 재렌더링과 성능 최적화를 고려할 때 발생합니다. 아래에서 자세히 설명드리겠습니다.
React에서 Context API를 활용하여 상태 관리 및 디스패치를 다룰 때, 상태와 디스패치를 분리하는 일반적인 이유는 다음과 같습니다:
최적화: 상태와 디스패치를 동일한 Context에 포함시키면, 상태가 변경될 때마다 모든 구독된 컴포넌트가 리렌더링됩니다. 이를 분리하면, 상태가 변경될 경우 상태에 연결된 컴포넌트만 리렌더링되고, 디스패치 액션은 영향을 받지 않게 할 수 있습니다.
구조적 설계: 상태와 디스패치를 서로 다른 목적에 맞게 관리할 수 있으며, 더 명확한 역할 분리를 통해 코드 유지보수가 용이해집니다.
리렌더링 제어: 디스패치 Context는 주로 함수를 제공하기 때문에, 상태 변경에 따른 불필요한 리렌더링을 줄일 수 있습니다.
당신이 언급하신 대로, TodoStateContext
와 TodoDispatchContext
가 형제 관계로 존재한다면, 기술적으로는 문제 없습니다. 그러나 Context의 배치와 관련된 최적화 문제를 해결하려면 다음을 고려해야 합니다:
App
계층 구조에서 형제로 나란히 존재하더라도, 이를 사용하는 컴포넌트들이 서로 Context의 데이터 혹은 함수를 효율적으로 활용할 수 있으면 됩니다.다시 말해 TodoDispatchContext
가 TodoStateContext
에 영향을 받지 않는 구조라면, 형제 관계에서도 문제없이 작동할 수 있습니다. 그러나 사용 방식에 따라 다르므로, 아래 참고자료들을 활용하여 좀 더 심도 있게 분석해보시는 것이 좋습니다:
이 설명이 도움이 되길 바라며, 추가적인 질문이 있으시면 언제든지 말씀해 주세요. 곧 지식공유자께서 더욱 상세한 답변을 제공해 주실 것입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.