Context 분리하기 강의 내용 중에 궁금한 것이 있습니다!
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를 이용한 상태 및 액션 분리와 관련된 사항은, 주로 컴포넌트 재렌더링과 성능 최적화를 고려할 때 발생합니다. 아래에서 자세히 설명드리겠습니다.
Context API에서 상태(State)와 디스패치(Dispatch) 분리
React에서 Context API를 활용하여 상태 관리 및 디스패치를 다룰 때, 상태와 디스패치를 분리하는 일반적인 이유는 다음과 같습니다:
최적화: 상태와 디스패치를 동일한 Context에 포함시키면, 상태가 변경될 때마다 모든 구독된 컴포넌트가 리렌더링됩니다. 이를 분리하면, 상태가 변경될 경우 상태에 연결된 컴포넌트만 리렌더링되고, 디스패치 액션은 영향을 받지 않게 할 수 있습니다.
구조적 설계: 상태와 디스패치를 서로 다른 목적에 맞게 관리할 수 있으며, 더 명확한 역할 분리를 통해 코드 유지보수가 용이해집니다.
리렌더링 제어: 디스패치 Context는 주로 함수를 제공하기 때문에, 상태 변경에 따른 불필요한 리렌더링을 줄일 수 있습니다.
TodoStateContext와 TodoDispatchContext의 구성
당신이 언급하신 대로, TodoStateContext와 TodoDispatchContext가 형제 관계로 존재한다면, 기술적으로는 문제 없습니다. 그러나 Context의 배치와 관련된 최적화 문제를 해결하려면 다음을 고려해야 합니다:
- Provider의 위치: Context Provider의 위치는 해당 Context를 어느 컴포넌트들이 사용하는가에 따라 달라질 수 있습니다.
App계층 구조에서 형제로 나란히 존재하더라도, 이를 사용하는 컴포넌트들이 서로 Context의 데이터 혹은 함수를 효율적으로 활용할 수 있으면 됩니다.
다시 말해 TodoDispatchContext가 TodoStateContext에 영향을 받지 않는 구조라면, 형제 관계에서도 문제없이 작동할 수 있습니다. 그러나 사용 방식에 따라 다르므로, 아래 참고자료들을 활용하여 좀 더 심도 있게 분석해보시는 것이 좋습니다:
유사한 질문들
- “data와 onCreate, onRemove, onEdit 을 같은 context에서 전달하면 안되는 이유”: Context의 효율적 분리를 통한 데이터 및 액션 전달의 최적화에 대한 논의입니다.
- “일기 관리 기능 구현하기2 강의 질문”: 상태와 액션의 분리에 따른 성능 최적화 전략을 논의합니다.
이 설명이 도움이 되길 바라며, 추가적인 질문이 있으시면 언제든지 말씀해 주세요. 곧 지식공유자께서 더욱 상세한 답변을 제공해 주실 것입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
useEffect와 lifecycle문의
0
28
2
프론트엔드 학습 수준 문의
0
39
2
리액트 챕터별 코드에서 eslint 설정파일이 없어요
0
48
2
데이터 로딩중 화면만 계속 나와요!!
0
55
2
퍼블리셔일경우 어느정도 수준까지 강의를 들어야할까요
0
79
2
이후의 커리큘럼 문의
0
102
2
실슬환경 설정에서 save후 console.log 부분이 새로고침이 안되는현상입니다.
0
50
2
최적화 관련 질문있습니다 (useMemo 등)
0
84
3
프로바이더 컴포넌트의 위치는 어떤 기준인가요?
1
82
3
Date 객체에 관련하여 질문드립니다.
0
85
2
리액트 개정판 교재 질문
0
60
2
예제코드가 안나와요!
0
78
2
select a variant 선택에서 javascript와 javascript+react compiler 중 무엇을 선택해야하나요? com
0
108
2
onMouseEnter 관련 문의 드립니다
0
92
3
배열의 렌더링 관련 질문 드립니다.
0
73
2
2:40초 refObj를 콘솔로 출력시 오류가 발생합니다.
0
113
2
TS, 리액트 강의중에 뭘 먼저 수강하는게 좋을까요?
0
137
2
useCallback 적용한 onCreate, onUpdate, onDelete 함수..
0
70
1
vs code 자동완성관련 문의
0
113
2
91강 useEffect내에서 상태변화함수 호출시 발생하는 에러
1
179
2
87강 필터 함수 질문
0
69
2
useRef, useState count 비교
0
67
2
안된다고했던 이유가 무엇이었는지 모르겠습니다
0
90
2
85강에서 객체를 왜 클래스로 만들어서 new 하지 않는건지 궁금합니다.
0
75
2





