
[ ์ฐธ๊ณ ์์ : ์ํ์ ์ฒ์ ๋ง๋ ๋ฆฌ์กํธ(2ํ) - ํ๋น๋ฏธ๋์ด ]
๐น React State ์ ๋ฆฌ
โ State๋?
- ๋ฆฌ์กํธ ์ปดํฌ๋ํธ์ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ๋ฐ์ดํฐ
- ๊ฐ๋ฐ์๊ฐ ์ง์ ์ ์ํ์ฌ ์ฌ์ฉ
- State๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์ปดํฌ๋ํธ๊ฐ ์ฌ๋ ๋๋ง๋จ
- ๋ ๋๋ง์ด๋ ๋ฐ์ดํฐ ํ๋ฆ์ ์ฌ์ฉ๋๋ ๊ฐ๋ง State์ ํฌํจํด์ผ ํจ
๐ฏ State์ ํน์ง
- JavaScript ๊ฐ์ฒด ํํ
- ์ง์ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅ โ ๋ฐ๋์ ์ง์ ๋ ๋ฐฉ๋ฒ(set ํจ์)์ผ๋ก ๋ณ๊ฒฝํด์ผ ํจ
โ๏ธ ํด๋์ค ์ปดํฌ๋ํธ์์ State ์ฌ์ฉ๋ฒ
- ์์ฑ์์์ State๋ฅผ ํ ๋ฒ์ ์ ์
- State ๋ณ๊ฒฝ ์ setState() ํจ์ ์ฌ์ฉ
โก ํจ์ ์ปดํฌ๋ํธ์์ State ์ฌ์ฉ๋ฒ
- useState() Hook์ ์ฌ์ฉํ์ฌ ๊ฐ๊ฐ์ State๋ฅผ ์ ์
- ๊ฐ State๋ณ๋ก ์ ๊ณต๋๋ set ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ณ๊ฒฝ
๐น React ์๋ช ์ฃผ๊ธฐ(Lifecycle) ์ ๋ฆฌ
React ์ปดํฌ๋ํธ๋ ์์ฑ(Mount) โ ์ ๋ฐ์ดํธ(Update) โ ์ ๊ฑฐ(Unmount) ์ ๊ณผ์ ์ ๊ฑฐ์นจ.
โ 1. ๋ง์ดํธ(Mount) โ ์ปดํฌ๋ํธ๊ฐ ์์ฑ๋ ๋
- ์ปดํฌ๋ํธ๊ฐ ์ฒ์ ํ๋ฉด์ ๋ํ๋ ๋ ์คํ
- ํด๋์ค ์ปดํฌ๋ํธ: componentDidMount()
- ์ฃผ๋ก API ํธ์ถ, ์ด๋ฒคํธ ๋ฆฌ์ค๋ ๋ฑ๋ก, ์ด๊ธฐ ๋ฐ์ดํฐ ์ค์ ๋ฑ์ ์ฌ์ฉ
๐ 2. ์ ๋ฐ์ดํธ(Update) โ ์ปดํฌ๋ํธ๊ฐ ๋ณ๊ฒฝ๋ ๋
์ปดํฌ๋ํธ๊ฐ ๋ค์ ๋ ๋๋ง๋๋ ๊ฒฝ์ฐ:
- props๊ฐ ๋ณ๊ฒฝ๋ ๋
- setState()๋ฅผ ์ฌ์ฉํด state๊ฐ ๋ณ๊ฒฝ๋ ๋
- forceUpdate()๋ฅผ ์ฌ์ฉํด ๊ฐ์ ์ ๋ฐ์ดํธํ ๋
- ํด๋์ค ์ปดํฌ๋ํธ: componentDidUpdate(prevProps, prevState)
๐ 3. ์ธ๋ง์ดํธ(Unmount) โ ์ปดํฌ๋ํธ๊ฐ ์ฌ๋ผ์ง ๋
- ์์ ์ปดํฌ๋ํธ์์ ํด๋น ์ปดํฌ๋ํธ๋ฅผ ๋ ์ด์ ํ๋ฉด์ ํ์ํ์ง ์์ ๋ ์คํ
- ํด๋์ค ์ปดํฌ๋ํธ: componentWillUnmount()
- ์ฃผ๋ก ์ด๋ฒคํธ ๋ฆฌ์ค๋ ํด์ , ํ์ด๋จธ ์ ๋ฆฌ, ๊ตฌ๋ ์ทจ์ ๋ฑ์ ์ฌ์ฉ
โก ํจ์ ์ปดํฌ๋ํธ์์ ์๋ช ์ฃผ๊ธฐ ๊ด๋ฆฌ (useEffect)
ํด๋์ค ์ปดํฌ๋ํธ์ ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋๋ ํจ์ ์ปดํฌ๋ํธ์์ useEffect Hook์ผ๋ก ๋์ฒด๋จ.
import { useEffect } from "react";
function MyComponent() {
useEffect(() => {
console.log("์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ๋จ");
return () => {
console.log("์ปดํฌ๋ํธ๊ฐ ์ธ๋ง์ดํธ๋จ");
};
}, []);
return <div>์๋
ํ์ธ์</div>;
}
โ
useEffect(() => {...}, []) โ ๋ง์ดํธ ์ ์คํ
โ
return () => {...} โ ์ธ๋ง์ดํธ ์ ์คํ
โ
useEffect(() => {...}, [๋ณ์]) โ ๋ณ์๊ฐ ๋ณ๊ฒฝ๋ ๋ ์คํ (์
๋ฐ์ดํธ ๋ฐ์)
๐น React ํ (Hook) ์ ๋ฆฌ
โ ํ ์ด๋?
- ๋ฆฌ์กํธ์ state์ ์๋ช ์ฃผ๊ธฐ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋๋ก ๋์์ฃผ๋ ํจ์
- ํด๋์ค ์ปดํฌ๋ํธ ์์ด๋ ์ํ ๊ด๋ฆฌ ๋ฐ ์๋ช ์ฃผ๊ธฐ ์ ์ด ๊ฐ๋ฅ
๐ฏ 1. useState() โ ์ํ(state) ๊ด๋ฆฌ
- ํจ์ ์ปดํฌ๋ํธ์์ state๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ํด์ฃผ๋ ํ
- ์ํ๋ฅผ ๋ณ๊ฒฝํ ๋๋ ์ ๊ณต๋ set ํจ์๋ฅผ ์ฌ์ฉํด์ผ ํจ
๐ 2. useEffect() โ ์ฌ์ด๋ ์ดํํธ ์ฒ๋ฆฌ
- ์๋ฒ ๋ฐ์ดํฐ ์์ฒญ, DOM ์กฐ์, ํ์ด๋จธ ์ค์ ๋ฑ ๋ถ๊ฐ์ ์ธ ์์ ์ํ
- ์๋ช ์ฃผ๊ธฐ ํจ์(componentDidMount, componentDidUpdate, componentWillUnmount)๋ฅผ ๋์ฒด
- ์์กด์ฑ ๋ฐฐ์ด์ ํ์ฉํ์ฌ ํน์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๋ง ์คํ ๊ฐ๋ฅ
- props์ state์ ์ ๊ทผ ๊ฐ๋ฅ
- useEffect()์์ ๋ฐํํ๋ ํจ์ โ ์ปดํฌ๋ํธ ์ธ๋ง์ดํธ ์ ์คํ๋จ (์ ๋ฆฌ ์์ ๊ฐ๋ฅ)
๐ 3. useMemo() โ ์ฐ์ฐ ์ต์ ํ
- ๊ฐ์ ๋ฉ๋ชจ์ด์ ์ด์ ํ์ฌ ๋ถํ์ํ ๊ณ์ฐ ๋ฐฉ์ง
- ๋ ๋๋ง์ด ์ผ์ด๋ ๋๋ง๋ค ์คํ๋๋ฏ๋ก ๋ ๋๋ง ์ค ์คํํ๋ฉด ์ ๋๋ ์์ ์ ๋ฃ์ง ์๋๋ก ์ฃผ์
- ์์กด์ฑ ๋ฐฐ์ด์ด ๋ณ๊ฒฝ๋ ๋๋ง ์ ๊ฐ์ ๊ณ์ฐํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ธฐ์กด ๊ฐ์ ๋ฐํ
๐ 4. useCallback() โ ํจ์ ๋ฉ๋ชจ์ด์ ์ด์
- useMemo()์ ๋น์ทํ์ง๋ง ๊ฐ์ด ์๋๋ผ "ํจ์"๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์
- ๋ถํ์ํ ํจ์ ์ฌ์ ์๋ฅผ ๋ง์ ์ฑ๋ฅ ์ต์ ํ
- ํจ์ ์ฌ์ ์๋ฅผ ๋ง์ ๋ถํ์ํ ๋ ๋๋ง ๋ฐฉ์ง
๐ 5. useRef() โ DOM ์์ ์ ๊ทผ & ๋ ๋๋ง ์ํฅ ์์
- ํน์ ์ปดํฌ๋ํธ ๋๋ DOM ์์์ ๋ํ ์ฐธ์กฐ ๊ฐ์ฒด ์์ฑ
- ๋ ๋๋ง์ด ์ผ์ด๋๋ ๊ฐ์ด ์ ์ง๋จ
- ์ฃผ๋ก DOM ์์ ์ ๊ทผ, ํฌ์ปค์ค ์ค์ , ์ด์ ๊ฐ ์ ์ฅ ๋ฑ์ ํ์ฉ
โ ๏ธ ํ ์ฌ์ฉ ๊ท์น
โ
๋ฐ๋์ ์ต์์ ๋ ๋ฒจ์์ ํธ์ถ (๋ฐ๋ณต๋ฌธ, ์กฐ๊ฑด๋ฌธ, ์ค์ฒฉ ํจ์ ๋ด์์ ํธ์ถ X)
โ
๋ฆฌ์กํธ ํจ์ ์ปดํฌ๋ํธ ๋๋ ์ปค์คํ
ํ
๋ด๋ถ์์๋ง ํธ์ถ ๊ฐ๋ฅ
๐น ์ปค์คํ ํ (Custom Hook)
โ 1. ์ปค์คํ ํ ์ด๋?
- use๋ก ์์ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ํจ์
- ๋ด๋ถ์์ ๋ค๋ฅธ ํ ๋ค์ ํธ์ถ ๊ฐ๋ฅ
- ์ค๋ณต๋๋ ๋ก์ง์ ์ถ์ถํ์ฌ ์ฌ์ฌ์ฉ์ฑ ์ฆ๊ฐ
โ 2. ๊ท์น
- use๋ก ์์ํ๋ ์ด๋ฆ ์ฌ์ฉ โ ํ ๊ท์น ์๋ฐ ์ฌ๋ถ๋ฅผ ์๋์ผ๋ก ํ์ธ ๊ฐ๋ฅ
- ๋ค๋ฅธ ํ ์ ๋ด๋ถ์์ ํธ์ถ ๊ฐ๋ฅ
- ํ๋ผ๋ฏธํฐ์ ๋ฐํ๊ฐ์ ์์ ๋กญ๊ฒ ์ค์ ๊ฐ๋ฅ
โ 3. ์ปค์คํ ํ ์ ์ฅ์
- ๋ก์ง ๋ถ๋ฆฌ ๋ฐ ์ฌ์ฌ์ฉ์ฑ ์ฆ๊ฐ
- ๊ฐ๋ ์ฑ ํฅ์ (์ปดํฌ๋ํธ ์ฝ๋๊ฐ ๊ฐ๊ฒฐํด์ง)
- ์ํ ๋ฐ ๋ถ์ ํจ๊ณผ ๊ด๋ฆฌ ์ฉ์ด
๐น ์ด๋ฒคํธ(Event) ์ ๋ฆฌ
โ 1. ์ด๋ฒคํธ๋?
- ์ฌ์ฉ์๊ฐ ๋ฒํผ ํด๋ฆญ, ํค๋ณด๋ ์ ๋ ฅ ๋ฑ ํน์ ํ๋์ ํ์ ๋ ๋ฐ์ํ๋ ์ฌ๊ฑด
โ 2. ๋ฆฌ์กํธ์์์ ์ด๋ฒคํธ ์ฒ๋ฆฌ
๊ตฌ๋ถ | DOM ์ด๋ฒคํธ | ๋ฆฌ์กํธ ์ด๋ฒคํธ |
์ด๋ฒคํธ ์ด๋ฆ | ์๋ฌธ์ ํ๊ธฐ (onclick) | ์นด๋ฉ ํ๊ธฐ๋ฒ (onClick) |
์ด๋ฒคํธ ์ ๋ฌ | ๋ฌธ์์ด ์ ๋ฌ ("handleClick()") | ํจ์ ์ ๋ฌ ({handleClick}) |
โ 3. ์ด๋ฒคํธ ํธ๋ค๋ฌ(Event Handler)
- ์ด๋ฒคํธ ๋ฐ์ ์ ์คํ๋๋ ํจ์
- ์ด๋ฒคํธ ๋ฆฌ์ค๋(Event Listener) ๋ผ๊ณ ๋ ํจ
โ 4. ํด๋์ค vs ํจ์ ์ปดํฌ๋ํธ์์์ ์ด๋ฒคํธ ์ฒ๋ฆฌ
๐น ํด๋์ค ์ปดํฌ๋ํธ
- ํจ์ ๋ด๋ถ์์ this๋ฅผ ์ฌ์ฉํ๋ฏ๋ก, ์์ฑ์์์ ๋ฐ์ธ๋ฉํด์ผ ํจ
class MyComponent extends React.Component {
constructor(props) {
super(props);
this.handleClick = this.handleClick.bind(this);
}
handleClick() {
console.log("ํด๋ฆญ๋จ!");
}
render() {
return <button onClick={this.handleClick}>ํด๋ฆญ</button>;
}
}
๐น ํจ์ ์ปดํฌ๋ํธ
- ํ์ดํ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ this ๋ฌธ์ ํด๊ฒฐ
function MyComponent() {
const handleClick = () => console.log("ํด๋ฆญ๋จ!");
return <button onClick={handleClick}>ํด๋ฆญ</button>;
}
Argument?
โข ํจ์์ ์ ๋ฌํ ๋ฐ์ดํฐ
โข ํ๋ผ๋ฏธํฐ ๋๋ ๋งค๊ฐ๋ณ์๋ผ๊ณ ๋ถ๋ฅด๊ธฐ๋ ํจ
- ํด๋์ค ์ปดํฌ๋ํธ
โข arrow function์ ์ฌ์ฉํ๊ฑฐ๋ Function.prototype.bind๋ฅผ ์ฌ์ฉํด์ ์ ๋ฌ - ํจ์ ์ปดํฌ๋ํธ
โข ์ด๋ฒคํธ ํธ๋ค๋ฌ ํธ์ถ ์ ์ํ๋ ์์๋๋ก ๋งค๊ฐ๋ณ์๋ฅผ ๋ฃ์ด์ ์ฌ์ฉ