일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- CustomHook
- 티스토리챌린지
- 클린코드
- virtaullist
- 합성 컴포넌트
- CRA
- 리팩토링
- 웹워커
- 오블완
- frontend
- Web
- 리액트
- 이것저것
- TypeScript
- 자바스크립트
- 프론트엔드
- server component
- Webworker
- radixui
- context.api
- provider 패턴
- vite
- 아키텍처
- 에세이
- MFA
- sharedworker
- JavaScript
- react
- 회고
- MicroFrontEnd
- Today
- Total
Lighthouse of FE biginner
[클린코드 리액트] Props로 Object 내리는 것 지양하기 본문
React에서는 Props를 통해 컴포넌트 간 데이터를 전달하는데, 특히 Object를 Props로 전달할 때 주의해야 할 사항들이 있습니다. 이를 효율적으로 관리하기 위해 몇 가지 팁을 살펴보겠습니다.
JavaScript에서의 Object
JavaScript에서의 값은 원시 값 혹은 객체 입니다. 흔하게 사용하는 List도 다른 언어에서는 특정 타입의 값의 집합이지만 JavaScript에서는 Object 입니다.
// Object
const Object = {
a: 'a'
};
// Object
const Array = [1, 2, 3];
Object.is와 불필요한 리랜더링
React에서는 리랜더링 시 컴포넌트 비교를 위해 Object.is 메서드를 사용합니다. 이 메서드는 같은 모양의 객체라도 메모리 주소값이 다르면 서로 다른 객체로 판단하여 false를 반환합니다. 따라서 같은 내용의 객체라도 새로운 객체로 인식되면 불필요한 리랜더링이 발생할 수 있습니다.
Object.is([], []); // false
const foo = { a: 1 };
const bar = { a: 1 };
const sameFoo = foo;
Object.is(foo, foo); // true
Object.is(foo, bar); // false
Object.is(foo, sameFoo); // true
해결 방법
1. 변하지 않는 값은 외부에 선언: 변하지 않는 값은 컴포넌트 외부에 선언하여 Props로 내리지 않고, 필요한 경우 컴포넌트 내부에서 직접 참조하는 것이 좋습니다.
2. 필요한 값만 분해하여 전달: 객체를 Props로 전달할 때는 필요한 값만 분해하여 전달하는 것이 좋습니다. 이렇게 하면 불필요한 리랜더링을 최소화할 수 있습니다.
3. 메모이제이션 활용: 값비싼 연산(연산 시간이 길거나 로직이 복잡한 경우) 경우 useMemo나 useCallback을 활용하여 메모이제이션을 하여 성능을 최적화할 수 있습니다. 메모이제이션은 기법은 연산 결과나 수행 로직이 메모리에 저장되어 랜더링 퍼포먼스를 최적화 할 수 있다는 장점은 있지만 메모리 공간을 사용하는 비용도 고려를 해야합니다. 또한 해당 값이 자주 재연산 되는 경우 잦은 메모이제이션이 발생함으로 프로그래밍 적으로 잘 고려해 메모이제이션을 활용해야 합니다.
Object를 Props로 전달할 때는 이러한 점들을 고려하여 효율적으로 관리하는 것이 중요합니다. 이를 통해 불필요한 리랜더링을 방지하고 성능을 최적화할 수 있습니다.
'[WEB] 프론트엔드' 카테고리의 다른 글
[클린코드 리액트] useEffect 바르게 사용하기 (1) | 2024.06.10 |
---|---|
[클린코드 리액트] 컴포넌트 내부에 컴포넌트 선언 지양하기 (0) | 2024.06.10 |
[클린코드 리액트] Css in JS 인라인 스타일 지양하기 (0) | 2024.06.09 |
[React] 커스텀 훅을 활용해 ExcelJS 로직 공통화 하기 (0) | 2024.05.24 |
[React] RSC (React Server Component) (0) | 2024.05.22 |