์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- ์ทจ์
- csr
- ์๋ฐ์คํฌ๋ฆฝํธ
- ๋ฐฑ์ค
- dynamic import
- TypeScript
- React
- ์๊ณ ๋ฆฌ์ฆ
- ํ๋ก ํธ์๋
- ๋น๋๊ธฐ
- Next.js
- React Query
- ์ทจ์ ์ค๋น
- Browser
- DOM
- Git
- ์๋ฌ
- error
- css
- ์ฝ๋ฉ
- JavaScript
- SSR
- ์ฐจ์ด
- Vite
- Sass
- ์ฝ๋ฉํ ์คํธ
- ๊ฐ๋ฐ์
- ๊ณต๋ถ
- html
- http
- Today
- Total
minTech
[React] Life Cycle ๋ณธ๋ฌธ
๐ ๋ค์ด๊ฐ๊ธฐ ์ ์,,
front-end ๋ฅผ ๊ณต๋ถํ๊ธฐ ์ ์ ์ ๊ณต์์ ์ ํตํด android studio๋ฅผ ์ ํด๋ณด๋ฉด์ ์๋๋ก์ด๋ ์กํฐ๋นํฐ ์๋ช ์ฃผ๊ธฐ์ ๋ํด ๋ฐฐ์๋ณธ ์ ์ด ์๋ค. ๊ทธ ๋ ์ด ์๋ช ์ฃผ๊ธฐ์ ๊ดํ ํํธ๊ฐ ๊ต์ฅํ ์ค์ํด์ ์ค๊ฐ๊ณ ์ฌ ๋ฌธ์ ๋ก๋ ์ถ์ ๋์๋ ๊ธฐ์ต์ด ์๋ค.
react๋ฅผ ๊ณต๋ถํ๋ฉด์ ๋๋ค์ ์๋ช ์ฃผ๊ธฐ์ ๊ฐ๋ ์ ๋ํด ๋ง์ฃผํ๊ฒ ๋์๋ค. ์ด๋ฏธ ํ ๋ฒ ๋ฐฐ์๋ณธ ๊ฐ๋ ์ ํตํด ๋ ๊ฐ์ ์ฝ๊ฐ์ ์ฐจ์ด์ ์ ์ ์ด๋ณด์๋ฉด ์๋๋ก์ด๋ ์กํฐ๋นํฐ ์๋ช ์ฃผ๊ธฐ๋ ์กํฐ๋นํฐ๋ฅผ ์ค์ฌ์ผ๋ก ์ฌ์ดํด์ด ์งํ๋๋ ๋ฐ๋ฉด, react ์กํฐ๋นํฐ๋ ์ปดํฌ๋ํธ ์ค์ฌ์ผ๋ก ๋์๊ฐ์ง๋ง, ์ปดํฌ๋ํธํ์ธ์ง ํจ์ํ ์ปดํฌ๋ํธ์ธ์ง์ ๋ฐ๋ผ ์ฌ์ดํด์ด ๋์๊ฐ๋ ์ค์ฌ์ด ๋ค๋ฅด๋ค.
๊ทธ๋ ๋ค๋ฉด ์ฌ๊ธฐ์ ๋งํ๋ ์๋ช ์ฃผ๊ธฐ๋ ๋ฌด์์ด๋ฉฐ, ์ปดํฌ๋ํธํ๊ณผ ํจ์ํ ์ปดํฌ๋ํธ ๊ฐ๊ฐ์์์ ์ฌ์ดํด์ด ๋ฌด์์ ์ค์ฌ์ผ๋ก ๋์๊ฐ๋์ง์ ๋ํด ์์๋ณด๊ฒ ๋ค.
๐ ์๋ช ์ฃผ๊ธฐ(Life Cycle) ๋ ๋ฌด์์ผ๊น?
์๋ช ์ฃผ๊ธฐ(Lift Cycle)๋ ์ปดํฌ๋ํธ๊ฐ ์์ฑ๋๊ณ ๋์ ์ฌ์ฉ๋๊ณ , ์ ๊ฑฐ๋๋ ์ด ์ผ๋ จ์ ๊ณผ์ ์ ๋งํ๋ค.
React ์ปดํฌ๋ํธ๋ ๋ชจ๋ ๊ฐ๊ฐ์ ์๋ช ์ฃผ๊ธฐ๊ฐ ์กด์ฌํ๋ฉฐ, ์ด ์๋ช ์ฃผ๊ธฐ์ ํน์ ์์ ์์ ๋ฉ์๋๊ฐ ์๋์ผ๋ก ์คํ๋๋๋ฐ
์ด ๋ฉ์๋๋ฅผ ๋ผ์ดํ ์ฌ์ดํด ์ด๋ฒคํธ๋ผ๊ณ ํ๋ค.
์๋ช ์ฃผ๊ธฐ๋ ํฌ๊ฒ 3๊ฐ์ง ๋จ๊ณ๋ก ๋๋๋ค.
- Mount: ์ปดํฌ๋ํธ๊ฐ ํ๋ฉด์ ์ถ๊ฐ๋ ๋
- Update: ์๋ก์ด props๋ state๋ฅผ ๋ฐ์ ๋
- UpMount: ์ปดํฌ๋ํธ๊ฐ ํ๋ฉด์์ ์ ๊ฑฐ๋ ๋
์ผ๋จ, ๊ฐ๊ฐ์ ๋จ๊ณ์์ ์คํ๋๋ ๋ฉ์๋๋ฅผ ํ๋์ ๊ทธ๋ฆผ์ผ๋ก ์ ๋ฆฌํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
์ด๋ฌํ ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋๋ ํด๋์คํ ์ปดํฌ๋ํธ์์๋ง ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
๊ทธ๋ ๋ค๋ฉด ๊ฐ๊ฐ์ ๋จ๊ณ์์๋ ์ด๋ค ๊ณผ์ ์ ๊ฑฐ์น๋์ง ์์ธํ ์ดํด๋ณด์.
1๏ธโฃ ํด๋์คํ ์ปดํฌ๋ํธ
1. Mount: ์ปดํฌ๋ํธ๊ฐ ์์ฑ๋์ด ์คํ๋ ๋
1) ๋ง์ดํธ ๋๊ธฐ ์ ์ ๋จผ์ ํด๋น ์ปดํฌ๋ํธ์ constructor๊ฐ ํธ์ถ๋๋ค.
- this.state์ ๊ฐ์ฒด๋ฅผ ํ ๋นํ์ฌ ์ง์ญ state๋ฅผ ์ด๊ธฐํํ๋ค.
- ์ธ์คํด์ค์ ์ด๋ฒ ํธ ์ฒ๋ฆฌ ๋ฉ์๋๋ฅผ ๋ฐ์ธ๋ฉํ๋ค.
constructor(props) {
super(props);
this.state = {
greeting: this.props.greeting,
};
}
2) getDerivedStateFromProps ์คํ
static getDerivedStateFromProps(nextProps, prevState) {
console.log("getDerivedStateFromProps");
if (nextProps.greeting !== prevState.greeting) {
return { color: nextProps.greeting };
}
return null;
}
- ํด๋น ๋ฉ์๋๋ props๋ก ๋ฐ์์จ ๊ฐ์ state์ ๋ฃ์ด์ฃผ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ค.
- ๋ค๋ฅธ ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋์๋ ๋ฌ๋ฆฌ ์์ static์ ๋ถ์ฌ์ฃผ์ด์ผ ํ๋ค.
- ์ปดํฌ๋ํธ๊ฐ ์ฒ์ ๋ ๋๋ง ๋๊ธฐ ์ ์ ํ ๋ฒ ํธ์ถ๋๊ณ , ๊ทธ ์ดํ ๋ฆฌ๋ ๋๋ง ๋ ๋๋ง๋ค ํธ์ถ๋๋ค.
3) render
- render๋ก ์ปดํฌ๋ํธ๋ฅผ DOM์ ๋ถ์ฐฉํ๋ค.
4) ComponentDidMount ์คํ
- Mount๊ฐ ๋ชจ๋ ์๋ฃ๋ ํ์ ์คํ๋๋ ๋ฉ์๋์ด๋ค.
- render๊ฐ ๋ชจ๋ ์๋ฃ๋ ํ์ด๊ธฐ ๋๋ฌธ์ DOM์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค. ๋ฐ๋ผ์ ์ฃผ๋ก ์ด ๋๋ Ajax ์์ฒญ์ด๋, setTImeout,
- setInterval ๊ฐ์ ์์ ์ ์ํํ๋ค.
2. Update
props๋ state์ ๊ฐ์ด ๋ฐ๋๊ฑฐ๋, ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง ๋๋ ๋ฑ์ ์ ๋ฐ์ดํธ ๋ฐ์์ ๊ฐ์งํ๊ฒ ๋๋ฉด ๋ค์ ๋ฉ์๋๋ค์ด ์์๋๋ก ํธ์ถ๋๋ค.
- static getDerivedStateFromProps()
- shoudComponentUpdate()
- render()
- getSnapshotBeforeUpdate()
- componentDidUpdate
- ์ ๋ฉ์๋๋ ์ฒซ ๋ฒ์งธ, ๋ ๋ฒ์งธ ์ธ์๋ก ๋ฐ๊ฟ props์ state ๊ฐ์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ๋๋ค.
- componentDidUpdate ๋ฉ์๋์ ๊ฒฝ์ฐ์๋ render๊ฐ ๋ชจ๋ ์๋ฃ๋ ์ํ์ด๊ธฐ ๋๋ฌธ์ ๋ ๊ฐ์ ์ธ์๋ ๋ชจ๋ ๋ฐ๋๊ณ ๋์์
- ์ด์ ์ ๋ณด๋ฅผ ๊ฐ๊ฒ ๋๋ค.
3. UnMount: ์ปดํฌ๋ํธ๊ฐ ์ ๊ฑฐ๋ ๋
componentWillUnmount
์ปดํฌ๋ํธ๋ฅผ ๋์ด์ ์ฌ์ฉํ์ง ์์ ๋ ๋ฐ์ํ๋ ๋ฉ์๋๋ก, ์ฃผ๋ก DOM์ ์ง์ ๋ฑ๋กํ์๋ ์ด๋ฒคํธ๋ฅผ ์ ๊ฑฐํ๊ฑฐ๋, ๋ง์ฝ setTImeout ๊ฐ์ ๋น๋๊ธฐ ์์ ์ ์คํ์์ผฐ์ ๋, ์งํ์ ๋ฉ์ถ๋๋ก clearTimeout์ ๋ฃ์ด ์ปดํฌ๋ํธ๊ฐ ์ ๊ฑฐ๋๊ธฐ ์ ์ ์์ ์ด ์ ๊ฑฐ๋๋๋ก ํ๋ค.
1๏ธโฃ ํจ์ํ ์ปดํฌ๋ํธ
- ํด๋์คํ ์ปดํฌ๋ํธ๋ ์ปดํฌ๋ํธ ์ค์ฌ์ผ๋ก ๋์๊ฐ๋ ์๋ช ์ฃผ๊ธฐ์๋ค๋ฉด, ํจ์ํ ์ปดํฌ๋ํธ์ ๊ฒฝ์ฐ์๋ ํน์ ๋ฐ์ดํฐ์ ๋ํด ์๋ช ์ฃผ๊ธฐ๊ฐ ๋์๊ฐ๋ค.
- ํจ์ํ ์ปดํฌ๋ํธ์ ๊ฒฝ์ฐ์๋ ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋๊ฐ ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ Hook์ ์ฌ์ฉํ์ฌ ์๋ช ์ฃผ๊ธฐ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ค.
โ๏ธ๊ฐ๋จํ ์ฌ์ ์ง์
1. React Hook
: ๋ฆฌ์กํธ๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ฅ๊ณผ ๋ด๊ฐ ์์ฑํ ์ฝ๋๋ฅผ ์ฐ๋ํ์ฌ ๊ทธ ๊ฐ์ด๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ํจ์์ด๋ค.
2. Side Effect
: ํจ์ ์์์ ํจ์ ๋ฐ๊นฅ์ ์๋ ๊ฐ์ด๋ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ
useEffect
- react hook ์ค์์๋ ์ปดํฌ๋ํธ ํจ์์ ์ฌ์ด๋ ์ดํํธ(side Effect)๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ ํจ์์ด๋ค.
- useEffect ํ๋๋ก ์ปดํฌ๋ํธ์ mount,update, unMount ๋ ์ํ์์์ ์์ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค.
useEffect์ ๊ฒฝ์ฐ ๋ ๋ฒ์งธ ์ธ์๋ก ๋ฌด์์ ๋ฃ๋์ง์ ๋ฐ๋ผ ๋์ํ๋ ๊ณผ์ ์ด ๋ค๋ฅด๋ค.
1. ๊ฐ์ ๋ฃ์ ๊ฒฝ์ฐ
const [greeting, setGreeting] = useState('์๋
')
useEffect(()=> {
console.log({greeting});
},[greeting]);
- ์ปดํฌ๋ํธ๊ฐ ์ฒซ ๋ ๋๋ง๋ ๋์, greeting์ ๊ฐ์ด ๋ณํ ๋ ํด๋น ์ฝ๋ฐฑํจ์๊ฐ ์คํ๋๋ค.
- ๐ฐcomponentDidMount() + getDerivedStateFromProp ์ ์ญํ ์ํ
๋ง์ฝ์ componentDidMount์ ์ญํ ์ ๋ฌด์ํ๊ณ , getDerivedStateFromProp์ ์ญํ ๋ง ์ํํ๊ณ ์ถ๋ค๋ฉด?
useRef()์ ์ฌ์ฉํ์ฌ componentDidMount์ ์ญํ ์ ๋ฌด์ํ๋ค.
2. ๋น ๋ฐฐ์ด([ ])์ ๋ฃ์ ๊ฒฝ์ฐ
const [greeting, setGreeting] = useState('์๋
')
useEffect(()=> {
console.log({greeting});
},[]);
- ์ฒ์ ํ ๋ฒ๋ง ์คํ๋๊ณ , ๊ทธ ํ๋ก๋ ์คํ๋์ง ์๋๋ค.
- componentDidMount ์ญํ ์ํ
3. ์๋ฌด๊ฒ๋ ๋ฃ์ง ์์ ๊ฒฝ์ฐ
const [greeting, setGreeting] = useState('์๋
')
useEffect(()=> {
console.log({greeting});
});
- ๋ฐ์ดํฐ์ ๊ด๋ จ์์ด ๋ฆฌ๋ ๋๋ง์๋ง๋ค ์ฝ๋ฐฑํจ์๊ฐ ์คํ๋๋ค.
4. useEffect() ๋ด์ return ํด์ค ๊ฒฝ์ฐ
- return ํจ์๋ฅผ ์ด์ฉํด์ clean-up ํจ์๋ฅผ ๋ฆฌํดํด์ฃผ๋ฉด, ์ปดํฌ๋ํธ๊ฐ unmount ๋ ๋, ์ ๋ฆฌํด์ผํ ๊ฒ๋ค์ ์ฒ๋ฆฌํ ์ ์๋ค.
- ๐ฐ componentWillUnmount() ์ ์ญํ ์ํ
๐คทโ๏ธ ๊ทธ๋ ๋ค๋ฉด ์๋ช ์ฃผ๊ธฐ๋ฅผ ์ ์์์ผ ํ๋ ๊ฒ์ผ๊น?
"์๋ช ์ฃผ๊ธฐ๋ฅผ ๋ฐฐ์์ผํ๋ ์ด์ ๊ฐ ๋ฌด์์ผ๊น?"
์ ์ง๋ฌธ์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ณต๋ถํ๋ฉด์ ๋ฌธ๋ ๋ค์๋ ์๊ฐ์ด๋ค. ์ ๋ฐฐ์์ผํ๋ ๊ฒ์ผ๊น? ๋ฐฐ์ด๋ค๊ณ ํด๋ ์์ฆ์ ํด๋์คํ ์ปดํฌ๋ํธ๋ณด๋ค ํจ์ํ ์ปดํฌ๋ํธ๋ฅผ ๋ง์ด ์ฌ์ฉํ๋๋ฐ ์์ธํ๊ฒ ๋ฐฐ์ธ ํ์๊ฐ ์์๊น?
์ด ์ง๋ฌธ์ ๋ํ ๋ต์ ์๋ช ์ฃผ๊ธฐ์ ๊ฐ๋ ์ ๋ํด ์กฐ์ฌํด๋ณด๋ฉด์ ๋ง์ด ๊ณ ๋ฏผํด๋ณด์๋ค.
์ง๊ธ๊น์ง ์ฝ๋๋ฅผ ์ง๋ฉด์ ๋ด๊ฐ ์ ์ผ ๋ฌธ์ ๋ฅผ ๋ง์ด ๊ฒช์๋ ๋ถ๋ถ์ด state ๊ฐ์ด ๋ณํจ์ ๋ฐ๋ฅธ ๋น๋๊ธฐ ์์ ์ ๊ตฌํํ๋ ๋ถ๋ถ์ด์๋ค. ์ธ์ state ๊ฐ์ด ๋ณํํ๋ฉฐ, ๋ณํ๋ state ๊ฐ์ด ์ธ์ ๋น๋๊ธฐ ์์ ์ ๋ฐ์๋๊ณ , ์ด ์์ ์ ์ธ์ ์์ํ๋์ง ์ ๋ฐ์ ์ธ ์ปดํฌ๋ํธ์ ๋์ ๊ณผ์ ์ ๋ํ ๊ฐ๋ ์ด ๋ถ์กฑํ๋ค๊ณ ๋๊ผ๋ค.
์ด๋ฒ ๊ธฐํ์ Life Cycle์ ๋ฐฐ์ด ํ์, ๋ด๊ฐ ์ด๋ ๋ถ๋ถ์ ์ฝ๋๋ฅผ ์์ ํด์ผํ ์ง ๊นจ๋ฌ์๊ณ , ์์ผ๋ก ๋น์ทํ ๋ฌธ์ ๋ฅผ ๋ง๋ฅ๋จ๋ ธ์ ๋, ์ด๋ป๊ฒ ๋์ฒํด์ผํ ์ง ์ ๊ฒ ๊ฐ๋ค.
๊ฒฐ๊ตญ, React ์๋ช ์ฃผ๊ธฐ์ ๋ํ ์ ๋ฐ์ ์ธ ๊ณผ์ ์ ์ดํดํ๋ค๋ฉด ์ปดํฌ๋ํธ๊ฐ ์ด๋ป๊ฒ ๋์ํ๊ณ , ์ธ์ ์ด๋ค ์์ ์ ์ํํด์ผํ๋์ง์ ๋ํ ๊ฐ์ ์ก์ ์ ์๊ณ , ์ด๋ฅผ ํตํด ๋ด๊ฐ ๊ตฌํํ๊ณ ์ ํ๋ ๊ธฐ๋ฅ์ ์กฐ๊ธ ๋ ๋น ๋ฅด๊ฒ, ํจ์จ์ ์ผ๋ก ์์ฑ์ด ๊ฐ๋ฅํ๋ฉฐ, ์ ์ง๋ณด์ํ๊ธฐ ์ฝ๊ฒ ๋ง๋ค์ด์ค๋ค๊ณ ์๊ฐํ๋ค.
๐์ฐธ๊ณ ์๋ฃ
https://www.zerocho.com/category/React/post/579b5ec26958781500ed9955