๋ฆฌ์กํธ ์ปดํฌ๋ํธ ์ต์ ํ
๋ฆฌ์กํธ ๋ฆฌ๋ ๋๋ง
1. props, state ๋ณ๊ฒฝ ์ ๋ฆฌ๋ ๋๋ง
2. ๋ถ๋ชจ์ปดํฌ๋ํธ ๋ฆฌ๋ ๋๋ง์ ์์ ์ปดํฌ๋ํธ ๋ฆฌ๋ ๋๋ง
๋ฆฌ์กํธ์์๋ ์์ ์กฐ๊ฑด์ผ๋ ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํ๋๋ฐ ์ด๊ฒ์ ์ต์ ํํ๋ ๋ฐฉ๋ฒ์ ์ ๋ฆฌํฉ๋๋ค.
React.memo
React.memo ๋ ๊ณ ์ฐจ ์ปดํฌ๋ํธ (HOC) ๋ก ํจ์ & ํด๋์ค ์ปดํฌ๋ํธ์์ ์ฌ์ฉ๊ฐ๋ฅํฉ๋๋ค.
React.memo์ ํตํด ์ต์ ํ๋ฅผ ํ ๊ฒฝ์ฐ ๋ ๋๋ง์ ๋ ๋ props๋ฅผ ์ฒดํฌํ์ฌ ์ด์
props์์ ๋ณํ๊ฐ ์๋ค๋ฉด ๋ ๋๋ง์ ํ๊ณ ๋ณํ๊ฐ ์๋ค๋ฉด ๊ธฐ์กด์ ๋ ๋๋ง๋ ๊ฒฐ๊ณผ๋ฅผ ์ฌ์ฌ์ฉํฉ๋๋ค.
React.memo๋ ์ค์ง props์ ๋ณํ์๋ง ์์กดํ๋ ์ต์ ํ ๋ฐฉ๋ฒ!
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ useState, useReducer, useContext๋ฅผ ํตํด state๊ฐ ๋ณ๊ฒฝ๋๋ฉด ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํฉ๋๋ค.
funtion App() {
const [parentAge, setParentAge] = useState(0);
const [childAge, setChildAge] = useState(0);
const incrementParentAge = () => {
setParentAge(pre => pre+1)
}
const incrementChildAge = () => {
setChildAge(pre => pre+1)
}
return (
<div>
<p>age: {parentAge}</p>
<button onClick={incrementParentAge}>๋ถ๋ชจ ๋์ด ์ฆ๊ฐ</button>
<button onClick={incrementChildAge}>์์ ๋์ด ์ฆ๊ฐ</button>
<Child name={'์ด์ฝ๋ง์ ค๋ฆฌ'} age={childAge}/>
</div>
)
}
import React from 'react'
function Child ({name, age}) {
return(
<div>
<p>์ด๋ฆ : {name}</p>
<p>๋์ด : {age}</p>
</div>
)
}
export default Child
์์ ์ฝ๋๋ parentAge๋ฅผ ์ฆ๊ฐํ๋ ๋ฒํผ์ ๋๋ ์ ๋, Child ์ปดํฌ๋ํธ๋ ๋ถํ์ํ๊ฒ ๋ฆฌ๋ ๋๋ง์ด ๋๊ณ
๋ง์ฝ Child ์ปดํฌ๋ํธ ๋ด๋ถ์ ๋ณต์กํ ๋ก์ง์ด ์์๊ฒฝ์ฐ ์ฑ๋ฅ์ ์ ํ๋ฅผ ์ผ์ผํต๋๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ด ๋ถ๋ถ์ React.memo๋ฅผ ์ฌ์ฉํด์ ์ต์ ํํ ์ ์์ต๋๋ค.
import React, {memo} from 'react'
function Child ({name, age}) {
return(
<div>
<p>์ด๋ฆ : {name}</p>
<p>๋์ด : {age}</p>
</div>
)
}
export default memo(Child)
๊ทธ๋ ๋ค๋ฉด React.memo๋ฅผ ํตํด์ ๋ชจ๋ ์ปดํฌ๋ํธ๋ฅผ ์ต์ ํํ๋ฉด ์ข์๊ฒ์ธ๊ฐ?

