๋ชฉ์ฐจ
๐ ๋ถํ์ํ ๋ฆฌ๋๋๋ง ๋ฐฉ์ง์ ๋ฏธ์น ์ธ๊ฐ
๋จผ์ React์ ์๋ฆฌ์ ๋ํด์ ์ดํด๊ฐ ํ์ํ ์ ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋จํ๊ฒ ์ค๋ช ํ์๋ฉด,
React๋ Virtual Dom๊ณผ Real Dom์ ๋น๊ตํ์ฌ, ์ํ๊ฐ ๋ณํ ๋ถ๋ถ๋ง์ ์บ์นํ์ฌ, Real Dom์ Fetch๋ฅผ ํฉ๋๋ค.
์ด ์ํ๋ผ๋ ๋จ์ด์ ๋ํด์ ์ง์คํด ๋ณด๊ฒ ์ต๋๋ค.
React๊ฐ ์ํ๊ฐ ๋ณํ ๋ถ๋ถ๋ง์ ์์ฃผ ์ ์บ์นํ๋ค๋ฉด, ์ ๋ ์ด๋ฐ ๊ณ ๋ฏผ์ ํ ํ์๊ฐ ์์์ ๊ฒ ๊ฐ์ต๋๋ค.
React์์๋ UI ์์์ ์ ์ผ ์์ ์กฐ๊ฐ์ด๋ผ๋ ์๋ฏธ๋ก Component๋ฅผ ์ฌ์ฉํฉ๋๋ค.
UI์์๋ ๋ ๋ค๋ฅธ UI ์กฐ๊ฐ์ด ์๊ณ , ๊ทธ UI ์กฐ๊ฐ ์์๋ ๋ ๋ค๋ฅธ UI ์กฐ๊ฐ์ด ์์ต๋๋ค.
์ด UI ์กฐ๊ฐ์ ๊ฐ์ธ๊ณ ์๋ ๋ ์์ ๋ถ๋ชจ ์ปดํฌ๋ํธ๋ผ๊ณ ๋ถ๋ฅด๊ณ , ๋ถ๋ชจ ์ปดํฌ๋ํธ ์์ ์๋ UI ์กฐ๊ฐ์ ์์ ์ปดํฌ๋ํธ๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
<๋ถ๋ชจ์ปดํฌ๋ํธ>
<์์์ปดํฌ๋ํธ />
</๋ถ๋ชจ์ปดํฌ๋ํธ>
React์ ๋ํ ์ค๋ช ์ ์ด์ ๋๋ฌ๊ณ ์ ๊ฐ ์ด๊ฑธ ์ค๋ช ํ ์ด์ ๋
์์ ์ปดํฌ๋ํธ์ ๋ถํ์ํ ๋ฆฌ๋๋๋ง์ ๋ฐฉ์งํ๊ณ ์ถ๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ฆ ์ฑ๋ฅ์ ๋๋ค.
React์์ ์์ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋๋๋ง์ด ์ผ์ด๋๋ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๋ถ๋ชจ ์ปดํฌ๋ํธ์ ์ํ๊ฐ ๋ณํ๋ฉด, ์์ ์ปดํฌ๋ํธ๋ ๋ฆฌ๋ ๋๋ง์ด ๋ฉ๋๋ค.
- ๋ถ๋ชจ๋ก๋ถํฐ ์ ๋ฌ๋ฐ๋ Props์ ์ํ๋ state์ ์ํ๊ฐ ๋ณํด๋, ๋ฆฌ๋ ๋๋ง์ด ๋ฉ๋๋ค.
๊ฒฐ๊ตญ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด, memo๋ผ๋ ๊ณ ์ฐจ ์ปดํฌ๋ํธ์ useCallback Hook์ ์ ์กฐํฉํด์ผ ํฉ๋๋ค.
memo๋ ๋์ผํ props๋ก ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ ๋๋ง ํ ๋, ๊ฒฐ๊ณผ๋ฅผ ๋ฉ๋ชจ์ด์งํ๋ ๊ณ ์ฐจ ์ปดํฌ๋ํธ์ด๊ณ ,
useCallback์ ๋ฉ๋ชจ์ด์งํ ์ฝ๋ฐฑ ํจ์๋ฅผ ๋ฐํํ๋ Hook์ ๋๋ค.
์ด ๋์ ์กฐํฉํด์ ์ ์ฌ์ฉํ๋ฉด ๋ถํ์ํ ๋ฆฌ๋๋๋ง ๋ฐฉ์ง๋ฅผ ํ ์ ์์ต๋๋ค.
๊ทธ๋ฐ๋ฐ, ์ด๋ป๊ฒ ๋ถํ์ํ ๋ ๋๋ง์ด ์ผ์ด๋์ง ์์๋ค๊ณ ์ฆ๋ช ํ ์ ์์๊น์?
๊ทธ๊ฒ์.. React ๊ณต์๋ฌธ์์์ React Dev Tool์ Profiler๋ฅผ ์ฌ์ฉํด์ ํ์ธํ๋ผ๊ณ ๋์์์ต๋๋ค.
๐๐React Dev Tool์ ํจ์ ๊ธฐ๋ฅ
๋ค๋ค.. ์ด๊ฑฐ ์ฌ์ฉํ๊ณ ๊ณ์์ฃ ?
Highlight updates when components render์ ์ฒดํฌํ๋ฉด ์ฌ์ฉํ ์ ์๋ ๊ธฐ๋ฅ์
๋๋ค.
React Dev Tool์ด๋ผ๋ ๊ตฌ๊ธ ํ์ฅ ํ๋ก๊ทธ๋จ์ ๊ธฐ๋ฅ ์ค ํ๋์ธ ํ์ด๋ผ์ดํธ ๊ธฐ๋ฅ์ ๋๋ค.
ํ์ด๋ผ์ดํธ ์ ์ด ํ์๋์๋ค๋ ๊ฒ์ ๋ ๋๋ง์ด ๋ฐ์ํ๋ค ๊ทธ๋ ๊ฒ ์๊ณ ๊ณ์ค ๊ฒ ๊ฐ์ต๋๋ค
์ ๋ ๊ทธ๋ ๊ฒ ์๊ณ ์์์ต๋๋ค.
ํ์ง๋ง ์ด Profiler์ ํ์ด๋ผ์ดํธ ๊ธฐ๋ฅ์ ํจ์ ์ด ์์ต๋๋ค.
์ค์ ๋ก ๋ ๋๋ง์ด ๋ฐ์ํ์ง ์์๋๋ฐ, ๋ ๋๋ง์ด ๋ฐ์ํ๋ค๊ณ ํ์ด๋ผ์ดํธ๋ก ํ์๋ฉ๋๋ค.
์๋๋ ์คํ์ ์ฌ์ฉ๋ ์ฝ๋์ ๋๋ค.
export const ํ์ด์ง = () => {
const [count, setCount] = useState<number>(0)
const handleCountIncrease = () => {
setCount((number) => number + 1)
}
const onReset = useCallback(() => {
setCount(0)
}, [])
return (
<Fragment>
<div
css={{
display: 'flex',
flexDirection: 'column',
alignItems: 'center',
width: 200,
height: 100,
border: '1px solid black',
borderRadius: 10,
}}
onClick={handleCountIncrease}
>
<p>{count}</p>
</div>
<Button onClick={onReset}>Reset</Button>
</Fragment>
)
}
const Button = memo((props: ButtonProps) => {
return <button {...props} />
})
Button.displayName = 'Button'
๋ฐ์ค๋ฅผ ํด๋ฆญํ๋ฉด count๊ฐ ์ฆ๊ฐํ๊ณ , Reset ๋ฒํผ์ ํด๋ฆญํ๋ฉด, ์ด๊ธฐํ๋๋ ๊ฐ๋จํ UI์ ๋๋ค.
์ฝ๋์ ์๋๋๋ก๋ผ๋ฉด, count๋ฅผ ์ฆ๊ฐ์ํฌ ๋, Button ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง ๋์ด์๋ ์ ๋ฉ๋๋ค.
- useCallback Hook์ผ๋ก ๊ฐ์ผ ์ฝ๋ฐฑ ํจ์๋ฅผ ์์ ์ปดํฌ๋ํธ์๊ฒ ์ ๋ฌํ์ต๋๋ค.
- ์์ ์ปดํฌ๋ํธ๋ ๋์ผํ props๋ผ๋ฉด, ๋ฉ๋ชจ์ด์ง ํ๋๋ก memo๋ฅผ ์ฌ์ฉํ์ฌ ๊ณ ์ฐจ ์ปดํฌ๋ํธ๋ก ๋ง๋ค์์ต๋๋ค.
๊ฒฐ๊ณผ๋? Reset ๋ฒํผ์ ํ์ด๋ผ์ดํธ ์ ์ด ํ์๋ฉ๋๋ค. ์ฆ, ๋ ๋๋ง ๋์๋ค๊ณ ํ์๋ฉ๋๋ค.
ํ์ง๋ง ์ค์ ๋ก๋ ๋ ๋๋ง ๋์ง ์์์ต๋๋ค.
Reset ๋ฒํผ์ ๋ด๋ถ์ console์ ์ฐ์ด๋ณด๊ฒ ์ต๋๋ค.
๋ฐ์ค๋ฅผ ํด๋ฆญํ ๋๋ง๋ค Reset ๋ฒํผ์ด ๋ ๋๋ง ๋์๋ค๋ฉด, console์ ๊ณ์ ์ถ๋ ฅ๋ ๊ฑฐ ๊ฐ์ต๋๋ค.
const Button = memo((props: ButtonProps) => {
console.log("์ ๋ ๋ฉ๋ชจ์ด์ ์ด์
๋ ๋ฒํผ์
๋๋ค")
return <button {...props} />
})
Button.displayName = 'Button'
๊ฒฐ๊ณผ๋ ๋ ๋๋ง๋์๋ค๊ณ ํ์ด๋ผ์ดํธ๋ก ํ์๋์์ง๋ง, console์๋ ์๋ฌด๊ฒ๋ ์ถ๋ ฅ๋์ง ์์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด, ์ ๊ฐ ์ฝ๋๋ฅผ ์๋ชป ์์ฑํ ๊ฒ์ผ๊น์??
์ ๋ต์......... ์๋๋๋ค.
์ ๊ทธ๋ผ… ์ด๋ฒ์๋ ์๊ฐ์ ์ผ๋ก๋ ํ์ด๋ผ์ดํธ์ ์ด ํ์๋์ง ์๋๋ก ์ฝ๋๋ฅผ ์์ ํด ๋ณด๊ฒ ์ต๋๋ค.
Reset ๋ฒํผ ์ปดํฌ๋ํธ๋ง ๋ฐ์ค ๋ด๋ถ๋ก ์ฎ๊ฒผ์ต๋๋ค.
export const ํ์ด์ง = () => {
const [count, setCount] = useState<number>(0)
const handleCountIncrease = () => {
setCount((number) => number + 1)
}
const onReset = useCallback(() => {
setCount(0)
}, [])
return (
<Fragment>
<div
css={{
display: 'flex',
flexDirection: 'column',
alignItems: 'center',
width: 200,
height: 100,
border: '1px solid black',
borderRadius: 10,
}}
onClick={handleCountIncrease}
>
<p>{count}</p>
<Button onClick={onReset}>Reset</Button>
</div>
</Fragment>
)
}
const Button = memo((props: ButtonProps) => {
return <button {...props} />
})
Button.displayName = 'Button'
๊ฒฐ๊ณผ๋??
ํ์ด๋ผ์ดํธ๋ก ํ์๋์ง ์์ต๋๋ค ใ ใ ใ ใ ใ ใ ใ ใ ใ ใ ใ
๋๋์ง ์๋์? ์ด ์ง์ค์ ์์์ ๋, ์ ๋ง ๊น์ง ๋๋์ต๋๋ค.
โ๏ธ ๋ง๋ฌด๋ฆฌ
React Dev Tool์ ํ์ด๋ผ์ดํธ ๊ธฐ๋ฅ์ ๊ฐ์ง๋ค
์ง์ง ์ฑ๋ฅ์ด ๊ฐ์ ๋์๋์ง, ๋ฆฌ๋ ๋๋ง ๋์ง ์์๋์ง๋ฅผ ํ์ธํ๋ ค๋ฉด ์๋์ ๋ ๊ฐ์ง ์ค ํ๋๋ฅผ ํด์ ํ์ธํ์.
- Profiler์ ์ฑ๋ฅ ๊ทธ๋ํ๋ฅผ ํ์ธ
- ์ปดํฌ๋ํธ ๋ด๋ถ์ console.log ์ฐ๊ธฐ
'Language > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
React ๋ธ๋ผ์ฐ์ ์ ์ฒด ํ๋ฉด ๋ชจ๋ (0) | 2023.07.05 |
---|---|
React cloneElement (0) | 2022.12.29 |
React ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ด ์บ๋ฌ์ ๊ตฌํํ๊ธฐ (0) | 2022.11.28 |
React svg๋ฅผ ์ปดํฌ๋ํธ๋ก ์ฌ์ฉํ๊ธฐ (0) | 2022.11.27 |
React AWS Amplify DataStore Tutorial (0) | 2022.10.10 |