티스토리 뷰
(이 포스팅까지 흘러 들어왔다면 자바스크립트에 대하여 아주 얕게라도 안다는 기준 하에-)
스크립트를 짜다보면 컴포넌트를 만들어 사용성을 높이는 코드를 굉장히 많이 고민하게 된다. 컴포넌트를 호출하게 되면 하위(자식) 컴포넌트들도 함께 호출하게 되는데, 문제는 여기에서 시작된다. 내가 컴포넌트 내에세 하나의 상태 값을 변경하였을 때, 함께 온 자식 컴포넌트들까지 모두 랜더링 되는 상황이 발생하기 때문이다.
이렇게 되면 불필요한 랜더링의 반복으로 의도하지 않은 메모리 과사용 등 여러 문제가 발생하게 된다. 이렇게 의도하지 않은 상황을 막고자 처리하는 방법이 바로 useMemo와 useCallback Hook의 사용이다.
이 둘은 비슷하면서 다르기 때문에 많이 비교된다.
useMemo
const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
공식 홈페이지에서 useMemo를 설명하는 첫 마디는 '메모제이션 된 값을 반환합니다.'라는 말이다.
https://ko.reactjs.org/docs/hooks-reference.html#usememo
메모제이션이란 '메모리에 넣어 기억하겠다.' 라고 이해하면 편한데, 말 그대로 어떤 값을 메모리에 기억해두겠다는 의미이다. 만약 기억하고 있는 값과 동일한 값을 필요로 하는 어떤 로직이 발생하게 되면 메모리에 기억하고있는 값을 가지고와서 사용하게 된다. (너무 남용해서 메모제이션 하면 메모리를 더 과하게 쓸 수 있음 주의-!)
* 백문이 불여일견. 꼭 하단 코드가 아니더라도 헷갈리는 사람은 예시 코드를 따라하길 권장한다-!
const [num, setNum] = useState(0);
const [anotherNum, setAnotherNum] = useState(100);
console.log('num = ', num);
return (
<>
<button onClick={() => setNum(num + 1)}>num + 1 버튼</button>
<button onClick={() => setAnotherNum(anotherNum - 1)}>anotherNum - 1 버튼</button>
</>
)
나는 예시로 num과 anotherNum을 설정해주고, 각각 +1, -1을 계산하는 버튼을 생성하였다.
그리고 console로 num을 찍고 있는데, 여기서 문제가 발생한다. 나는 anotherNum을 클릭하는데, num의 숫자 정보를 알려주게 되는 현상이다. 컴포넌트 특성상 어떤 상태값이 변경되면 렌더링 하는 특징 때문에 anotherNum을 클릭하여도 num의 콘솔도 함께 찍히게 되는 것이다.
편의를 위해 클릭한 버튼 이름을 console에 추가하였다.
이때 useMemo Hook을 추가해주면 되는데, 코드를 다음과 같이 수정해보자. console 코드를 지우고, useMemo를 추가해준다.
useMemo(() => console.log('num = ', num), [num]);
해당 뜻은 num의 변수가 변경 될 때에만 num 값을 찍겠다는 의미이다.
이때 우리는 console을 찍어 확인하였지만 useMemo는 궁극적으로 '값'을 반환하는 함수로 다음과 같은 형식으로 변수에 저장하여 사용한다.
'JavaScript > react' 카테고리의 다른 글
react creat-react-app 설치, eslintrc.js 통해 eslint 설정하기 (0) | 2022.04.07 |
---|---|
react의 nextTick : useEffect / useLayoutEffect의 차이로 해결. (0) | 2022.04.06 |
[뷰쟁이의 리액트 시작하기] react useEffect로 랜더링 상태 관리하자 (0) | 2022.03.31 |
[뷰쟁이의 리액트 시작하기] react useState로 변수를 선언해보자 (0) | 2022.03.30 |
리액트 라우터를 통하여 공통 레이아웃 설정하기 (0) | 2022.03.10 |
- Total
- Today
- Yesterday
- CSS
- 리액트
- 크롬
- reacthook
- 사파리
- 자바스크립트
- 센트리
- react
- 깃
- javascript
- 센트리모니터링
- Git
- frontend
- 리액트상태관리
- js테스트
- 김민태
- 모바일사파리
- TIL
- sentry
- storybookUI
- js
- 깃명령어
- 프론트엔드
- gitRebase
- BFCache
- vue
- 리코일
- npm
- 프론트앤드
- 리액트훅
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |