React์ ์บ์ฑ ๋ฉ์ปค๋์ฆ, ํนํ ํจ์ ๊ฒฐ๊ณผ ์บ์ฑ์ ์ด์ , ๊ตฌํ ์ ๋ต, ๊ทธ๋ฆฌ๊ณ ์ต์ ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ดํด๋ณด์ธ์.
React ์บ์: ํจ์ ๊ฒฐ๊ณผ ์บ์ฑ์ผ๋ก ์ฑ๋ฅ ๊ทน๋ํํ๊ธฐ
์น ๊ฐ๋ฐ์ ์ธ๊ณ์์ ์ฑ๋ฅ์ ๋ฌด์๋ณด๋ค ์ค์ํฉ๋๋ค. ์ฌ์ฉ์๋ค์ ์ํํ ๊ฒฝํ์ ์ ๊ณตํ๋ ๋น ๋ฅด๊ณ ๋ฐ์์ฑ์ด ์ข์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ธฐ๋ํฉ๋๋ค. ์ฌ์ฉ์ ์ธํฐํ์ด์ค ๊ตฌ์ถ์ ์ํ ์ธ๊ธฐ ์๋ JavaScript ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ React๋ ์ฑ๋ฅ์ ์ต์ ํํ๊ธฐ ์ํ ์ฌ๋ฌ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค. ๊ทธ์ค ํ๋๊ฐ ํจ์ ๊ฒฐ๊ณผ ์บ์ฑ์ด๋ฉฐ, ์ด๋ ๋ถํ์ํ ๊ณ์ฐ์ ํฌ๊ฒ ์ค์ด๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์๋๋ฅผ ํฅ์์ํฌ ์ ์์ต๋๋ค.
ํจ์ ๊ฒฐ๊ณผ ์บ์ฑ์ด๋ ๋ฌด์์ธ๊ฐ์?
๋ฉ๋ชจ์ด์ ์ด์ (memoization)์ด๋ผ๊ณ ๋ ์๋ ค์ง ํจ์ ๊ฒฐ๊ณผ ์บ์ฑ์ ํจ์ ํธ์ถ์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅ(์บ์)ํ๊ณ ๋์ผํ ์ธ์๋ฅผ ์ฌ์ฉํ ํ์ ํธ์ถ์ ์ฌ์ฌ์ฉํ๋ ๊ธฐ์ ์ ๋๋ค. ์ด๋ฅผ ํตํด ๋ณต์กํ๊ฑฐ๋ ์์ฃผ ํธ์ถ๋๋ ํจ์์ ๊ฒฝ์ฐ ๊ณ์ฐ ๋น์ฉ์ด ๋ง์ด ๋ค ์ ์๋ ํจ์ ์ฌ์คํ์ ํผํ ์ ์์ต๋๋ค. ๋์ ์บ์๋ ๊ฒฐ๊ณผ๋ฅผ ๊ฒ์ํ์ฌ ์๊ฐ๊ณผ ๋ฆฌ์์ค๋ฅผ ์ ์ฝํฉ๋๋ค.
์ด๋ ๊ฒ ์๊ฐํด ๋ณด์ธ์: ํฐ ์ซ์ ๋ฐฐ์ด์ ํฉ๊ณ๋ฅผ ๊ณ์ฐํ๋ ํจ์๊ฐ ์์ต๋๋ค. ์บ์ฑ ์์ด ์ด ํจ์๋ฅผ ๋์ผํ ๋ฐฐ์ด๋ก ์ฌ๋ฌ ๋ฒ ํธ์ถํ๋ฉด ๋งค๋ฒ ํฉ๊ณ๋ฅผ ๋ค์ ๊ณ์ฐํฉ๋๋ค. ์บ์ฑ์ ์ฌ์ฉํ๋ฉด ํฉ๊ณ๋ ํ ๋ฒ๋ง ๊ณ์ฐ๋๊ณ ํ์ ํธ์ถ์์๋ ์ ์ฅ๋ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ๋จํ ๊ฒ์ํฉ๋๋ค.
React์์ ํจ์ ๊ฒฐ๊ณผ ์บ์ฑ์ ์ฌ์ฉํ๋ ์ด์ ๋ ๋ฌด์์ธ๊ฐ์?
React ์ ํ๋ฆฌ์ผ์ด์ ์ ์ข ์ข ์์ฃผ ์ฌ๋ ๋๋ง๋๋ ์ปดํฌ๋ํธ๋ฅผ ํฌํจํฉ๋๋ค. ์ด๋ฌํ ์ฌ๋ ๋๋ง์ ๋น์ฉ์ด ๋ง์ด ๋๋ ๊ณ์ฐ์ด๋ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ ์์ ์ ์ ๋ฐํ ์ ์์ต๋๋ค. ํจ์ ๊ฒฐ๊ณผ ์บ์ฑ์ ์ด๋ฌํ ๋ถํ์ํ ๊ณ์ฐ์ ๋ฐฉ์งํ๊ณ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ์ฑ๋ฅ์ ํฅ์์ํค๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค:
- CPU ์ฌ์ฉ๋ ๊ฐ์: ์ค๋ณต ๊ณ์ฐ์ ํผํจ์ผ๋ก์จ ์บ์ฑ์ CPU ๋ถํ๋ฅผ ์ค์ฌ ๋ค๋ฅธ ์์ ์ ์ํ ๋ฆฌ์์ค๋ฅผ ํ๋ณดํฉ๋๋ค.
- ์๋ต ์๊ฐ ๊ฐ์ : ์บ์๋ ๊ฒฐ๊ณผ๋ฅผ ๊ฒ์ํ๋ ๊ฒ์ด ์ฌ๊ณ์ฐํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋น ๋ฅด๋ฏ๋ก ์๋ต ์๊ฐ์ด ๋จ์ถ๋๊ณ ๋ ๋ฐ์์ฑ์ด ์ข์ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ก ์ด์ด์ง๋๋ค.
- ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ ๊ฐ์: ํจ์๊ฐ API์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒฝ์ฐ ์บ์ฑ์ ๋ถํ์ํ API ํธ์ถ์ ๋ฐฉ์งํ์ฌ ๋คํธ์ํฌ ํธ๋ํฝ์ ์ค์ด๊ณ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค. ์ด๋ ๋์ญํญ์ด ์ ํ๋๊ฑฐ๋ ์ง์ฐ ์๊ฐ์ด ๊ธด ์๋๋ฆฌ์ค์์ ํนํ ์ค์ํฉ๋๋ค.
- ์ฌ์ฉ์ ๊ฒฝํ ํฅ์: ๋ ๋น ๋ฅด๊ณ ๋ฐ์์ฑ์ด ์ข์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ๋์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ์ฌ ์ฌ์ฉ์ ๋ง์กฑ๋์ ์ฐธ์ฌ๋๋ฅผ ๋์ ๋๋ค.
React์ ์บ์ฑ ๋ฉ์ปค๋์ฆ: ๋น๊ต ๊ฐ์
React๋ ์บ์ฑ์ ๊ตฌํํ๊ธฐ ์ํ ์ฌ๋ฌ ๋ด์ฅ ๋๊ตฌ๋ฅผ ์ ๊ณตํ๋ฉฐ, ๊ฐ๊ฐ ๊ณ ์ ํ ๊ฐ์ ๊ณผ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์์ต๋๋ค:
React.cache(์คํ์ ๊ธฐ๋ฅ): ๋ ๋๋ง ๋ฐ ์ปดํฌ๋ํธ ์ ๋ฐ์ ๊ฑธ์ณ ํจ์, ํนํ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ ํจ์์ ๊ฒฐ๊ณผ๋ฅผ ์บ์ฑํ๊ธฐ ์ํด ํน๋ณํ ์ค๊ณ๋ ํจ์์ ๋๋ค.useMemo: ๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์ ํ๋ ํ ์ ๋๋ค. ์์กด์ฑ์ด ๋ณ๊ฒฝ๋ ๋๋ง ๊ฐ์ ๋ค์ ๊ณ์ฐํฉ๋๋ค.useCallback: ํจ์ ์ ์๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์ ํ๋ ํ ์ ๋๋ค. ์์กด์ฑ์ด ๋ณ๊ฒฝ๋์ง ์๋ ํ ๋ ๋๋ง ๊ฐ์ ๋์ผํ ํจ์ ์ธ์คํด์ค๋ฅผ ๋ฐํํฉ๋๋ค.React.memo: ์ปดํฌ๋ํธ๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์ ํ์ฌ props๊ฐ ๋ณ๊ฒฝ๋์ง ์์ ๊ฒฝ์ฐ ์ฌ๋ ๋๋ง์ ๋ฐฉ์งํ๋ ๊ณ ์ฐจ ์ปดํฌ๋ํธ์ ๋๋ค.
React.cache: ์ ์ฉ ํจ์ ๊ฒฐ๊ณผ ์บ์ฑ ์๋ฃจ์
React.cache๋ React 18์ ๋์
๋ ์คํ์ API๋ก, ํจ์ ๊ฒฐ๊ณผ๋ฅผ ์บ์ฑํ๋ ์ ์ฉ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค. ํนํ ๊ธฐ๋ณธ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ ๋ ์บ์๋ฅผ ์๋์ผ๋ก ๋ฌดํจํํ ์ ์์ผ๋ฏ๋ก ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ ํจ์๋ฅผ ์บ์ฑํ๋ ๋ฐ ์ ํฉํฉ๋๋ค. ์ด๋ ๊ฐ๋ฐ์๊ฐ ์๋์ผ๋ก ์บ์ ๋ฌดํจํ๋ฅผ ๊ด๋ฆฌํด์ผ ํ๋ ์๋ ์บ์ฑ ์๋ฃจ์
์ ๋นํด ์ค์ํ ์ด์ ์
๋๋ค.
React.cache ์๋ ๋ฐฉ์:
- ํจ์๋ฅผ
React.cache๋ก ๊ฐ์๋๋ค. - ์บ์๋ ํจ์๊ฐ ํน์ ์ธ์ ์งํฉ์ผ๋ก ์ฒ์ ํธ์ถ๋๋ฉด ํจ์๋ฅผ ์คํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ์บ์์ ์ ์ฅํฉ๋๋ค.
- ๋์ผํ ์ธ์๋ฅผ ์ฌ์ฉํ ํ์ ํธ์ถ์ ์บ์์์ ๊ฒฐ๊ณผ๋ฅผ ๊ฒ์ํ์ฌ ์ฌ์คํ์ ํผํฉ๋๋ค.
- React๋ ๊ธฐ๋ณธ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋์์์ ๊ฐ์งํ๋ฉด ์บ์๋ฅผ ์๋์ผ๋ก ๋ฌดํจํํ์ฌ ์บ์๋ ๊ฒฐ๊ณผ๊ฐ ํญ์ ์ต์ ์ํ์ธ์ง ํ์ธํฉ๋๋ค.
์์ : ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ ํจ์ ์บ์ฑํ๊ธฐ
```javascript import React from 'react'; const fetchUserData = async (userId) => { // API์์ ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ ์๋ฎฌ๋ ์ด์ await new Promise(resolve => setTimeout(resolve, 500)); // ๋คํธ์ํฌ ์ง์ฐ ์๋ฎฌ๋ ์ด์ return { id: userId, name: `User ${userId}`, timestamp: Date.now() }; }; const cachedFetchUserData = React.cache(fetchUserData); function UserProfile({ userId }) { const userData = cachedFetchUserData(userId); if (!userData) { return๋ก๋ฉ ์ค...
; } return (์ฌ์ฉ์ ํ๋กํ
ID: {userData.id}
์ด๋ฆ: {userData.name}
ํ์์คํฌํ: {userData.timestamp}
์ด ์์ ์์ React.cache๋ fetchUserData ํจ์๋ฅผ ๊ฐ์๋๋ค. UserProfile์ด ํน์ userId๋ก ์ฒ์ ๋ ๋๋ง๋ ๋ fetchUserData๊ฐ ํธ์ถ๋๊ณ ๊ฒฐ๊ณผ๊ฐ ์บ์๋ฉ๋๋ค. ๋์ผํ userId๋ฅผ ์ฌ์ฉํ ํ์ ๋ ๋๋ง์ ์บ์๋ ๊ฒฐ๊ณผ๋ฅผ ๊ฒ์ํ์ฌ ๋ ๋ค๋ฅธ API ํธ์ถ์ ํผํฉ๋๋ค. React์ ์๋ ์บ์ ๋ฌดํจํ๋ ํ์ํ ๋ ๋ฐ์ดํฐ๊ฐ ์๋ก ๊ณ ์ณ์ง๋๋ก ๋ณด์ฅํฉ๋๋ค.
React.cache ์ฌ์ฉ์ ์ด์ :
- ๋จ์ํ๋ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ: ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ ์ฑ๋ฅ์ ๋ ์ฝ๊ฒ ์ต์ ํํ ์ ์์ต๋๋ค.
- ์๋ ์บ์ ๋ฌดํจํ: ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ ๋ ์บ์๋ฅผ ์๋์ผ๋ก ๋ฌดํจํํ์ฌ ์บ์ ๊ด๋ฆฌ๋ฅผ ๋จ์ํํฉ๋๋ค.
- ์ฑ๋ฅ ํฅ์: ๋ถํ์ํ API ํธ์ถ ๋ฐ ๊ณ์ฐ์ ์ค์ฌ ์๋ต ์๊ฐ์ ๋จ์ถํฉ๋๋ค.
React.cache ์ฌ์ฉ ์ ๊ณ ๋ ค ์ฌํญ:
- ์คํ์ API:
React.cache๋ ์์ง ์คํ์ API์ด๋ฏ๋ก ํฅํ React ๋ฒ์ ์์ ๋์์ด ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. - ์๋ฒ ์ปดํฌ๋ํธ: ์ฃผ๋ก ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ๊ฐ ์๋ฒ์ ๋ ์์ฐ์ค๋ฝ๊ฒ ํตํฉ๋๋ React ์๋ฒ ์ปดํฌ๋ํธ(RSC)์ ํจ๊ป ์ฌ์ฉํ๋๋ก ์๋๋์์ต๋๋ค.
- ์บ์ ๋ฌดํจํ ์ ๋ต: ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๋ ค๋ฉด React๊ฐ ์บ์๋ฅผ ๋ฌดํจํํ๋ ๋ฐฉ๋ฒ์ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
useMemo: ๊ฐ ๋ฉ๋ชจ์ด์ ์ด์
ํ๊ธฐ
useMemo๋ ๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์
ํ๋ React ํ
์
๋๋ค. ํจ์์ ์์กด์ฑ ๋ฐฐ์ด์ ์ธ์๋ก ๋ฐ์ต๋๋ค. ํจ์๋ ์์กด์ฑ ์ค ํ๋๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง ์คํ๋ฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด useMemo๋ ์ด์ ๋ ๋๋ง์์ ์บ์๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค.
๊ตฌ๋ฌธ:
```javascript const memoizedValue = useMemo(() => { // ๋น์ฉ์ด ๋ง์ด ๋๋ ๊ณ์ฐ return computeExpensiveValue(a, b); }, [a, b]); // ์์กด์ฑ ๋ฐฐ์ด ```์์ : ํ์๋ ๊ฐ ๋ฉ๋ชจ์ด์ ์ด์ ํ๊ธฐ
```javascript import React, { useMemo, useState } from 'react'; function ProductList({ products }) { const [filter, setFilter] = useState(''); const filteredProducts = useMemo(() => { console.log('์ ํ ํํฐ๋ง ์ค...'); return products.filter(product => product.name.toLowerCase().includes(filter.toLowerCase()) ); }, [products, filter]); return (-
{filteredProducts.map(product => (
- {product.name} ))}
์ด ์์ ์์ useMemo๋ filteredProducts ๋ฐฐ์ด์ ๋ฉ๋ชจ์ด์ ์ด์
ํฉ๋๋ค. ํํฐ๋ง ๋ก์ง์ products ๋ฐฐ์ด์ด๋ filter ์ํ๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง ์คํ๋ฉ๋๋ค. ์ด๋ ๋ชจ๋ ๋ ๋๋ง์์ ๋ถํ์ํ ํํฐ๋ง์ ๋ฐฉ์งํ์ฌ ํนํ ์ ํ ๋ชฉ๋ก์ด ํด ๋ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค.
useMemo ์ฌ์ฉ์ ์ด์ :
- ๋ฉ๋ชจ์ด์ ์ด์ : ์์กด์ฑ์ ๋ฐ๋ผ ๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ ์บ์ํฉ๋๋ค.
- ์ฑ๋ฅ ์ต์ ํ: ๋น์ฉ์ด ๋ง์ด ๋๋ ๊ฐ์ ๋ถํ์ํ ์ฌ๊ณ์ฐ์ ๋ฐฉ์งํฉ๋๋ค.
useMemo ์ฌ์ฉ ์ ๊ณ ๋ ค ์ฌํญ:
- ์์กด์ฑ: ์ฌ๋ฐ๋ฅธ ๋ฉ๋ชจ์ด์ ์ด์ ์ ๋ณด์ฅํ๋ ค๋ฉด ์์กด์ฑ์ ์ ํํ๊ฒ ์ ์ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์๋ชป๋ ์์กด์ฑ์ ์ค๋๋ ๊ฐ์ด๋ ๋ถํ์ํ ์ฌ๊ณ์ฐ์ ์ด๋ํ ์ ์์ต๋๋ค.
- ๊ณผ์ฉ: ๊ฐ๋จํ ๊ณ์ฐ์ ๊ฒฝ์ฐ ๋ฉ๋ชจ์ด์ ์ด์
์ ์ค๋ฒํค๋๊ฐ ์ด์ ๋ณด๋ค ํด ์ ์์ผ๋ฏ๋ก
useMemo์ ๊ณผ์ฉ์ ํผํ์ธ์.
useCallback: ํจ์ ๋ฉ๋ชจ์ด์ ์ด์
ํ๊ธฐ
useCallback์ ํจ์ ์ ์๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์
ํ๋ React ํ
์
๋๋ค. ํจ์์ ์์กด์ฑ ๋ฐฐ์ด์ ์ธ์๋ก ๋ฐ์ต๋๋ค. ์์กด์ฑ ์ค ํ๋๊ฐ ๋ณ๊ฒฝ๋์ง ์๋ ํ ๋ ๋๋ง ๊ฐ์ ๋์ผํ ํจ์ ์ธ์คํด์ค๋ฅผ ๋ฐํํฉ๋๋ค. ์ด๋ ์์ ์ปดํฌ๋ํธ์ ์ฝ๋ฐฑ์ ์ ๋ฌํ ๋ ํนํ ์ ์ฉํ๋ฉฐ, ํด๋น ์ปดํฌ๋ํธ์ ๋ถํ์ํ ์ฌ๋ ๋๋ง์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
๊ตฌ๋ฌธ:
```javascript const memoizedCallback = useCallback(() => { // ํจ์ ๋ก์ง }, [dependencies]); ```์์ : ์ฝ๋ฐฑ ํจ์ ๋ฉ๋ชจ์ด์ ์ด์ ํ๊ธฐ
```javascript import React, { useState, useCallback } from 'react'; function Button({ onClick, children }) { console.log('๋ฒํผ์ด ์ฌ๋ ๋๋ง๋์์ต๋๋ค!'); return ; } const MemoizedButton = React.memo(Button); function ParentComponent() { const [count, setCount] = useState(0); const handleClick = useCallback(() => { setCount(c => c + 1); }, []); return (์นด์ดํธ: {count}
์ด ์์ ์์ useCallback์ handleClick ํจ์๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์
ํฉ๋๋ค. MemoizedButton ์ปดํฌ๋ํธ๋ props๊ฐ ๋ณ๊ฒฝ๋์ง ์์ ๊ฒฝ์ฐ ์ฌ๋ ๋๋ง์ ๋ฐฉ์งํ๊ธฐ ์ํด React.memo๋ก ๊ฐ์ธ์ ธ ์์ต๋๋ค. useCallback์ด ์์ผ๋ฉด handleClick ํจ์๋ ParentComponent์ ๋ชจ๋ ๋ ๋๋ง์์ ๋ค์ ์์ฑ๋์ด MemoizedButton์ด ๋ถํ์ํ๊ฒ ์ฌ๋ ๋๋ง๋ฉ๋๋ค. useCallback์ ์ฌ์ฉํ๋ฉด handleClick ํจ์๋ ํ ๋ฒ๋ง ์ฌ์์ฑ๋์ด MemoizedButton์ ๋ถํ์ํ ์ฌ๋ ๋๋ง์ ๋ฐฉ์งํฉ๋๋ค.
useCallback ์ฌ์ฉ์ ์ด์ :
- ๋ฉ๋ชจ์ด์ ์ด์ : ์์กด์ฑ์ ๋ฐ๋ผ ํจ์ ์ธ์คํด์ค๋ฅผ ์บ์ํฉ๋๋ค.
- ๋ถํ์ํ ์ฌ๋ ๋๋ง ๋ฐฉ์ง: ๋ฉ๋ชจ์ด์ ์ด์ ๋ ํจ์๋ฅผ prop์ผ๋ก ์ฌ์ฉํ๋ ์์ ์ปดํฌ๋ํธ์ ๋ถํ์ํ ์ฌ๋ ๋๋ง์ ๋ฐฉ์งํฉ๋๋ค.
useCallback ์ฌ์ฉ ์ ๊ณ ๋ ค ์ฌํญ:
- ์์กด์ฑ: ์ฌ๋ฐ๋ฅธ ๋ฉ๋ชจ์ด์ ์ด์ ์ ๋ณด์ฅํ๋ ค๋ฉด ์์กด์ฑ์ ์ ํํ๊ฒ ์ ์ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์๋ชป๋ ์์กด์ฑ์ ์ค๋๋ ํจ์ ํด๋ก์ ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
- ๊ณผ์ฉ: ๊ฐ๋จํ ํจ์์ ๊ฒฝ์ฐ ๋ฉ๋ชจ์ด์ ์ด์
์ ์ค๋ฒํค๋๊ฐ ์ด์ ๋ณด๋ค ํด ์ ์์ผ๋ฏ๋ก
useCallback์ ๊ณผ์ฉ์ ํผํ์ธ์.
React.memo: ์ปดํฌ๋ํธ ๋ฉ๋ชจ์ด์ ์ด์
ํ๊ธฐ
React.memo๋ ํจ์ํ ์ปดํฌ๋ํธ๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์
ํ๋ ๊ณ ์ฐจ ์ปดํฌ๋ํธ(HOC)์
๋๋ค. props๊ฐ ๋ณ๊ฒฝ๋์ง ์์ ๊ฒฝ์ฐ ์ปดํฌ๋ํธ๊ฐ ์ฌ๋ ๋๋ง๋๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค. ์ด๋ ๋ ๋๋ง ๋น์ฉ์ด ๋ง์ด ๋ค๊ฑฐ๋ ์์ฃผ ์ฌ๋ ๋๋ง๋๋ ์ปดํฌ๋ํธ์ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค.
๊ตฌ๋ฌธ:
```javascript const MemoizedComponent = React.memo(MyComponent, [areEqual]); ```์์ : ์ปดํฌ๋ํธ ๋ฉ๋ชจ์ด์ ์ด์ ํ๊ธฐ
```javascript import React from 'react'; function DisplayName({ name }) { console.log('DisplayName์ด ์ฌ๋ ๋๋ง๋์์ต๋๋ค!'); return์๋ ํ์ธ์, {name}!
; } const MemoizedDisplayName = React.memo(DisplayName); function App() { const [count, setCount] = React.useState(0); return (์ด ์์ ์์ React.memo๋ DisplayName ์ปดํฌ๋ํธ๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์
ํฉ๋๋ค. DisplayName ์ปดํฌ๋ํธ๋ name prop์ด ๋ณ๊ฒฝ๋ ๋๋ง ์ฌ๋ ๋๋ง๋ฉ๋๋ค. App ์ปดํฌ๋ํธ๊ฐ count ์ํ๊ฐ ๋ณ๊ฒฝ๋ ๋ ์ฌ๋ ๋๋ง๋๋๋ผ๋ DisplayName์ props๊ฐ ๋์ผํ๊ฒ ์ ์ง๋๋ฏ๋ก ์ฌ๋ ๋๋ง๋์ง ์์ต๋๋ค. ์ด๋ ๋ถํ์ํ ์ฌ๋ ๋๋ง์ ๋ฐฉ์งํ๊ณ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค.
React.memo ์ฌ์ฉ์ ์ด์ :
- ๋ฉ๋ชจ์ด์ ์ด์ : props๊ฐ ๋ณ๊ฒฝ๋์ง ์์ ๊ฒฝ์ฐ ์ปดํฌ๋ํธ์ ์ฌ๋ ๋๋ง์ ๋ฐฉ์งํฉ๋๋ค.
- ์ฑ๋ฅ ์ต์ ํ: ๋ถํ์ํ ๋ ๋๋ง์ ์ค์ฌ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค.
React.memo ์ฌ์ฉ ์ ๊ณ ๋ ค ์ฌํญ:
- ์์ ๋น๊ต:
React.memo๋ props์ ๋ํด ์์ ๋น๊ต๋ฅผ ์ํํฉ๋๋ค. props๊ฐ ๊ฐ์ฒด์ธ ๊ฒฝ์ฐ ๊ฐ์ฒด์ ๋ด์ฉ์ด ์๋ ์ฐธ์กฐ๋ง ๋น๊ต๋ฉ๋๋ค. ๊น์ ๋น๊ต๋ฅผ ์ํด์๋React.memo์ ๋ ๋ฒ์งธ ์ธ์๋ก ์ฌ์ฉ์ ์ ์ ๋น๊ต ํจ์๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค. - ๊ณผ์ฉ: ๋น ๋ฅด๊ฒ ๋ ๋๋ง๋๋ ๊ฐ๋จํ ์ปดํฌ๋ํธ์ ๊ฒฝ์ฐ prop ๋น๊ต์ ์ค๋ฒํค๋๊ฐ ์ด์ ๋ณด๋ค ํด ์ ์์ผ๋ฏ๋ก
React.memo์ ๊ณผ์ฉ์ ํผํ์ธ์.
React์์ ํจ์ ๊ฒฐ๊ณผ ์บ์ฑ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
React์์ ํจ์ ๊ฒฐ๊ณผ ์บ์ฑ์ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ๋ ค๋ฉด ๋ค์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๊ณ ๋ คํ์ธ์:
- ์ฑ๋ฅ ๋ณ๋ชฉ ํ์ ์๋ณ: React DevTools ๋๋ ๊ธฐํ ํ๋กํ์ผ๋ง ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ์ผ์ผํค๋ ์ปดํฌ๋ํธ๋ ํจ์๋ฅผ ์๋ณํ์ธ์. ๋จผ์ ํด๋น ์์ญ์ ์ต์ ํํ๋ ๋ฐ ์ง์คํ์ธ์.
- ์ ๋ต์ ์ผ๋ก ๋ฉ๋ชจ์ด์ ์ด์
์ฌ์ฉ: ๋ฉ๋ชจ์ด์ ์ด์
๊ธฐ์ (
React.cache,useMemo,useCallback,React.memo)์ ์๋นํ ์ฑ๋ฅ ์ด์ ์ ์ ๊ณตํ๋ ๊ฒฝ์ฐ์๋ง ์ ์ฉํ์ธ์. ๊ณผ๋ํ ์ต์ ํ๋ ์ฝ๋์ ๋ถํ์ํ ๋ณต์ก์ฑ์ ๋ํ ์ ์์ผ๋ฏ๋ก ํผํ์ธ์. - ์ ์ ํ ๋๊ตฌ ์ ํ: ํน์ ์ฌ์ฉ ์ฌ๋ก์ ๋ฐ๋ผ ์ ์ ํ ์บ์ฑ ๋ฉ์ปค๋์ฆ์ ์ ํํ์ธ์.
React.cache๋ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ์ ์ด์์ ์ด๋ฉฐ,useMemo๋ ๊ฐ ๋ฉ๋ชจ์ด์ ์ด์ ,useCallback์ ํจ์ ๋ฉ๋ชจ์ด์ ์ด์ ,React.memo๋ ์ปดํฌ๋ํธ ๋ฉ๋ชจ์ด์ ์ด์ ์ ์ ํฉํฉ๋๋ค. - ์ ์คํ ์์กด์ฑ ๊ด๋ฆฌ:
useMemo์useCallback์ ์ ๊ณต๋ ์์กด์ฑ์ด ์ ํํ๊ณ ์์ ํ์ง ํ์ธํ์ธ์. ์๋ชป๋ ์์กด์ฑ์ ์ค๋๋ ๊ฐ์ด๋ ๋ถํ์ํ ์ฌ๊ณ์ฐ์ ์ด๋ํ ์ ์์ต๋๋ค. - ๋ถ๋ณ ๋ฐ์ดํฐ ๊ตฌ์กฐ ๊ณ ๋ ค: ๋ถ๋ณ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ฉด
React.memo์์ prop ๋น๊ต๋ฅผ ๋จ์ํํ๊ณ ๋ฉ๋ชจ์ด์ ์ด์ ์ ํจ๊ณผ๋ฅผ ํฅ์์ํฌ ์ ์์ต๋๋ค. - ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง: ์บ์ฑ์ ๊ตฌํํ ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ์ง์์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ์ฌ ์์๋๋ ์ด์ ์ ์ ๊ณตํ๋์ง ํ์ธํ์ธ์.
- ์บ์ ๋ฌดํจํ:
React.cache์ ๊ฒฝ์ฐ ์๋ ์บ์ ๋ฌดํจํ๋ฅผ ์ดํดํ์ธ์. ๋ค๋ฅธ ์บ์ฑ ์ ๋ต์ ๊ฒฝ์ฐ ์ค๋๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ ์ ํ ์บ์ ๋ฌดํจํ ๋ก์ง์ ๊ตฌํํ์ธ์.
๋ค์ํ ๊ธ๋ก๋ฒ ์๋๋ฆฌ์ค์์์ ์์
๋ค์ํ ๊ธ๋ก๋ฒ ์๋๋ฆฌ์ค์์ ํจ์ ๊ฒฐ๊ณผ ์บ์ฑ์ด ์ด๋ป๊ฒ ์ ์ตํ ์ ์๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค:
- ๋ค์ค ํตํ๋ฅผ ์ง์ํ๋ ์ด์ปค๋จธ์ค ํ๋ซํผ: ์ฌ๋ฌ ํตํ๋ฅผ ์ง์ํ๋ ์ด์ปค๋จธ์ค ํ๋ซํผ์ ํ์ฌ ํ์จ์ ๋ฐ๋ผ ๊ฐ๊ฒฉ์ ๋ณํํด์ผ ํฉ๋๋ค. ๊ฐ ์ ํ ๋ฐ ํตํ ์กฐํฉ์ ๋ํด ๋ณํ๋ ๊ฐ๊ฒฉ์ ์บ์ฑํ๋ฉด ํ์จ์ ๋ฐ๋ณต์ ์ผ๋ก ๊ฐ์ ธ์ค๋ ๋ถํ์ํ API ํธ์ถ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
- ํ์งํ๋ ์ฝํ ์ธ ๋ฅผ ์ ๊ณตํ๋ ๊ตญ์ ํ๋ ์ ํ๋ฆฌ์ผ์ด์ : ๊ตญ์ ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉ์์ ๋ก์ผ์ผ์ ๋ฐ๋ผ ๋ค๋ฅธ ์ธ์ด์ ํ์์ผ๋ก ์ฝํ ์ธ ๋ฅผ ํ์ํด์ผ ํฉ๋๋ค. ๊ฐ ๋ก์ผ์ผ์ ๋ํ ํ์งํ๋ ์ฝํ ์ธ ๋ฅผ ์บ์ฑํ๋ฉด ์ค๋ณต๋ ์์ ์ง์ ๋ฐ ๋ฒ์ญ ์์ ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
- ์ง์ค์ฝ๋ฉ์ ์ฌ์ฉํ๋ ์ง๋ ์ ํ๋ฆฌ์ผ์ด์ : ์ฃผ์๋ฅผ ์ง๋ฆฌ์ ์ขํ๋ก ๋ณํํ๋(์ง์ค์ฝ๋ฉ) ์ง๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ง์ค์ฝ๋ฉ ๊ฒฐ๊ณผ๋ฅผ ์บ์ฑํจ์ผ๋ก์จ ์ด์ ์ ์ป์ ์ ์์ต๋๋ค. ์ด๋ ์์ฃผ ๊ฒ์๋๋ ์ฃผ์์ ๋ํด ์ง์ค์ฝ๋ฉ ์๋น์ค์ ๋ถํ์ํ API ํธ์ถ์ ๋ฐฉ์งํฉ๋๋ค.
- ์ค์๊ฐ ์ฃผ๊ฐ๋ฅผ ํ์ํ๋ ๊ธ์ต ๋์๋ณด๋: ์ค์๊ฐ ์ฃผ๊ฐ๋ฅผ ํ์ํ๋ ๊ธ์ต ๋์๋ณด๋๋ ์บ์ฑ์ ์ฌ์ฉํ์ฌ ์ต์ ์ฃผ๊ฐ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํ ๊ณผ๋ํ API ํธ์ถ์ ํผํ ์ ์์ต๋๋ค. ์บ์๋ ์ฃผ๊ธฐ์ ์ผ๋ก ์ ๋ฐ์ดํธ๋์ด API ์ฌ์ฉ์ ์ต์ํํ๋ฉด์ ๊ฑฐ์ ์ค์๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
ํจ์ ๊ฒฐ๊ณผ ์บ์ฑ์ React ์ ํ๋ฆฌ์ผ์ด์
์ฑ๋ฅ์ ์ต์ ํํ๋ ๊ฐ๋ ฅํ ๊ธฐ์ ์
๋๋ค. ๋น์ฉ์ด ๋ง์ด ๋๋ ๊ณ์ฐ ๋ฐ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ ์์
์ ๊ฒฐ๊ณผ๋ฅผ ์ ๋ต์ ์ผ๋ก ์บ์ฑํจ์ผ๋ก์จ CPU ์ฌ์ฉ๋์ ์ค์ด๊ณ ์๋ต ์๊ฐ์ ๊ฐ์ ํ๋ฉฐ ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํฌ ์ ์์ต๋๋ค. React๋ React.cache, useMemo, useCallback, React.memo๋ฅผ ํฌํจํ์ฌ ์บ์ฑ์ ๊ตฌํํ๊ธฐ ์ํ ์ฌ๋ฌ ๋ด์ฅ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ฌํ ๋๊ตฌ๋ฅผ ์ดํดํ๊ณ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ฉด ํจ์ ๊ฒฐ๊ณผ ์บ์ฑ์ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ์ฌ ์ ์ธ๊ณ ์ฌ์ฉ์์๊ฒ ์ํํ ๊ฒฝํ์ ์ ๊ณตํ๋ ๊ณ ์ฑ๋ฅ React ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
ํญ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ๋กํ์ผ๋งํ์ฌ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์๋ณํ๊ณ ์บ์ฑ ์ต์ ํ์ ์ํฅ์ ์ธก์ ํ๋ ๊ฒ์ ์์ง ๋ง์ธ์. ์ด๋ฅผ ํตํด ์ ๋ณด์ ์ ๊ฐํ ๊ฒฐ์ ์ ๋ด๋ฆฌ๊ณ ์ํ๋ ์ฑ๋ฅ ํฅ์์ ๋ฌ์ฑํ ์ ์์ต๋๋ค.