React.memo๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ๋ ๋๋ง ํ์๋ฅผ ์ค์ฌ์ค ์ ์์ง๋ง ๋ฌด๋ถ๋ณํ๊ฒ ์ฌ์ฉํ๋ฉด ์ ๋๋ค.
์๋ํ๋ฉด ๋ ๋๋ง ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ถ๊ฐ์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ด๋ค.
React.memo ์ฌ์ฉํ๋ฉด ์ข์ ๊ฒฝ์ฐ
1. ์ปดํฌ๋ํธ๊ฐ ๊ฐ์ props๋ก ์์ฃผ ๋ ๋๋ง ๋ ๋
2. ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง ๋ ๋๋ง๋ค ๋ณต์กํ ๋ก์ง์ ์ฒ๋ฆฌํด์ผ ๋ ๋
useMemo
ํ ์ด๊ธฐ ๋๋ฌธ์ ํจ์ ์ปดํฌ๋ํธ์์๋ง ์ฌ์ฉ๊ฐ๋ฅํฉ๋๋ค.
์์กด์ฑ ๋ฐฐ์ด ์์ ๋ฃ์ ๋ด์ฉ์ด ๋ฐ๋๋ฉด ์ฝ๋ฐฑํจ์๋ฅผ ์ฐ์ฐํด ์ฃผ๊ณ ์๋๋ฉด ์ฐ์ฐํ ๊ฐ์ ์ฌ์ฌ์ฉํฉ๋๋ค.
useMemo(()=> {...},[])
funtion App() {
const [parentAge, setParentAge] = useState(0);
const incrementParentAge = () => {
setParentAge(pre => pre+1)
}
const name = {
lastName: '์ด์ฝ๋ง'.
firstName: '์ ค๋ฆฌ',
}
return (
<div>
<p>age: {parentAge}</p>
<button onClick={incrementParentAge}>๋ถ๋ชจ ๋์ด ์ฆ๊ฐ</button>
<Child name={name}/>
</div>
)
}
import React, {memp} from 'react'
function Child ({name}) {
return(
<div>
<p>์ฑ : {name.lastName}</p>
<p>์ด๋ฆ : {name.firstName}</p>
</div>
)
}
export default memo(Child)
์์ ์ฝ๋๋ Child ์ปดํฌ๋ํธ์์ name ๋ณ์๊ฐ props๋ก ๋ฐ๊ณ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ Child ์ปดํฌ๋ํธ๋ React.memo๋ฅผ ์ฌ์ฉํ์ฌ ์ต์ ํ๋ฅผ ํ๊ณ ์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด! ๋๊ฐ์ด parentAge๋ฅผ ์ฆ๊ฐํ๋ ๋ฒํผ์ ๋๋ ์ ๋ Child ์ปดํฌ๋ํธ๋ ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํ์ง ์๋๋ค๊ณ
์๊ฐํ์ง๋ง ๋ฒํผ์ ๋๋ ์ ๋๋ ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํฉ๋๋ค!!
๊ทธ ์ด์ ๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ์ ์ํ๊ฐ ๋ฆฌ๋ ๋๋ง ๋๋ฉด์ ๋ด๋ถ์ ๋ชจ๋ ๋ณ์๋ค์ด ์ด๊ธฐํ๋๋๋ฐ
์ด๋, name ๋ณ์ ๋ํ ์ด๊ธฐํ๊ฐ ๋๋ฉด์ ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ฐธ์กฐํ๊ธฐ ๋๋ฌธ์
props ์ฒดํฌ๋ฅผ ํ์ ๋ ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํฉ๋๋ค
(name์ ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ ๊ฐ์ ๋ณด์ผ์ง๋ผ๋ ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ์ฃผ์๋ฅผ ์ฐธ์กฐํ๋ค)
const obj = {a : 1}
const obj2 = {a : 1}
console.log(obj === obj2) // false
์ด๋ name์ ์๋์ ๊ฐ์ด useMemo๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํ์ง ์์ต๋๋ค.
import {useMemo} from 'react'
function App(){
// ...
const name = useMaemo(() => {
return {
lastName: '์ด์ฝ๋ง',
firstName: '์ ค๋ฆฌ'
}
},[])
// ...
}
useCallback
ํ ์ด๊ธฐ ๋๋ฌธ์ ํจ์ํ ์ปดํฌ๋ํธ์์๋ง ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
์์กด์ฑ ๋ฐฐ์ด ์์ ๋ฃ์ ๋ด์ฉ์ด ๋ฐ๋๋ฉด ์ฝ๋ฐฑํจ์๋ฅผ ์ฐ์ฐํด ์ฃผ๊ณ ์๋๋ฉด ์ฐ์ฐํ ํจ์๋ฅผ ์ฌ์ฌ์ฉํฉ๋๋ค.
useCallback(()=>{...},[])
funtion App() {
const [parentAge, setParentAge] = useState(0);
const incrementParentAge = () => {
setParentAge(pre => pre+1)
}
const tellMe = () => {
console.log("๋จน์ด๋ผ")
}
return (
<div>
<p>age: {parentAge}</p>
<button onClick={incrementParentAge}>๋ถ๋ชจ ๋์ด ์ฆ๊ฐ</button>
<Child name={'์ด์ฝ๋ง์ ค๋ฆฌ'} tellMe={tellMe}/>
</div>
)
}
import React from 'react'
function Child ({name,tellMe}) {
return(
<div>
<p>์ด๋ฆ : {name}</p>
<button onClick={tellMe}>๋ฐฅ ์ฃผ์ธ์</button>
</div>
)
}
export default memo(Child)
์ด๊ฒ๋ ๋๊ฐ์ต๋๋ค. ์ ๋ฌ๋ฐ๋ tellMe ๋ํ ๊ฐ์ฒด์ด๊ณ ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํ ๋ ์๋ก ์ด๊ธฐํ๋๊ธฐ ๋๋ฌธ์
React.memo๋ฅผ ์ฌ์ฉํ๋๋ผ๋ ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํฉ๋๋ค.
์ด๋๋ tellMe ํจ์์ ์ ์๋์ ๊ฐ์ด useCallback๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํ์ง ์์ต๋๋ค.
import {useCallback} from 'react'
function App(){
// ...
const tellMe = useCallback(() => {
console.log('๋จน์ด๋ผ')
},[])
// ...
}
์ ๋ฆฌ
React.memo : HOC์ผ๋ก ํจ์ & ํด๋์ค ์ปดํฌ๋ํธ ๋ชจ๋ ์ฌ์ฉ๊ฐ๋ฅ
๋ ๋๋ง์ ๋ ๋ props๋ฅผ ์ฒดํฌํ์ฌ ์ด์ props์์ ๋ณํ๊ฐ ์๋ค๋ฉด ๋ ๋๋ง์ ํ๊ณ ๋ณํ๊ฐ ์๋ค๋ฉด
๊ธฐ์กด์ ๋ ๋๋ง ๋ ๊ฒฐ๊ณผ๋ฅผ ์ฌ์ฌ์ฉํฉ๋๋ค
useMemo : Hook์ผ๋ก ํจ์ ์ปดํฌ๋ํธ์์๋ง ์ฌ์ฉ๊ฐ๋ฅ ํ๊ณ ํน์ ๊ฒฐ๊ด๊ฐ์ ์ฌ์ฌ์ฉํ ๋ ์ฌ์ฉํฉ๋๋ค.
์์กด์ฑ ๋ฐฐ์ด ์์ ๋ฃ์ ๋ด์ฉ์ด ๋ฐ๋๋ฉด ํจ์๋ฅผ ํธ์ถํด์ ๊ฐ์ ์ฐ์ฐํด ์ฃผ๊ณ , ๋ง์ฝ์ ๋ด์ฉ์ด ๋ฐ๋์ง ์์๋ค๋ฉด ์ด์ ์ ์ฐ์ฐํ ๊ฐ์ ์ฌ์ฌ์ฉํฉ๋๋ค.
useCallback : Hook์ผ๋ก ํจ์ ์ปดํฌ๋ํธ์์๋ง ์ฌ์ฉ๊ฐ๋ฅํ๊ณ ํน์ ํจ์๋ฅผ ์๋ก ๋ง๋ค์ง ์๊ณ
์ฌ์ฌ์ฉํ๊ณ ์ถ์ ๋ ์ฌ์ฉํฉ๋๋ค.
์์กด์ฑ ๋ฐฐ์ด ์์ ๋ฃ์ ๋ด์ฉ์ด ๋ฐ๋๋ฉด ํจ์๋ฅผ ์๋ก ์์ฑ, ๋ง์ฝ์ ๋ด์ฉ์ด ๋ฐ๋์ง ์์๋ค๋ฉด ์ด์ ์ ์ฐ์ฐํ ํจ์๋ฅผ ์ฌ์ฌ์ฉํฉ๋๋ค.
17. useMemo ๋ฅผ ์ฌ์ฉํ์ฌ ์ฐ์ฐํ ๊ฐ ์ฌ์ฌ์ฉํ๊ธฐ · GitBook
17. useMemo ๋ฅผ ์ฌ์ฉํ์ฌ ์ฐ์ฐํ ๊ฐ ์ฌ์ฌ์ฉํ๊ธฐ ์ด๋ฒ์๋ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํ์ฌ ์ฐ์ฐ๋ ๊ฐ์ useMemo๋ผ๋ Hook ์ ์ฌ์ฉํ์ฌ ์ฌ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. App ์ปดํฌ๋ํธ์์ ๋ค์๊ณผ ๊ฐ์ด co
react.vlpt.us
18. useCallback ๋ฅผ ์ฌ์ฉํ์ฌ ํจ์ ์ฌ์ฌ์ฉํ๊ธฐ · GitBook
18. useCallback ์ ์ฌ์ฉํ์ฌ ํจ์ ์ฌ์ฌ์ฉํ๊ธฐ useCallback ์ ์ฐ๋ฆฌ๊ฐ ์ง๋ ์๊ฐ์ ๋ฐฐ์ ๋ useMemo ์ ๋น์ทํ Hook ์ ๋๋ค. useMemo ๋ ํน์ ๊ฒฐ๊ณผ๊ฐ์ ์ฌ์ฌ์ฉ ํ ๋ ์ฌ์ฉํ๋ ๋ฐ๋ฉด, useCallback ์ ํน์ ํจ์๋ฅผ ์
react.vlpt.us