memoization

홍성표·2022년 6월 22일
0

memo

  • 불필요한 렌더링을 줄이기 위해 memo 를 사용한다.
  • react 에서 제공하고 있다.
import {memo} from "react"

const MemoizationPresenterPage = ()=>{
	console.log("프리젠터가 렌더링 됩니다.")


	return(
		<div>  
			<div>================<div>
			<h1>이것은 프리젠터 입니다.</h1>
			<div>================<div>
		</div>
	)
}

export default memo(MemoizationPresenterPage)
  • 이렇게 memo 를 사용해주시고 state카운트 를 클릭해보시면 프리젠터는 렌더링이 되지않아 콘솔도 찍히지 않을 뿐더러 리액트 툴에도 보이지 않는다.

useCallback(), useMemo()

  • 자식컴포넌트는 memo 를 사용해 불필요한 리렌더가 더이상 일어나지 안도록 막아주었지만, 부모 컴포넌트는 지속적으로 렌더링이 일어나는 상태이다.
  • 하지만 부모컴포넌트에서도 부분적으로 렌더링이 일어나지 않아도 되는 부분이 있다.
  • 예를들어 stateCount 를 변경했을때 letCount의 값이 지속적으로 다시 만들어지고 있는 상황이다. (초기화라고 하지만 0이라는 값이 계속 다시만들어 지는 것.)
  • 따라서 이런 불필요한 값들이 지속적으로 다시 만들어지지 않도록 유지시켜주는 hooks 가 바로 useMemo(), useCallback() 이다.

useMemo() 사용방법

import {useMemo} from 'react'

const containerPage = ()=>{
	console.log("컨테이너가 렌더링 됩니다.")

	let countLet = 0
	const [countState,setCountState] = useState(0)

	const memo = useMemo(()=>{
	// return 값을 기억한다.
	return Math.random()
	},[])
	console.log(`${memo}는 더이상 안 만들어`)

	const onClickCountLet = ()=>{
		console.log(countLet+1)
		countLet += 1
	}

	const onClickCountState = ()=>{
		console.log(countState+1)
		setCountState(countState+1)
	}
	return(
		<div> 
			<div>================<div> 
			<h1>이것은 컨테이너 입니다.</h1>

			<div> 카운트(let): {countLet} </div>
			<button onClick={onClickCountLet}> 카운트(let) +1 올리기! </button>

			<div> 카운트(state): {countLet} </div>
			<button onClick={onClickCountState}> 카운트(state) +1 올리기! </button>

			<div>================<div>

		<MemoizationPresenterPage/>
		</div>
	)
}

export default containerPage
  • 일반적으로 useMemo의 사용은 굉장히 복잡한 계산이외에는 그렇게 흔하지는 않다.

useCallback() 사용법

// memoization 폴더 _ presenter 파일
import {useCallback} from 'react'

const containerPage = ()=>{
	console.log("컨테이너가 렌더링 됩니다.")

	let countLet = 0
	const [countState,setCountState] = useState(0)

	// useCallback을 사용하게 되면 함수를 다시 만들지 않습니다.
	const onClickCountLet = useCallback(()=>{
		console.log(countLet+1)
		countLet += 1
		},[])

	// 눈으로 직접보기 위해 state 함수도 useCallback으로 감싸주겠습니다.
	const onClickCountState = useCallback(()=>{
		console.log(countState+1)
		setCountState(countState+1)
		},[])

	return(
		<div> 
			<div>================<div> 
			<h1>이것은 컨테이너 입니다.</h1>

			<div> 카운트(let): {countLet} </div>
			<button onClick={onClickCountLet}> 카운트(let) +1 올리기! </button>

			<div> 카운트(state): {countLet} </div>
			<button onClick={onClickCountState}> 카운트(state) +1 올리기! </button>

			<div>================<div>

		<MemoizationPresenterPage/>
		</div>
	)
}

export default containerPage
  • useCallback으로 함수를 감싸주게 되면 해당 함수를 다시 불러오지 않고 이전에 불러왔던 함수를 실행시키게 된다.
  • 즉, 이전에 불러왔던 값을 유지시는 것.
  • 이렇게 함수는 다시불러오지 않지만 값은 올려주고 싶을 때 사용할 수 있는 방법은 prev를 이용하는 것이다.
  • setCountState((prev)=>prev+1) 이렇게 setCoutState 함수를 작성해주면 onClickCountState 함수를 새로 그리지 않지만, state는 올려줄 수 있다.
profile
안녕하세요. 홍성표입니다.

0개의 댓글