λΆνμν 리λ λλ§μ λ°©μ§νμ¬ React μ ν리μΌμ΄μ μ μ΅μ ννλ μ’ ν© κ°μ΄λμ λλ€. memoization, PureComponent, shouldComponentUpdate λ± μ±λ₯ ν₯μμ μν κΈ°μ λ€μ λ°°μ보μΈμ.
React λ λλ§ μ΅μ ν: λΆνμν 리λ λλ§ λ°©μ§ λ§μ€ν°νκΈ°
μ¬μ©μ μΈν°νμ΄μ€ ꡬμΆμ μν κ°λ ₯ν JavaScript λΌμ΄λΈλ¬λ¦¬μΈ Reactλ λλλ‘ κ³Όλνκ±°λ λΆνμν 리λ λλ§μΌλ‘ μΈν΄ μ±λ₯ λ³λͺ© νμμ κ²ͺμ μ μμ΅λλ€. λ§μ μ»΄ν¬λνΈκ° μλ 볡μ‘ν μ ν리μΌμ΄μ μμ μ΄λ¬ν 리λ λλ§μ μ±λ₯μ ν¬κ² μ νμμΌ μ¬μ©μ κ²½νμ λνμν¬ μ μμ΅λλ€. μ΄ κ°μ΄λλ Reactμμ λΆνμν 리λ λλ§μ λ°©μ§νμ¬ μ μΈκ³ μ¬μ©μλ€μκ² λΉ λ₯΄κ³ ν¨μ¨μ μ΄λ©° λ°μμ±μ΄ λ°μ΄λ μ ν리μΌμ΄μ μ 보μ₯νλ κΈ°μ μ λν ν¬κ΄μ μΈ κ°μλ₯Ό μ 곡ν©λλ€.
Reactμ 리λ λλ§ μ΄ν΄νκΈ°
μ΅μ ν κΈ°μ μ λν΄ μμ보기 μ μ Reactμ λ λλ§ νλ‘μΈμ€κ° μ΄λ»κ² μλνλμ§ μ΄ν΄νλ κ²μ΄ μ€μν©λλ€. μ»΄ν¬λνΈμ μν(state)λ μμ±(props)μ΄ λ³κ²½λλ©΄ Reactλ ν΄λΉ μ»΄ν¬λνΈμ κ·Έ μμλ€μ 리λ λλ§μ νΈλ¦¬κ±°ν©λλ€. μ΄ κ³Όμ μλ κ°μ DOMμ μ λ°μ΄νΈνκ³ μ΄μ λ²μ κ³Ό λΉκ΅νμ¬ μ€μ DOMμ μ μ©ν μ΅μνμ λ³κ²½ μ¬νμ κ²°μ νλ μμ μ΄ ν¬ν¨λ©λλ€.
νμ§λ§ λͺ¨λ μνλ μμ± λ³κ²½μ΄ DOM μ λ°μ΄νΈλ₯Ό νμλ‘ νλ κ²μ μλλλ€. λ§μ½ μλ‘μ΄ κ°μ DOMμ΄ μ΄μ κ³Ό λμΌνλ€λ©΄, 리λ λλ§μ λ³Έμ§μ μΌλ‘ μμ λλΉμ λλ€. μ΄λ¬ν λΆνμν 리λ λλ§μ κ·μ€ν CPU μ¬μ΄ν΄μ μλͺ¨νλ©°, νΉν 볡μ‘ν μ»΄ν¬λνΈ νΈλ¦¬λ₯Ό κ°μ§ μ ν리μΌμ΄μ μμ μ±λ₯ λ¬Έμ λ₯Ό μ λ°ν μ μμ΅λλ€.
λΆνμν 리λ λλ§ μλ³νκΈ°
리λ λλ§ μ΅μ νμ 첫 λ²μ§Έ λ¨κ³λ μ΄λμ λ°μνλμ§ μλ³νλ κ²μ λλ€. Reactλ μ΄λ₯Ό λκΈ° μν΄ μ¬λ¬ λꡬλ₯Ό μ 곡ν©λλ€:
1. React νλ‘νμΌλ¬
Chrome λ° Firefoxμ© React DevTools νμ₯ νλ‘κ·Έλ¨μμ μ¬μ©ν μ μλ React νλ‘νμΌλ¬λ₯Ό μ¬μ©νλ©΄ React μ»΄ν¬λνΈμ μ±λ₯μ κΈ°λ‘νκ³ λΆμν μ μμ΅λλ€. μ΄λ€ μ»΄ν¬λνΈκ° 리λ λλ§λκ³ μλμ§, λ λλ§μ μΌλ§λ 걸리λμ§, μ 리λ λλ§λλμ§μ λν ν΅μ°°λ ₯μ μ 곡ν©λλ€.
νλ‘νμΌλ¬λ₯Ό μ¬μ©νλ €λ©΄ DevToolsμμ "Record" λ²νΌμ νμ±ννκ³ μ ν리μΌμ΄μ κ³Ό μνΈ μμ©νλ©΄ λ©λλ€. κΈ°λ‘ ν νλ‘νμΌλ¬λ μ»΄ν¬λνΈ νΈλ¦¬μ λ λλ§ μκ°μ μκ°νν νλ μ μ°¨νΈλ₯Ό νμν©λλ€. λ λλ§ μκ°μ΄ κΈΈκ±°λ μμ£Ό 리λ λλ§λλ μ»΄ν¬λνΈκ° μ΅μ νμ μ£Όμ λμμ λλ€.
2. Why Did You Render?
"Why Did You Render?"λ Reactλ₯Ό ν¨μΉνμ¬ μ μ¬μ μΌλ‘ λΆνμν 리λ λλ§μ λν΄ μλ €μ£Όλ λΌμ΄λΈλ¬λ¦¬λ‘, 리λ λλ§μ μ λ°ν νΉμ μμ±μ μ½μμ λ‘κΉ ν©λλ€. μ΄λ 리λ λλ§ λ¬Έμ μ κ·Όλ³Έ μμΈμ μ νν νμ νλ λ° λ§€μ° μ μ©ν μ μμ΅λλ€.
"Why Did You Render?"λ₯Ό μ¬μ©νλ €λ©΄ κ°λ° μμ‘΄μ±μΌλ‘ μ€μΉνμΈμ:
npm install @welldone-software/why-did-you-render --save-dev
κ·Έλ° λ€μ μ ν리μΌμ΄μ μ μ§μ μ (μ: index.js)μΌλ‘ κ°μ Έμ΅λλ€:
import whyDidYouRender from '@welldone-software/why-did-you-render';
if (process.env.NODE_ENV === 'development') {
whyDidYouRender(React, {
include: [/.*/]
});
}
μ΄ μ½λλ κ°λ° λͺ¨λμμ "Why Did You Render?"λ₯Ό νμ±ννκ³ μ μ¬μ μΌλ‘ λΆνμν 리λ λλ§μ λν μ 보λ₯Ό μ½μμ κΈ°λ‘ν©λλ€.
3. Console.log λ¬Έ
κ°λ¨νμ§λ§ ν¨κ³Όμ μΈ κΈ°μ μ μ»΄ν¬λνΈμ render
λ©μλ(λλ ν¨μν μ»΄ν¬λνΈ λ³Έλ¬Έ) λ΄μ console.log
λ¬Έμ μΆκ°νμ¬ μΈμ 리λ λλ§λλμ§ μΆμ νλ κ²μ
λλ€. νλ‘νμΌλ¬λ "Why Did You Render?"λ³΄λ€ μ κ΅νμ§λ μμ§λ§, μμλ³΄λ€ μμ£Ό 리λ λλ§λλ μ»΄ν¬λνΈλ₯Ό μ μνκ² νμ
ν μ μμ΅λλ€.
λΆνμν 리λ λλ§μ λ°©μ§νλ κΈ°μ
μ±λ₯ λ¬Έμ λ₯Ό μΌμΌν€λ μ»΄ν¬λνΈλ₯Ό μλ³νλ€λ©΄, λΆνμν 리λ λλ§μ λ°©μ§νκΈ° μν΄ λ€μν κΈ°μ μ μ¬μ©ν μ μμ΅λλ€:
1. λ©λͺ¨μ΄μ μ΄μ (Memoization)
λ©λͺ¨μ΄μ μ΄μ μ λΉμ©μ΄ λ§μ΄ λλ ν¨μ νΈμΆμ κ²°κ³Όλ₯Ό μΊμ±νκ³ λμΌν μ λ ₯μ΄ λ€μ λ°μν λ μΊμλ κ²°κ³Όλ₯Ό λ°ννλ κ°λ ₯ν μ΅μ ν κΈ°μ μ λλ€. Reactμμλ μμ±μ΄ λ³κ²½λμ§ μμ κ²½μ° μ»΄ν¬λνΈκ° 리λ λλ§λλ κ²μ λ°©μ§νκΈ° μν΄ λ©λͺ¨μ΄μ μ΄μ μ μ¬μ©ν μ μμ΅λλ€.
a. React.memo
React.memo
λ ν¨μν μ»΄ν¬λνΈλ₯Ό λ©λͺ¨μ΄μ μ΄μ
νλ κ³ μ°¨ μ»΄ν¬λνΈ(HOC)μ
λλ€. νμ¬ μμ±κ³Ό μ΄μ μμ±μ μκ² λΉκ΅νμ¬ μμ±μ΄ λ³κ²½λ κ²½μ°μλ§ μ»΄ν¬λνΈλ₯Ό 리λ λλ§ν©λλ€.
μμ:
const MyComponent = React.memo(function MyComponent(props) {
return <div>{props.data}</div>;
});
κΈ°λ³Έμ μΌλ‘ React.memo
λ λͺ¨λ μμ±μ λν΄ μμ λΉκ΅λ₯Ό μνν©λλ€. λΉκ΅ λ‘μ§μ μ¬μ©μ μ μνλ €λ©΄ React.memo
μ λ λ²μ§Έ μΈμλ‘ μ¬μ©μ μ μ λΉκ΅ ν¨μλ₯Ό μ 곡ν μ μμ΅λλ€.
const MyComponent = React.memo(function MyComponent(props) {
return <div>{props.data}</div>;
}, (prevProps, nextProps) => {
// μμ±μ΄ κ°μΌλ©΄ true, λ€λ₯΄λ©΄ false λ°ν
return prevProps.data === nextProps.data;
});
b. useMemo
useMemo
λ κ³μ° κ²°κ³Όλ₯Ό λ©λͺ¨μ΄μ μ΄μ
νλ React ν
μ
λλ€. ν¨μμ μμ‘΄μ± λ°°μ΄μ μΈμλ‘ λ°μ΅λλ€. ν¨μλ μμ‘΄μ± μ€ νλκ° λ³κ²½λ λλ§ λ€μ μ€νλλ©°, νμ λ λλ§μμλ λ©λͺ¨μ΄μ μ΄μ
λ κ²°κ³Όκ° λ°νλ©λλ€.
useMemo
λ λΉμ©μ΄ λ§μ΄ λλ κ³μ°μ λ©λͺ¨μ΄μ μ΄μ
νκ±°λ μμ μ»΄ν¬λνΈμ μμ±μΌλ‘ μ λ¬λλ κ°μ²΄λ ν¨μμ λν μμ μ μΈ μ°Έμ‘°λ₯Ό λ§λλ λ° νΉν μ μ©ν©λλ€.
μμ:
const memoizedValue = useMemo(() => {
// μ¬κΈ°μ λΉμ©μ΄ λ§μ΄ λλ κ³μ° μν
return computeExpensiveValue(a, b);
}, [a, b]);
2. PureComponent
PureComponent
λ shouldComponentUpdate
λ©μλμμ μμ±κ³Ό μνμ μμ λΉκ΅λ₯Ό ꡬννλ React μ»΄ν¬λνΈμ κΈ°λ³Έ ν΄λμ€μ
λλ€. μμ±κ³Ό μνκ° λ³κ²½λμ§ μμλ€λ©΄ μ»΄ν¬λνΈλ 리λ λλ§λμ§ μμ΅λλ€.
PureComponent
λ λ λλ§μ΄ μ€μ§ μμ μ μμ±κ³Ό μνμλ§ μμ‘΄νκ³ μ»¨ν
μ€νΈλ λ€λ₯Έ μΈλΆ μμΈμ μμ‘΄νμ§ μλ μ»΄ν¬λνΈμ μ’μ μ νμ
λλ€.
μμ:
class MyComponent extends React.PureComponent {
render() {
return <div>{this.props.data}</div>;
}
}
μ€μ μ°Έκ³ : PureComponent
μ React.memo
λ μμ λΉκ΅(shallow comparison)λ₯Ό μνν©λλ€. μ΄λ κ°μ²΄μ λ°°μ΄μ λ΄μ©μ λΉκ΅νλ κ²μ΄ μλλΌ μ°Έμ‘°λ§μ λΉκ΅νλ€λ μλ―Έμ
λλ€. μμ±μ΄λ μνμ μ€μ²©λ κ°μ²΄λ λ°°μ΄μ΄ ν¬ν¨λ κ²½μ°, λ³κ²½ μ¬νμ΄ μ¬λ°λ₯΄κ² κ°μ§λλλ‘ λΆλ³μ±(immutability)κ³Ό κ°μ κΈ°μ μ μ¬μ©ν΄μΌ ν μ μμ΅λλ€.
3. shouldComponentUpdate
shouldComponentUpdate
μλͺ
μ£ΌκΈ° λ©μλλ₯Ό μ¬μ©νλ©΄ μ»΄ν¬λνΈκ° 리λ λλ§λμ΄μΌ νλμ§λ₯Ό μλμΌλ‘ μ μ΄ν μ μμ΅λλ€. μ΄ λ©μλλ λ€μ μμ±(nextProps)κ³Ό λ€μ μν(nextState)λ₯Ό μΈμλ‘ λ°μΌλ©°, μ»΄ν¬λνΈκ° 리λ λλ§λμ΄μΌ νλ©΄ true
λ₯Ό, κ·Έλ μ§ μμΌλ©΄ false
λ₯Ό λ°νν΄μΌ ν©λλ€.
shouldComponentUpdate
λ 리λ λλ§μ λν κ°μ₯ κ°λ ₯ν μ μ΄κΆμ μ 곡νμ§λ§, κ°μ₯ λ§μ μμμ
μ΄ νμν©λλ€. 리λ λλ§μ΄ νμνμ§ κ²°μ νκΈ° μν΄ κ΄λ ¨ μμ±κ³Ό μνλ₯Ό μ μ€νκ² λΉκ΅ν΄μΌ ν©λλ€.
μμ:
class MyComponent extends React.Component {
shouldComponentUpdate(nextProps, nextState) {
// μ¬κΈ°μ μμ±κ³Ό μν λΉκ΅
return nextProps.data !== this.props.data || nextState.count !== this.state.count;
}
render() {
return <div>{this.props.data}</div>;
}
}
μ£Όμ: shouldComponentUpdate
λ₯Ό μλͺ» ꡬννλ©΄ μκΈ°μΉ μμ λμκ³Ό λ²κ·Έκ° λ°μν μ μμ΅λλ€. λΉκ΅ λ‘μ§μ΄ μ² μ νκ³ λͺ¨λ κ΄λ ¨ μμλ₯Ό κ³ λ €νλμ§ νμΈνμμμ€.
4. useCallback
useCallback
μ ν¨μ μ μλ₯Ό λ©λͺ¨μ΄μ μ΄μ
νλ React ν
μ
λλ€. ν¨μμ μμ‘΄μ± λ°°μ΄μ μΈμλ‘ λ°μ΅λλ€. ν¨μλ μμ‘΄μ± μ€ νλκ° λ³κ²½λ λλ§ μ¬μ μλλ©°, νμ λ λλ§μμλ λ©λͺ¨μ΄μ μ΄μ
λ ν¨μκ° λ°νλ©λλ€.
useCallback
μ React.memo
λ PureComponent
λ₯Ό μ¬μ©νλ μμ μ»΄ν¬λνΈμ ν¨μλ₯Ό μμ±μΌλ‘ μ λ¬ν λ νΉν μ μ©ν©λλ€. ν¨μλ₯Ό λ©λͺ¨μ΄μ μ΄μ
ν¨μΌλ‘μ¨ λΆλͺ¨ μ»΄ν¬λνΈκ° 리λ λλ§λ λ μμ μ»΄ν¬λνΈκ° λΆνμνκ² λ¦¬λ λλ§λλ κ²μ λ°©μ§ν μ μμ΅λλ€.
μμ:
const handleClick = useCallback(() => {
// ν΄λ¦ μ΄λ²€νΈ μ²λ¦¬
console.log('Clicked!');
}, []);
5. λΆλ³μ± (Immutability)
λΆλ³μ±μ λ°μ΄ν°λ₯Ό μμ±λ νμ λ³κ²½ν μ μλ€λ, μ¦ λΆλ³μΌλ‘ μ·¨κΈνλ νλ‘κ·Έλλ° κ°λ μ λλ€. λΆλ³ λ°μ΄ν°λ₯Ό μ¬μ©ν λ, λͺ¨λ μμ μ κΈ°μ‘΄ λ°μ΄ν°λ₯Ό λ³κ²½νλ λμ μλ‘μ΄ λ°μ΄ν° ꡬ쑰λ₯Ό μμ±νλ κ²°κ³Όλ₯Ό λ³μ΅λλ€.
λΆλ³μ±μ Reactκ° μμ λΉκ΅λ₯Ό μ¬μ©νμ¬ μμ±κ³Ό μνμ λ³κ²½μ μ½κ² κ°μ§ν μ μκ² ν΄μ£ΌκΈ° λλ¬Έμ React 리λ λλ§ μ΅μ νμ λ§€μ° μ€μν©λλ€. κ°μ²΄λ λ°°μ΄μ μ§μ μμ νλ©΄ κ°μ²΄λ λ°°μ΄μ λν μ°Έμ‘°κ° λμΌνκ² μ μ§λλ―λ‘ Reactλ λ³κ²½μ κ°μ§ν μ μμ΅λλ€.
Immutable.jsλ Immerμ κ°μ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νμ¬ Reactμμ λΆλ³ λ°μ΄ν°λ₯Ό λ€λ£° μ μμ΅λλ€. μ΄ λΌμ΄λΈλ¬λ¦¬λ€μ λΆλ³ λ°μ΄ν°λ₯Ό λ μ½κ² μμ±νκ³ μ‘°μν μ μλ λ°μ΄ν° ꡬ쑰μ ν¨μλ₯Ό μ 곡ν©λλ€.
Immer μ¬μ© μμ:
import { useImmer } from 'use-immer';
function MyComponent() {
const [data, setData] = useImmer({
name: 'John',
age: 30
});
const updateName = () => {
setData(draft => {
draft.name = 'Jane';
});
};
return (
<div>
<p>Name: {data.name}</p>
<button onClick={updateName}>Update Name</button>
</div>
);
}
6. μ½λ λΆν λ° μ§μ° λ‘λ©
μ½λ λΆν μ μ ν리μΌμ΄μ μ μ½λλ₯Ό νμμ λ°λΌ λ‘λν μ μλ λ μμ μ²ν¬λ‘ λλλ κΈ°μ μ λλ€. λΈλΌμ°μ λ νμ¬ λ³΄κΈ°μ νμν μ½λλ§ λ€μ΄λ‘λνλ©΄ λλ―λ‘ μ ν리μΌμ΄μ μ μ΄κΈ° λ‘λ μκ°μ ν¬κ² ν₯μμν¬ μ μμ΅λλ€.
Reactλ React.lazy
ν¨μμ Suspense
μ»΄ν¬λνΈλ₯Ό μ¬μ©νμ¬ μ½λ λΆν μ κΈ°λ³Έμ μΌλ‘ μ§μν©λλ€. React.lazy
λ μ»΄ν¬λνΈλ₯Ό λμ μΌλ‘ κ°μ Έμ¬ μ μκ² ν΄μ£Όλ©°, Suspense
λ μ»΄ν¬λνΈκ° λ‘λλλ λμ λ체 UIλ₯Ό νμν μ μκ² ν΄μ€λλ€.
μμ:
import React, { Suspense } from 'react';
const MyComponent = React.lazy(() => import('./MyComponent'));
function App() {
return (
<Suspense fallback={<div>Loading...</div>}>
<MyComponent />
</Suspense>
);
}
7. ν¨μ¨μ μΈ Key μ¬μ©
Reactμμ μμ λͺ©λ‘μ λ λλ§ν λ κ° μμμ κ³ μ ν ν€(key)λ₯Ό μ 곡νλ κ²μ΄ μ€μν©λλ€. ν€λ Reactκ° μ΄λ€ μμκ° λ³κ²½, μΆκ° λλ μ κ±°λμλμ§ μλ³νλ λ° λμμ μ£Όμ΄ DOMμ ν¨μ¨μ μΌλ‘ μ λ°μ΄νΈν μ μκ² ν©λλ€.
λ°°μ΄ μΈλ±μ€λ₯Ό ν€λ‘ μ¬μ©νλ κ²μ νΌνμΈμ. λ°°μ΄ μμμ μμκ° λ³κ²½λ λ μΈλ±μ€κ° λ³κ²½λ μ μμ΄ λΆνμν 리λ λλ§μ μ λ°ν μ μμ΅λλ€. λμ , λ°μ΄ν°λ² μ΄μ€μ IDλ μμ±λ UUIDμ κ°μ΄ κ° μμμ λν κ³ μ μλ³μλ₯Ό μ¬μ©νμΈμ.
8. 컨ν μ€νΈ μ¬μ© μ΅μ ν
React 컨ν μ€νΈλ μ»΄ν¬λνΈ νΈλ¦¬μ λͺ¨λ λ 벨μ ν΅ν΄ λͺ μμ μΌλ‘ μμ±μ μ λ¬νμ§ μκ³ λ μ»΄ν¬λνΈ κ°μ λ°μ΄ν°λ₯Ό 곡μ νλ λ°©λ²μ μ 곡ν©λλ€. κ·Έλ¬λ 컨ν μ€νΈλ₯Ό κ³Όλνκ² μ¬μ©νλ©΄ μ±λ₯ λ¬Έμ κ° λ°μν μ μμ΅λλ€. 컨ν μ€νΈλ₯Ό μλΉνλ λͺ¨λ μ»΄ν¬λνΈλ 컨ν μ€νΈ κ°μ΄ λ³κ²½λ λλ§λ€ 리λ λλ§λκΈ° λλ¬Έμ λλ€.
컨ν μ€νΈ μ¬μ©μ μ΅μ ννλ €λ©΄ λ€μ μ λ΅μ κ³ λ €νμΈμ:
- μ¬λ¬ κ°μ μμ 컨ν μ€νΈ μ¬μ©: λͺ¨λ μ ν리μΌμ΄μ λ°μ΄ν°λ₯Ό μ μ₯νκΈ° μν΄ λ¨μΌμ ν° μ»¨ν μ€νΈλ₯Ό μ¬μ©νλ λμ , λ μκ³ μ§μ€λ μ¬λ¬ 컨ν μ€νΈλ‘ λλμΈμ. μ΄λ κ² νλ©΄ νΉμ 컨ν μ€νΈ κ°μ΄ λ³κ²½λ λ 리λ λλ§λλ μ»΄ν¬λνΈμ μλ₯Ό μ€μΌ μ μμ΅λλ€.
- 컨ν
μ€νΈ κ° λ©λͺ¨μ΄μ μ΄μ
:
useMemo
λ₯Ό μ¬μ©νμ¬ μ»¨ν μ€νΈ μ 곡μκ° μ 곡νλ κ°μ λ©λͺ¨μ΄μ μ΄μ νμΈμ. μ΄λ κ² νλ©΄ κ°μ΄ μ€μ λ‘ λ³κ²½λμ§ μμ κ²½μ° μ»¨ν μ€νΈ μλΉμμ λΆνμν 리λ λλ§μ λ°©μ§ν μ μμ΅λλ€. - 컨ν μ€νΈ λμ κ³ λ €: κ²½μ°μ λ°λΌ Reduxλ Zustandμ κ°μ λ€λ₯Έ μν κ΄λ¦¬ μ루μ μ΄ μ»¨ν μ€νΈλ³΄λ€ λ μ ν©ν μ μμ΅λλ€. νΉν μ»΄ν¬λνΈ μκ° λ§κ³ μν μ λ°μ΄νΈκ° μ¦μ 볡μ‘ν μ ν리μΌμ΄μ μ κ²½μ° κ·Έλ μ΅λλ€.
κ΅μ μ κ³ λ €μ¬ν
μ μΈκ³ μ¬μ©μλ₯Ό μν΄ React μ ν리μΌμ΄μ μ μ΅μ νν λλ λ€μ μμλ₯Ό κ³ λ €νλ κ²μ΄ μ€μν©λλ€:
- λ€μν λ€νΈμν¬ μλ: μ§μλ§λ€ μ¬μ©μμ λ€νΈμν¬ μλκ° ν¬κ² λ€λ₯Ό μ μμ΅λλ€. λ€μ΄λ‘λνκ³ λ€νΈμν¬λ₯Ό ν΅ν΄ μ μ‘ν΄μΌ νλ λ°μ΄ν°μ μμ μ΅μννλλ‘ μ ν리μΌμ΄μ μ μ΅μ ννμΈμ. μ΄λ―Έμ§ μ΅μ ν, μ½λ λΆν , μ§μ° λ‘λ©κ³Ό κ°μ κΈ°μ μ κ³ λ €νμΈμ.
- κΈ°κΈ° μ±λ₯: μ¬μ©μλ κ³ κΈ μ€λ§νΈν°λΆν° ꡬνμ μ μ±λ₯ κΈ°κΈ°κΉμ§ λ€μν κΈ°κΈ°μμ μ ν리μΌμ΄μ μ μ μν μ μμ΅λλ€. λ€μν κΈ°κΈ°μμ μ μλνλλ‘ μ ν리μΌμ΄μ μ μ΅μ ννμΈμ. λ°μν λμμΈ, μ μν μ΄λ―Έμ§, μ±λ₯ νλ‘νμΌλ§κ³Ό κ°μ κΈ°μ μ κ³ λ €νμΈμ.
- νμ§ν: μ ν리μΌμ΄μ μ΄ μ¬λ¬ μΈμ΄λ‘ νμ§νλ κ²½μ°, νμ§ν νλ‘μΈμ€κ° μ±λ₯ λ³λͺ© νμμ μΌμΌν€μ§ μλλ‘ νμΈμ. ν¨μ¨μ μΈ νμ§ν λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νκ³ ν μ€νΈ λ¬Έμμ΄μ μ»΄ν¬λνΈμ μ§μ νλμ½λ©νλ κ²μ νΌνμΈμ.
μ€μ μμ
μ΄λ¬ν μ΅μ ν κΈ°μ μ΄ μ΄λ»κ² μ μ©λ μ μλμ§ λͺ κ°μ§ μ€μ μμ λ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€:
1. μ μμκ±°λ μν λͺ©λ‘
μλ°± κ°μ μνμ νμνλ μν λͺ©λ‘ νμ΄μ§κ° μλ μ μμκ±°λ μΉμ¬μ΄νΈλ₯Ό μμν΄ λ³΄μΈμ. κ° μν νλͺ©μ λ³λμ μ»΄ν¬λνΈλ‘ λ λλ§λ©λλ€.
μ΅μ νκ° μλ€λ©΄ μ¬μ©μκ° μν λͺ©λ‘μ νν°λ§νκ±°λ μ λ ¬ν λλ§λ€ λͺ¨λ μν μ»΄ν¬λνΈκ° 리λ λλ§λμ΄ λλ¦¬κ³ λ²λ²
거리λ κ²½νμ μ λ°ν κ²μ
λλ€. μ΄λ₯Ό μ΅μ ννκΈ° μν΄ React.memo
λ₯Ό μ¬μ©νμ¬ μν μ»΄ν¬λνΈλ₯Ό λ©λͺ¨μ΄μ μ΄μ
νμ¬ μμ±(μ: μνλͺ
, κ°κ²©, μ΄λ―Έμ§)μ΄ λ³κ²½λ λλ§ λ¦¬λ λλ§λλλ‘ ν μ μμ΅λλ€.
2. μμ λ―Έλμ΄ νΌλ
μμ λ―Έλμ΄ νΌλλ μΌλ°μ μΌλ‘ λκΈ, μ’μμ λ° κΈ°ν μνΈμμ© μμκ° μλ κ²μλ¬Ό λͺ©λ‘μ νμν©λλ€. μ¬μ©μκ° κ²μλ¬Όμ 'μ’μμ'λ₯Ό λλ₯΄κ±°λ λκΈμ μΆκ°ν λλ§λ€ μ 체 νΌλλ₯Ό 리λ λλ§νλ κ²μ λΉν¨μ¨μ μ λλ€.
μ΄λ₯Ό μ΅μ ννκΈ° μν΄ useCallback
μ μ¬μ©νμ¬ κ²μλ¬Όμ 'μ’μμ'λ₯Ό λλ₯΄κ±°λ λκΈμ λ€λ μ΄λ²€νΈ νΈλ€λ¬λ₯Ό λ©λͺ¨μ΄μ μ΄μ
ν μ μμ΅λλ€. μ΄λ κ² νλ©΄ μ΄λ¬ν μ΄λ²€νΈ νΈλ€λ¬κ° νΈλ¦¬κ±°λ λ κ²μλ¬Ό μ»΄ν¬λνΈκ° λΆνμνκ² λ¦¬λ λλ§λλ κ²μ λ°©μ§ν μ μμ΅λλ€.
3. λ°μ΄ν° μκ°ν λμ보λ
λ°μ΄ν° μκ°ν λμ보λλ μ’ μ’ μ λ°μ΄ν°λ‘ μμ£Ό μ λ°μ΄νΈλλ 볡μ‘ν μ°¨νΈμ κ·Έλνλ₯Ό νμν©λλ€. λ°μ΄ν°κ° λ³κ²½λ λλ§λ€ μ΄λ¬ν μ°¨νΈλ₯Ό 리λ λλ§νλ κ²μ κ³μ° λΉμ©μ΄ λ§μ΄ λ€ μ μμ΅λλ€.
μ΄λ₯Ό μ΅μ ννκΈ° μν΄ useMemo
λ₯Ό μ¬μ©νμ¬ μ°¨νΈ λ°μ΄ν°λ₯Ό λ©λͺ¨μ΄μ μ΄μ
νκ³ λ©λͺ¨μ΄μ μ΄μ
λ λ°μ΄ν°κ° λ³κ²½λ λλ§ μ°¨νΈλ₯Ό 리λ λλ§ν μ μμ΅λλ€. μ΄λ κ² νλ©΄ 리λ λλ§ νμλ₯Ό ν¬κ² μ€μ΄κ³ λμ보λμ μ λ°μ μΈ μ±λ₯μ ν₯μμν¬ μ μμ΅λλ€.
λͺ¨λ² μ¬λ‘
React 리λ λλ§μ μ΅μ νν λ λͺ μ¬ν΄μΌ ν λͺ κ°μ§ λͺ¨λ² μ¬λ‘λ λ€μκ³Ό κ°μ΅λλ€:
- μ ν리μΌμ΄μ νλ‘νμΌλ§: React νλ‘νμΌλ¬λ "Why Did You Render?"λ₯Ό μ¬μ©νμ¬ μ±λ₯ λ¬Έμ λ₯Ό μΌμΌν€λ μ»΄ν¬λνΈλ₯Ό μλ³νμΈμ.
- κ°μ₯ μ¬μ΄ κ²λΆν° μμνκΈ°: κ°μ₯ μμ£Ό 리λ λλ§λκ±°λ λ λλ§νλ λ° κ°μ₯ μ€λ 걸리λ μ»΄ν¬λνΈλ₯Ό μ΅μ ννλ λ° μ§μ€νμΈμ.
- λ©λͺ¨μ΄μ μ΄μ μ μ€νκ² μ¬μ©νκΈ°: λ©λͺ¨μ΄μ μ΄μ μ체μλ λΉμ©μ΄ λ°λ₯΄λ―λ‘ λͺ¨λ μ»΄ν¬λνΈλ₯Ό λ©λͺ¨μ΄μ μ΄μ νμ§ λ§μΈμ. μ€μ λ‘ μ±λ₯ λ¬Έμ λ₯Ό μΌμΌν€λ μ»΄ν¬λνΈλ§ λ©λͺ¨μ΄μ μ΄μ νμΈμ.
- λΆλ³μ± μ¬μ©νκΈ°: λΆλ³ λ°μ΄ν° ꡬ쑰λ₯Ό μ¬μ©νμ¬ Reactκ° μμ±κ³Ό μνμ λ³κ²½μ λ μ½κ² κ°μ§νλλ‘ νμΈμ.
- μ»΄ν¬λνΈλ₯Ό μκ³ μ§μ€μ μΌλ‘ μ μ§νκΈ°: λ μκ³ μ§μ€λ μ»΄ν¬λνΈλ μ΅μ ννκ³ μ μ§ κ΄λ¦¬νκΈ°κ° λ μ½μ΅λλ€.
- μ΅μ ν ν μ€νΈνκΈ°: μ΅μ ν κΈ°μ μ μ μ©ν νμλ μ ν리μΌμ΄μ μ μ² μ ν ν μ€νΈνμ¬ μ΅μ νκ° μνλ ν¨κ³Όλ₯Ό λ΄κ³ μλ‘μ΄ λ²κ·Έλ₯Ό μ λ°νμ§ μμλμ§ νμΈνμΈμ.
κ²°λ‘
λΆνμν 리λ λλ§μ λ°©μ§νλ κ²μ React μ ν리μΌμ΄μ μ μ±λ₯μ μ΅μ ννλ λ° λ§€μ° μ€μν©λλ€. Reactμ λ λλ§ νλ‘μΈμ€κ° μ΄λ»κ² μλνλμ§ μ΄ν΄νκ³ μ΄ κ°μ΄λμμ μ€λͺ ν κΈ°μ μ μ¬μ©ν¨μΌλ‘μ¨ μ ν리μΌμ΄μ μ λ°μμ±κ³Ό ν¨μ¨μ±μ ν¬κ² ν₯μμμΌ μ μΈκ³ μ¬μ©μμκ² λ λμ μ¬μ©μ κ²½νμ μ 곡ν μ μμ΅λλ€. μ ν리μΌμ΄μ μ νλ‘νμΌλ§νκ³ , μ±λ₯ λ¬Έμ λ₯Ό μΌμΌν€λ μ»΄ν¬λνΈλ₯Ό μλ³νκ³ , ν΄λΉ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ μ μ ν μ΅μ ν κΈ°μ μ μ μ©νλ κ²μ μμ§ λ§μΈμ. μ΄λ¬ν λͺ¨λ² μ¬λ‘λ₯Ό λ°λ₯΄λ©΄ μ½λλ² μ΄μ€μ 볡μ‘μ±μ΄λ ν¬κΈ°μ κ΄κ³μμ΄ React μ ν리μΌμ΄μ μ΄ λΉ λ₯΄κ³ ν¨μ¨μ μ΄λ©° νμ₯ κ°λ₯νλλ‘ λ³΄μ₯ν μ μμ΅λλ€.