인프런 커뮤니티 질문&답변

학운학운님의 프로필 이미지
학운학운

작성한 질문수

[2024] 한입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지

11.1) Context란

Context 질문드립니다.

작성

·

281

2

안녕하세요 선생님.

 

질문이 있어요.

 

그전까지는 이해가 되었는데 Context강의가 유독 어렵네요...

 

먼저 DiaryStateContext.Provider의 value로 {data, onCreate, onRemove} 이렇게 넣으면 prop이 바뀌면 재생성된다는 것이 이해가 안되요. onCreate랑 onRemove는 useCallback으로 재생성 되는 것을 막아 놓은 것 아니었나요? 헷갈리네요.

 

두번째로 중첩으로 하는 이유가 잘 이해가 안 됩니다. 왜 중첩으로 하면 이게 해결이 될까요? 어차피 memoizedDispatches로 useMemo를 썼으면 그냥 DiaryStateContext.Provider에 value로 넣으면 안되는 건가요. 중첩으로 하는 이유가 잘 납득이 안됩니다. DiaryStateContext.Provieder value={data, memoizedDispatches} 이렇게 하면 안되나요? 그리고 useMemo로 묶는 부분도 다시 한번 설명해주실 수 있나요? useCallback으로 막아놨는데 왜 useMemo로 다시 묶어야 할까요 그냥 onCreate, onRemove, onEdit을 묶지 말고 따로따로 DiaryStateContext.Provider의 value로 {data, onCreate, onRemove} 이렇게 보내주면 안될까요?

 

강의를 두번 반복했는데도 잘 이해가 안되네요.. 

답변 2

1

이정환 Winterlood님의 프로필 이미지
이정환 Winterlood
지식공유자

안녕하세요

이정환입니다.

질문이 3가지로 보이는데요 나누어서 설명 해 드리겠습니다 😃

질문 1.

먼저 DiaryStateContext.Provider의 value로 {data, onCreate, onRemove} 이렇게 넣으면 prop이 바뀌면 재생성된다는 것이 이해가 안되요. onCreate랑 onRemove는 useCallback으로 재생성 되는 것을 막아 놓은 것 아니었나요? 헷갈리네요.

먼저 DiaryStateContext.Provider에 value로 {data, onCreate, onRemove, onEdit}처럼 함수와 data를 함께 묶은 '객체'를 전달하게 되면 data의 값이 변경될 때 이 '객체' 자체가 다시 생성되게 됩니다. 이에 따라 함수는 재 생성되지 않지만 DiaryStateContext.Provider에게 전달되는 value가 재 생성되기 때문에 리렌더가 발생하게 됩니다.


질문 2.

두번째로 중첩으로 하는 이유가 잘 이해가 안 됩니다. 왜 중첩으로 하면 이게 해결이 될까요? 어차피 memoizedDispatches로 useMemo를 썼으면 그냥 DiaryStateContext.Provider에 value로 넣으면 안되는 건가요. 중첩으로 하는 이유가 잘 납득이 안됩니다. DiaryStateContext.Provieder value={data, memoizedDispatches} 이렇게 하면 안되나요?

여기서의 요점은 Context를 분리하는데에 있습니다.

memoizedDispatch는 말씀하신대로 useMemo로 래핑된 값이기에 재 생성되지 않습니다.

그러나 DiaryStateContext.Provider에게 value로 전달되는 객체가 재 생성됩니다. 왜냐면 data가 바뀌기 때문이지요 따라서 재 생성되지 않는 함수들은 아예 DiaryDispatchContext.Provider로 분리하여 전달하는 것 입니다.

질문 3.

그리고 useMemo로 묶는 부분도 다시 한번 설명해주실 수 있나요? useCallback으로 막아놨는데 왜 useMemo로 다시 묶어야 할까요 그냥 onCreate, onRemove, onEdit을 묶지 말고 따로따로 DiaryStateContext.Provider의 value로 {data, onCreate, onRemove} 이렇게 보내주면 안될까요?

useMemo로 묶는 이유는 객체를 재 생성하지 않기 위함입니다.

DiaryDispatchContext.Provider에게 value로 전달하는 객체에 담기는 함수들이 useCallback으로 재 생성되지 않도록 만들어졌다고 해도 data State가 변하는 순간 App 컴포넌트가 리렌더되어 DiaryDispatchContext.Provider에게 전달하는 객체 자체가 재 생성됩니다.

따라서 객체 자체도 재 생성하지 않게 하기 위해 useMemo를 사용한 것 입니다.

이해가 안되는 부분이 있다면 질문 추가로 더 부탁드립니다

감사합니다.

0

안녕하세요! 강의를 보다가 같은 부분에서 질문이 생겨 답글 남깁니다! 위에서 말씀하신 것처럼 DiaryStateContext 컨테이너의 Props인 data가 변경되면 하위 컨테이너들이 모두 리렌더 되는 것 아닌가요?

아니면 <DiaryStateContext.Provider value={data}>

<Provider/>의 value에 객체가 아닌 단수 개의 인자(ex. data)만 전달되면 그 값(data)이 새롭게 갱신되어도 리렌더되지 않는 기능이라도 있는 것인가요?

학운학운님의 프로필 이미지
학운학운

작성한 질문수

질문하기