리액트의 안정된 값에 대해 깊이 이해하기

쇼피파이 기술 블로그의 Mastering React’s Stable Values(https://shopify.engineering/master-reacts-stable-values)를 요약-번역한 글입니다. 저의 부연이 구별없이 섞여 있다는 것에 유의해주세요: --- "안정된 값"이란 여러 번의 렌더 동안 같은 값을 유지하는 값을 말합니다. 예를 들면 useState 에서 반환된 업데이트 함수, useRef에서 반환된 값, useCallback으로 감싸진 함수는 안정된 값이고, useMemo, useCallback 으로 감싸지지 않은 객체, 배열, 인라인 함수는 "불안정한 값"입니다. "불안정한 값"은 다르게 말하면 매 렌더마다 항상 변화하는 값입니다. useEffect, useCallback, useMemo는 의존성 배열이 어떻게 변화하는지에 따라 다르게 동작합니다. 의존성 배열이 매 렌더마다 항상 바뀐다면 원하지 않는 결과를 낳습니다. 리액트 요소를 반환하는 함수(사실상 컴포넌트와 같습니다)가 컴포넌트 내부에 useCallback 없이 인라인으로 정의되면, 이 함수는 불안정한 값입니다. 따라서 이 함수를 {renderSomething()}이 아닌 <renderSomething /> 처럼 호출하면, 리액트는 매 렌더마다 <Apple />과 <Orange /> 처럼 "전혀 다른" 컴포넌트로 <renderSomething />을 인식합니다. 따라서 리액트는 "매 렌더마다 항상" <renderSomething />의 모든 자식 컴포넌트를 지우고, 새 컴포넌트 트리를 처음부터 다시 만듭니다. 이 문제를 해결하는 방법은 renderSomething() 을 호출하는 것 말고도 반환되는 값을 useMemo 로 감싸는 것도 있지만, 컴포넌트를 useMemo 로 메모이제이션하는 것은 React.memo로 메모이제이션하는 것과 다르기 때문에(The mystery of React Element, children, parents and re-renders 아티클 참조. 댓글에 링크하겠습니다) 원하는 만큼의 렌더링 퍼포먼스를 얻지 못할 수도 있습니다. 쉽게 생각하기 위한 원칙은: 컴포넌트는 전역 공간에 존재해야 한다는 것입니다. 컴포넌트가 다른 컴포넌트의 바디에 정의되었을 때 좋을 게 없습니다. 왜냐하면 컴포넌트를 다른 컴포넌트 내에 정의했을 때, 매 렌더마다 항상 새로운 함수 개체가 생성되는데, 리액트는 이 새로운 개체가 이전 렌더의 개체와 어떤 공통점이라도 있는지(따라서 불필요한 렌더를 줄일 수 있는지)에 대해 어떤 짐작도 할 수 없기 때문입니다(따라서 최적화가 불가능합니다). --- * 여기서 언급된 모든 컴포넌트는 함수형 컴포넌트입니다. ** 한편 저자는 리액트 컴포넌트(리액트 요소를 반환하는 함수) 와 컴포넌트에서 반환된 리액트 요소를 혼용해서 사용하는 것으로 보입니만 우선 최대한 그대로 적었습니다.

Mastering React's Stable Values

Shopify

Mastering React's Stable Values

다음 내용이 궁금하다면?

또는

이미 회원이신가요?

2023년 7월 31일 오전 3:13

함께 읽은 게시물

🌎 해외에서 일하면 뭐가 좋을까요❓

외국어를 사용해서? 돈을 더 많이 벌어서? 새로운 기회가 많아서? 글로벌 경력을 쌓을 수 있어서?

... 더 보기

직장생활은 결국 윗사람과 아랫사람이 나뉠 수밖에 없다. 기업들이 아무리 평등한 관계를 추구한다고 해도, 고용인과 피고용인의 관계마저 사라지는 것은 아니다. 아무리 평등하다 해도 월급 주는 사장님이 을이 될 수는 없지 않은가? 아무리 작은 조직이라도 일을 맡기는 사람과 일을 하는 사람이 존재한다.

... 더 보기

리더 입장에서 보는 ‘일 못하는 직원’ TOP8,리더 입장에서 보는 ‘일 못하는 직원’ TOP8

체인지그라운드,체인지그라운드

리더 입장에서 보는 ‘일 못하는 직원’ TOP8,리더 입장에서 보는 ‘일 못하는 직원’ TOP8

게임의 완성도는 고객이 결정한다

예술 작품은 작가의 생각을 표현하는 도구다. 따라서, 작가의 의도를 얼마나 잘 담아내고 있느냐가 중요하다. 그 의도를 대중이 몰라줄 수도 있고, 알지만 공감하지 못할 수도 있다. 그래도 괜찮다. 대중의 인정을 받지 못해도 예술성은 사라지지 않는다. 잘 만든 작품으로 남아있을 수 있다.

... 더 보기

《그렇게 해주세요》

... 더 보기

IT 회사의 업무에서, 지금까지는 디자이너와 특히 개발자가 병목이었는데, 대 AI 시대에는 기획자가 병목이 될 수도 있겠다. 조금이라도 규모가 있는 기업에서의 가장 큰 병목은 보통 의사결정자라는 것을 생각해보면 그렇다.


즉, 실무보다 의사결정을 AI에게 맡기는 것이 병목을 해소할 수 있는 가장 확실한 방법이며, 그러므로 부장님과 사장님을 AI로 대체하는 것이야말로 인류의 번영을 위한 가장 빠른 지름길이다. (아님. 아니 맞나?!)


iOS 19가 아니라 이제 iOS 26?

... 더 보기

No iOS 19: Apple Going Straight to iOS 26

MacRumors

No iOS 19: Apple Going Straight to iOS 26