๋ฆฌ์กํธ์ ์๋ช ์ฃผ๊ธฐ์ Hook์ ๋ํด ๋ชจ๋ฅด๋
ํ๋ก์ ํธ ์ฝ๋ ์์ฑ์ด ์ด๋ ค์์ง๊ธฐ ์์ํ๋ค.
์ด ๋์ ๋ํด ์์๋ณด์!
1. ์๋ช ์ฃผ๊ธฐ
- ๋ผ์ดํ ์ฌ์ดํด์ ์ปดํฌ๋ํธ๊ฐ ์ฌ์ฉ๋๊ณ ์๋ฉธ๋ ๋๊น์ง ์ผ๋ จ์ ๊ณผ์ ์ ๋งํ๋ค.
- ๋ผ์ดํ ์ฌ์ดํด์๋ mounting(์์ฑ) - updating(์ ๋ฐ์ดํธ) - unmounting(์ ๊ฑฐ)์ด ์์ผ๋ฉฐ, UI๋ฅผ ํ๋ฉด์ ๋ด๋ณด๋ด๊ณ ๋ค๋ฅธ UI๋ก ๋ณด์ด๊ฒ ํ๊ณ , ํ์ฌ ๋ณด์ด๋ UI๋ฅผ ํ๋ฉด์์ ์ ๊ฑฐํ๋ ๊ณผ์ ์ ๊ฐ์ง๋ค.
- ์ด ๊ณผ์ ์์๋ ํน์ ์์ ์ ์๋์ผ๋ก ํธ์ถ๋๋ ๋ฉ์๋๊ฐ ์๋ค.
- ์ ๋๋ก ๋ ๊ธฐ๋ฅ์ ์ํํ๊ธฐ ์ํด ์ด ๋ฉ์๋๋ค์ด ํ์ํ ์๊ฐ์ ํ์ํ ์์ ์ ํ๋ค.
- ๋ฆฌ์กํธ ๋ผ์ดํ ์ฌ์ดํด
[React] ๋ฆฌ์กํธ ๋ผ์ดํ ์ฌ์ดํด
๋ผ์ดํ ์ฌ์ดํด = ์๋ช ์ฃผ๊ธฐ
velog.io
2. ์ ์ฌ์ฉํ์ง ์๋ ํด๋์คํ ์ปดํฌ๋ํธ
Q. ๋จผ์ ! ๊ฒ์ํ๋ค๋ณด๋ฉด ํด๋์คํ ์ปดํฌ๋ํธ ์๋ช ์ฃผ๊ธฐ๊ฐ ์๊ณ ํจ์ํ ์ปดํฌ๋ํธ ์๋ช ์ฃผ๊ธฐ๊ฐ ์๋ค. ์ด ๋์ ์ฐจ์ด๊ฐ ๋ญ๊น?
A. ํด๋์คํ ์ปดํฌ๋ํธ๋ React.Component๋ฅผ ์์๋ฐ์ render( )์ ๋ผ์ดํ์ฌ์ดํด ๋ฉ์๋์ธ componentDidMount ๋ฑ์ผ๋ก ๋ง์ดํธ/์ ๋ฐ์ดํธ/์ธ๋ง์ดํธ ์์ ์ ๋ก์ง์ ๋ถ๋ฆฌํ๋ค. ํจ์ํ ์ปดํฌ๋ํธ๋ ๋จ์ํ ํจ์ ํํ๋ก ์์ฑ๋๋๋ฐ useState, useReducer๋ก ์ํ๋ฅผ ๊ด๋ฆฌํ๊ณ useEffect๋ฅผ ํตํด ๋ ๋๋ง ์ดํ ์คํ๋์ด์ผํ๋ ๋ถ์ํจ๊ณผ์ cleanup์ ๊ตฌํํ๋ค. ์์๋ ํจ์ํ + ํ ์ ๋๋ฆฌ ์ฌ์ฉํ๋ค. ๊ทธ๋์ ๋ฆฌ์กํธ ๋ผ์ดํ์ฌ์ดํด ํน์ ๋ฆฌ์กํธ ์๋ช ์ฃผ๊ธฐ๋ผ๊ณ ๊ฒ์ํ๋ฉด ํจ์ํ ์ปดํฌ๋ํธ์ธ useEffect์ ๋ํ ์ฌ์ดํด ์ค๋ช ์ด ๋ง์ด ๋์ค๋ ๋ฏ ํ๋ค.
- ์ ์ฌ์ฉํ์ง ์๋ ๋ฉ์๋

[์์ฑ]
a) ์์ฑ๋ ๋๋ constructor - static getDerivedStateFromProps - render - React updates DOM and refs - componentDidMount ์์๋ฅผ ๊ฐ์ง๋ค.
b) ์ด ๊ณผ์ ์ค static getDerivedStateFromProps๋ ์ง๊ธ์ ์ ์ฌ์ฉํ์ง ์๋๋ค.
c) static getDerivedStateFromProps๋ props ๋ณํ์ ๋ฐ๋ผ state๋ฅผ ๊ณ์ฐํด์ ๋๊ธฐํ ํ ๋ ์ฌ์ฉํ๋๋ฐ, props์ state๊ฐ ๊ฐ์ ์๋ฏธ์ ๋ฐ์ดํฐ๋ฅผ ๋์์ ๋ค๊ณ ์์ ๊ฒฝ์ฐ ์ฑํฌ๊ฐ ๊ผฌ์ด๋ ๋ฑ ๋ฌธ์ ๋ก ์ธํด ์ ์ฌ์ฉํ์ง ์๋๋ค.
[์
๋ฐ์ดํธ]
a) ์
๋ฐ์ดํธ ํ ๋๋ static getDerivedStateFromProps - shouldComponentUpdate - render - getSnapshotBeforeUpdate - React updates DOM and refs - componentDidUpdate ์์๋ฅผ ๊ฐ์ง๋ค.
b) ์ด ๊ณผ์ ์ค static getDerivedStateFromProps, shouldComponentUpdate(nextProps, nextState), getSnapshotBeforeUpdate(prevProps, prevState) ์ ์ฌ์ฉํ์ง ์๋๋ค.
c) shouldComponentUpdate(nextProps, nextState)๋ ์
๋ฐ์ดํธ๋ฅผ ํ ์ง ๋ง์ง ๊ฒฐ์ ํ๋ ์ญํ ์ ํ๋๋ฐ, ์
๋ฐ์ดํธ๋ฅผ ๋ง์์ง ๋ง์ง์ ๋ํ ํ๋จ ์ค์๋ก ์ธํด ์ง๊ธ์ ์ ์ฌ์ฉํ์ง ์๋๋ค.
d) getSnapshotBeforeUpdate(prevProps, prevState)๋ DOM์ด ๋ฐ๊พธ๊ธฐ ์ ์ ํ์ฌ DOM ์ํ๋ฅผ ์ฝ์ด ์ค๋
์ท ๊ฐ์ ๋ฐํํ๋ค. ์ด ๋ฉ์๋์ ๊ฒฝ์ฐ ํน์ํ ๊ฒฝ์ฐ ์ฌ์ฉํ๋ค.
[Deprecated]
a) Deprecated๋ก ๋ ์ด์ ์ฌ์ฉํ์ง ์๋ ๊ฒ๋ค๋ ์์ผ๋ฉฐ, ์ฌ์ฉํ๋ ค๋ฉด ์์ unsafe๋ฅผ ๋ถ์ฌ์ผํ๋ค.
b) Deprecated๋ ๋ฉ์๋๋ componentWillMount, componentWillReceiveProps,componentWillUpdate๊ฐ ์๋ค.
c) will-์ ์ด๋ค ์์
์ ์ํํ๊ธฐ ์ ์ ์คํ๋๋ ๋ฉ์๋์ ๊ด๋ จ๋ ์ฉ์ด์ด๋ฉฐ ๋ ๋๋ง ๋จ๊ณ ์ชฝ์ ๋ถ์ด์๋ค.
d) ๋์ด์ ์ฌ์ฉํ์ง ์๋ ์ด์ ๋ ์์ ๋ฉ์๋๋ค์ ๋ถ์ํจ๊ณผ(๋คํธ์ํฌ ์์ฒญ, ์ด๋ฒคํธ ๋ฑ๋ก, ๋ก๊ทธ/ํธ๋ํน, ํ์ด๋จธ ์์)๋ฅผ ๋ฃ์ ์ ์๋๋ฐ, ๋ถ์ํจ๊ณผ๋ก ์ธํด ์ค๋ณต์ด ์ผ์ด๋๋ฉด์ ๋ฒ๊ทธ๊ฐ ํฐ์ง๊ธฐ ์ฝ๊ธฐ ๋๋ฌธ์ด๋ค.
e) ์์ ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅํ ๊ฒ์ ์๋๊ณ UNSAFE_ ์ ๋์ด๋ฅผ ๋ถ์ด๋ฉด ์ฌ์ฉํ ์ ์๋ค.
3. ํด๋์คํ ์ปดํฌ๋ํธ ์๋ช ์ฃผ๊ธฐ

[Mounting - ์์ฑ]
- ๋ง์ดํ
๊ด๋ จ ํจ์๋ค์ ์ฒ์ render๊ฐ ํธ์ถ๋ ํ, component๊ฐ ์์ฑ(instanceํ)๋๊ณ , ์ค์ DOM์ผ๋ก ์ ์ฉ๋ ๋ ๊น์ง๋ฅผ ๋ด๋นํ๋ค. render๋ฅผ ์ ์ธํ๊ณ ํ๋ฒ์ฉ๋ง ํธ์ถ๋๋ค๊ณ ๋ณด๋ฉด ๋๋ค.
- constructor(props)
a) React component๊ฐ mount ๊ณผ์ ์์ ๊ฐ์ฅ ๋จผ์ ํธ์ถ๋๋ค. → DOM์ผ๋ก mount๋๊ธฐ ์ ์ ํธ์ถ๋๋ค.
b) ์ปดํฌ๋ํธ๊ฐ ํธ์ถ๋์ด ๋ก๋๊ฐ ๋ ์ดํ ๋ ๋๋ง๋๊ธฐ ์ด์ ์ '๋ฐ์ดํฐ๋ฐ์ธ๋ฉ', '์ด๊ธฐํ'๋ฅผ ์ํํ๊ธฐ ์ํด ํธ์ถ๋๋ ํจ์๋ฅผ ์๋ฏธํ๋ค.
c) ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ ํ๋ฉด์์ ๋ณด์ฌ์ง๋ ๋ฐ์ดํฐ(View)์ ๋ธ๋ผ์ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์๋ ๋ฐ์ดํฐ(Model)์ ๋ฌถ์ด์(Binding) ์๋ก ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋๊ธฐํํ๋ ๊ฒ์ ์๋ฏธํ๋ค. ์๋ฅผ ๋ค๋ฉด, ๋ณ๊ฒฝ๋ ๊ฐ์ ๋ฐ๋ผ์ HTML ์์ ๋ฐ์ดํฐ๋ฅผ ๋ง์ถ์ด ์ฃผ๋ ๋์์ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ด๋ผ๊ณ ํ๋ค. (์ฝ๊ฐ ๊ณ์ฐ๊ธฐ ๊ฐ์ ๊ฒ?)
d) ํด๋น ํจ์ ๋ด๋ถ์์, component์ state์ ์ ์ฅ๊ณต๊ฐ์ ๋ณ์๊ฐ์ ์ด๊ธฐํํ ๋ ์ฌ์ฉํ๋ค. state๋ฅผ ๋ณ๋๋ก ์ฌ์ฉํ ํ์๊ฐ ์๋ค๋ฉด, constructor์ ์์ฑํ์ง ์์๋ ๋ฌด๋ฐฉํ๋ค.
e) ์๋ ์ฝ๋๋ฅผ ํ์ธํด๋ณด๋ฉด ํจ์์ ์ฒซ๋ฒ์งธ ๋ผ์ธ์ ๋ฐ๋์ super(props)์ ํธ์ถํ๋ค. ๋ฏธํธ์ถ์ props๊ฐ ์์ฑ๋์ง ์์ ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ ์ ์๋ค.
f) constructor์ ์๋ฌด๊ฒ๋ ๋ฐํํด์ ์๋๋ฉฐ, ์ด๊ณณ์์ side effect๋ subscription์ ์คํํ๋ฉด ์๋๋ค. ์๋ side effect์ subscription์ด ๋ฌด์์ธ์ง ์ ์ํ๋ค. ์ด๊ฒ๋ค์ ์ฌ๊ธฐ์ ์ฌ์ฉํ๋ฉด ์๋๋ ์ด์ ๋ ์ ๋ฆฌ(clean up)๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์ด๋ค. constructor์ ์ปดํฌ๋ํธ๊ฐ ํ๋ฉด์ ๋ถ๊ธฐ ์ ์ธ๋ฐ, constructor์์ side effect๋ subscription์ ์ฌ์ฉํ๋ฉด ์ปดํฌ๋ํธ ํ๋ฆ์ด ๋ณ๊ฒฝ๋์์ ๋ ์ ๋ฆฌ ํ์ด๋ฐ์ด ๊ผฌ์ผ ์ ์๋ค.
constructor(props) {
super(props);
this.state = { counter: 0 };
this.handleClick = this.handleClick.bind(this);
}
Q. side effect์ subscription์ ๋ฒ์ญํ๋ฉด ๋ถ์ํจ๊ณผ์ ๊ตฌ๋ ์ด๋ผ๊ณ ํ๋ค. ์ด๊ฒ ์ ํํ ์ด๋ค ๊ธฐ๋ฅ์ผ๊น?
A. React์์ side effect๋ ์ปดํฌ๋ํธ๊ฐ UI๋ฅผ ๋ ๋ํ๋ ๊ฒ ๋ง๊ณ ์ปดํฌ๋ํธ ๋ฐ์ ์ํฅ์ ์ฃผ๊ฑฐ๋, ์ธ๋ถ ์ํ๋ฅผ ๊ฑด๋๋ฆฌ๋ ๋ชจ๋ ์์ ์ ๋งํ๋ค. ๋ถ์ํจ๊ณผ ์์๋ก ๋คํธ์ํฌ ์์ฒญ(fectch), DOM ์ง์ ์กฐ์, ํ์ด๋จธ(setInterval, setTimeout), ์ด๋ฒคํธ ๋ฆฌ์ค๋ ๋ฑ๋ก ๋ฑ์ด ์๋ค.
subscription์ ์ด๋ฐ ๋ถ์ํจ๊ณผ ์ค ๊ณ์ํด์ ๋ค์ด์ค๋ ์ด๋ฒคํธ๋ ๋ฐ์ดํฐ๋ฅผ ๋ค์ด์ผํ๋ ์ํ๋ฅผ ์๋ฏธํ๋ค. ์ด๋ ๊ฒ ๋งํ๋ฉด subscription์ด ์ด๋ค ๊ฒ๋ค์ธ์ง ์ดํด๊ฐ ์ ์๊ฐ๋ค. ์นด์นด์คํก๊ณผ ๊ฐ์ ๋ฉ์ ์ ๋ค์ ์ฌ์ฉ์๊ฐ ๊ฐ๋งํ ์์ด๋ ์ฑํ ์ด๋ ์ค์๊ฐ ์๋์ด ์ค๋ฉด ์๋ฒ๊ฐ ์ ๋ฉ์์ง๋ฅผ ์์๋ก ๋ณด๋ด์ค๋ค. ์ฌ์ฉ์๊ฐ ๊ฐ๋งํ ์์ด๋ ๋ฐ์ดํฐ๊ฐ ๋ค์ด์จ ๊ฒ์ด๋ค. subscription์ ์๋ฒ๊ฐ ๋ณด๋ด๋ ๋ฉ์์ง ์ด๋ฒคํธ๋ฅผ ๊ณ์ ๋ค์๋ค๊ฐ ์ ๋ฉ์์ง๊ฐ ์ค๋ฉด ํ๋ฉด์ ์ ๋ฐ์ดํธํ๋ค. ์์ฃผ ๋ํ์ ์ธ subscription์ ์์์ด๋ค. ์ด๋ ๋ฏ ๊ตฌ๋ ์ ํ ๋ฒ ์คํํ๊ณ ๋์ด ์๋ ๋ฑ๋กํด๋๋ฉด ๊ณ์ ํธ์ถ๋๋ ๊ฒ์ ๋งํ๋ค. ๊ทธ๋์ subscription์ ๊ณ์ ํธ์ถ๋๊ธฐ ๋๋ฌธ์ ๋ฐ๋์ ๋์ค์ ํด์ (unsubscribe/cleanup)๊ฐ ํ์ํ๋ค.
Component – React
The library for web and native user interfaces
react.dev
- render( )
a) ๋ฏธ๋ฆฌ ๊ตฌํ๋ HTML์ ํ๋ฉด์์ ๊ทธ๋ ค์ง๋ ๊ณผ์ ์ ์ํํ๋ ํจ์๋ฅผ ์๋ฏธํ๋ค.
b) React๋ render๋ฅผ ์ธ์ ๋ ์ง ํธ์ถํ ์ ์์ผ๋ฏ๋ก ํน์ ์๊ฐ์ ์คํ๋๋ค๊ณ ๊ฐ์ ํ๋ฉด ์๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ค ๋งค๊ฐ๋ณ์๋ ๋ฐ์ง ์๋๋ค.
c) render( )์์์ state ๋ณ๊ฒฝ(setState)์ ๊ธ์งํ๋ค. ๊ทธ ์ด์ ๋ ๋ฌดํ ๋ฃจํ์ ์ํ์ด ์๊ธฐ ๋๋ฌธ์ด๋ค.
d) render ๋ฉ์๋๋ ์์ ํจ์๋ก ์์ฑํด์ผ ํ๋ค. ์ฆ, props, state ๋ฐ context๊ฐ ๋์ผํ ๊ฒฝ์ฐ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํด์ผํ๋ค.
e) side effect ํน์ subscription์ ํฌํจํ๊ฑฐ๋ ๋ธ๋ผ์ฐ์ API์ ์ํธ์์ฉํ๋ฉด ์๋๋ค.
f) ์ ๋ฐ์ดํธ์ render์ ๋์ผํ ํจ์์ด๋ค.
import { Component } from 'react';
class Greeting extends Component {
render() {
return <h1>Hello, {this.props.name}!</h1>;
}
}
Component – React
The library for web and native user interfaces
ko.react.dev
- componentDidMount( )
a) ํ๋ฉด์ด ๋ ๋๋ง ๋ ์ดํ์ ํด๋น ์ปดํฌ๋ํธ๋ฅผ DOM ํธ๋ฆฌ์ ์ฝ์ (๋ง์ดํธ)์ด ๋๋ฉด ๋ฐ์ํ๋ ๋ฉ์๋๋ฅผ ์๋ฏธํ๋ค.
b) ์๋ฐ์คํฌ๋ฆฝํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋๋ ํ๋ ์์ํฌ์ ํจ์๋ฅผ ํธ์ถํ๊ฑฐ๋ ์ด๋ฒคํธ ๋ฑ๋ก์ ์ฌ์ฉ๋๋ค.
c) setTimeout, setInterval, ๋คํธ์ํฌ ์์ฒญ ๊ฐ์ ๋น๋๊ธฐ ์์ ์ ์ฒ๋ฆฌํ ๋ ์ฌ์ฉ๋๋ค.
d) ์ฆ, ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์์ํ๊ฑฐ๋ ํน์ ๊ตฌ๋ ์ ์ค์ ํ๊ฑฐ๋ ํน์ DOM ๋ ธ๋๋ฅผ ์กฐ์ํ ์ ์๋ค.
e) componentDidMount๋ฅผ ๊ตฌํํ๋ฉด ์ผ๋ฐ์ ์ผ๋ก ๋ฒ๊ทธ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ค๋ฅธ ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋๋ฅผ ๊ตฌํํ๋ค.
f) componentDidMount๊ฐ ์ผ๋ถ state๋ props๋ฅผ ์ฝ๋ ๊ฒฝ์ฐ ๋ณ๊ฒฝ ์ฌํญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด componentDidUpdate๋ฅผ ๊ตฌํํ๊ณ componentDidMount๊ฐ ์ํํ๋ ์์ ์ ์ ๋ฆฌํ๊ธฐ ์ํด componentWillUnmount๋ ๊ตฌํํ๋ค.
g) componentDidMount๋ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค. ๊ทธ๋ฆฌ๊ณ ์๋ฌด๊ฒ๋ ๋ฐํํ์ง ์์์ผ ํ๋ค.
h) setState๋ฅผ ์ฆ์ ํธ์ถํ ์ ์์ง๋ง, ์ข ์ข ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ๋ฐ์์ํค๋ฏ๋ก ์ฃผ์ํ์ฌ ์ฌ์ฉํด์ผํ๋ค.
class ChatRoom extends Component {
state = {
serverUrl: 'https://localhost:1234'
};
componentDidMount() {
this.setupConnection();
}
// ์
๋ฐ์ดํธ๋ฅผ ํ๋ ๊ฒฝ์ฐ ์ด ๋ฉ์๋๊ฐ ํธ์ถ๋๋ค.
componentDidUpdate(prevProps, prevState) {
if (
this.props.roomId !== prevProps.roomId ||
this.state.serverUrl !== prevState.serverUrl
) {
this.destroyConnection();
this.setupConnection();
}
}
// ํ๋ฉด์์ ์ ๊ฑฐ(๋ง์ดํธ ํด์ )๋๊ธฐ ์ ์ ์ด ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.
componentWillUnmount() {
this.destroyConnection();
}
}
โ
์ฌ๊ธฐ์ ์ค์ํ ์ฌ์ค
- ์ค์ ๋ก ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ ๋ค๋ฅธ ๊ฐ๋ฐ์๋ถ๋ค์ ์ฝ๋๋ฅผ ์ดํด๋ณด๋ฉด componentDidMount, componentDidupdate, componentWillUnmount ์ฝ๋๋ฅผ ์ฌ์ฉํ ๊ฒ์ ๊ฑฐ์ ๋ณธ ์ ์ด ์์๋ค. ๋๋ถ๋ถ useEffect, cleanup ์ฝ๋๋ฅผ ์ฌ์ฉํ๊ณ ์์๋ค.
- componentDidMount, componentDidUpdate ๋ฐ componentWillUnmount๋ฅผ ํด๋์ค ์ปดํฌ๋ํธ์ ํจ๊ป ์ ์ํ๋ ๊ฒ์ ํจ์ ์ปดํฌ๋ํธ์์ useEffect๋ฅผ ํธ์ถํ๋ ๊ฒ๊ณผ ๊ฐ๊ธฐ ๋๋ฌธ์ ์์ ๋๋ถ๋ถ์ useEffect๋ก ์์ฑํ์ฌ ์์ ์ฝ๋๋ค์ ๋ณด๊ธฐ ์ด๋ ค์ ๋ค. ์ด ๋ง์ ์๊น ๋งจ ์์ ์์ฑํ๋, 'ํจ์ํ + ํ ์ ๋๋ฆฌ ์ฌ์ฉํ๋ค.'์ ๊ฐ์ ๋ง์ด๋ค.
Component – React
The library for web and native user interfaces
ko.react.dev
[Updating - ์ ๋ฐ์ดํธ]
- componentDidUpdate( )
a) ์ปดํฌ๋ํธ ๋ด์์ ๋ณํ๊ฐ ๋ฐ์๋ ์ดํ ํธ์ถ๋๋ ๋ฉ์๋๋ฅผ ์๋ฏธํ๋ค.
b) ์ปดํฌ๋ํธ๊ฐ ์ ๋ฐ์ดํธ๋ props ๋๋ state๋ก ๋ค์ ๋ ๋๋ง๋ ์งํ React๊ฐ ์ด ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.
c) ํ์ฌ props๋ฅผ ์ด์ props์ ๋น๊ตํ๋ ํ ๋คํธ์ํฌ ์์ฒญ์ ์ํํ๊ธฐ๋ ํ๋ค.
d) ์ ๋ฐ์ดํธ ํ DOM์ ์กฐ์ํ๋๋ฐ ์ฌ์ฉํ ์ ์๋ค.
e) ๋งค๊ฐ๋ณ์๋ก prevProps(์ ๋ฐ์ดํธ ์ด์ ์ props), prevState(์ ๋ฐ์ดํธ ์ state), snapshot(getSnapshotBeforeUpdate๋ฅผ ๊ตฌํํ ๊ฒฝ์ฐ, snapshot์๋ ํด๋น ๋ฉ์๋์์ ๋ฐํํ ๊ฐ์ ํฌํจํจ)์ ๊ฐ์ง๋ค.
f) ์ด ๋ฉ์๋๋ ์๋ฌด๊ฒ๋ ๋ฐํํ์ง ์๋๋ค.
g) setState๋ฅผ ์ฆ์ ํธ์ถํ ์ ์์ง๋ง, ์ข ์ข ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ๋ฐ์์ํค๋ฏ๋ก ์ฃผ์ํ์ฌ ์ฌ์ฉํด์ผํ๋ค.
componentDidUpdate(prevProps, prevState) {
if (
this.props.roomId !== prevProps.roomId ||
this.state.serverUrl !== prevState.serverUrl
) {
this.destroyConnection();
this.setupConnection();
}
}
Component – React
The library for web and native user interfaces
ko.react.dev
[Unmounting - ์ ๊ฑฐ]
- componentWillUnmount( )
a) ์ปดํฌ๋ํธ๊ฐ DOM์์ ์ ๊ฑฐ๋๊ธฐ ์ง์ ์ ํธ์ถ๋๋ ๋ฉ์๋์ด๋ค.
b) ์ปดํฌ๋ํธ์์ ์ฌ์ฉ ์ค์ธ ๋ฆฌ์์ค๋ฅผ ํด์ ํ๊ฑฐ๋ ๊ตฌ๋ ์ ์ทจ์ํ๋ ๊ฒฝ์ฐ ์ํ๋๋ค.
c) ํ์ด๋จธ๋ฅผ ํด์ ํ๋ ๊ฒฝ์ฐ ์ํ๋๊ณ ๋คํธ์ํฌ ์์ฒญ์ ์ทจ์ํ๋ ๋ฑ์ ํด๋ฆฐ์ ์์ ์ ํ๋ ๊ฒจ์ฐ ์ํ๋๋ค.
d) componentDidMount๊ฐ ๊ตฌ๋ ์ ์ค์ ํ๋ฉด componentWillUnmount๋ ํด๋น ๊ตฌ๋ ์ ์ ๋ฆฌํด์ผํ๋ค.
e) componentWillUnmount์ ์ ๋ฆฌ ๋ก์ง์ด ์ผ๋ถ props๋ state๋ฅผ ์ฝ๋ ๊ฒฝ์ฐ, ์ผ๋ฐ์ ์ผ๋ก ์ด์ props๋ state์ ํด๋นํ๋ ๋ฆฌ์์ค๋ฅผ ์ ๋ฆฌํ๊ธฐ ์ํด componentDidUpdate๋ ๊ตฌํํด์ผํ๋ค.
f) ์ด๋ค ๋งค๊ฐ๋ณ์๋ ๋ฐ์ง ์์ผ๋ฉฐ, ์ด๋ค ๊ฐ๋ ๋ฐํํ์ง ์๋๋ค.
componentWillUnmount() {
this.destroyConnection();
}
Component – React
The library for web and native user interfaces
ko.react.dev
4. ํจ์ํ ์ปดํฌ๋ํธ์ Hook
- ํจ์ํ ์ปดํฌ๋ํธ๋ ํ๋ฉด์ ๋ง๋๋ ํจ์์ด๋ค.
- Hook์ ํจ์ํ ์ปดํฌ๋ํธ ์์์ ์ํ/๋ถ์ํจ๊ณผ ๊ฐ์ React ๊ธฐ๋ฅ์ ์ฐ๊ฒ ํด์ฃผ๋ ํน์ํ ํจ์์ด๋ค.
- ๋ํ์ ์ธ Hook์ ์ข
๋ฅ
a) useState : ์ํ
b) useEffect : ๋ถ์ํจ๊ณผ/๊ตฌ๋ /์ ๋ฆฌ
c) useRef : DOM ์ฐธ์กฐ/๊ฐ ๋ณด๊ด
d) useMemo, useCallback : ์ฑ๋ฅ์ต์ ํ
e) useContext : ์ ์ญ์ฒ๋ผ ๊ณต์ ๋๋ ๊ฐ ์ฝ๊ธฐ
f) useReducer : ๋ณต์กํ ์ํ ๋ก์ง
import { useState } from "react";
function Counter() {
const [count, setCount] = useState(0);
return (
<button onClick={() => setCount(count + 1)}>
{count}
</button>
);
}
์ฝ๋๋ฅผ ๋ณด๊ณ ์ง๊ด์ ์ผ๋ก ์ดํดํด๋ณด์. ์ฌ๊ธฐ์ ํจ์ํ ์ปดํฌ๋ํธ๋ Counter๊ฐ ๋๋ค. ํ ์ useState๊ฐ ๋๋ค. ํด๋น ์ฝ๋์ ์์ง์์ ๋ฒํผ์ ํด๋ฆญ์, ์ํ๊ฐ ๋ฐ๋๋ค. ๊ทธ๋ฌ๋ฉด React๊ฐ Counter()๋ฅผ ๋ค์ ํธ์ถํด์ UI๋ฅผ ๋ค์ ๊ทธ๋ฆฐ๋ค.
ํจ์ํ ์ปดํฌ๋ํธ์ ๋ผ์ดํ ์ฌ์ดํด์ ์ปดํฌ๋ํธ๊ฐ ๋ฑ์ฅ(Mount) → ๋ณ๊ฒฝ(Update) → ์ ๊ฑฐ(Unmount)์ ํ๋ฆ์ ๊ฐ๋๋ค. ๊ทธ๋ฌ๋ฉด ํ ์ ๋ผ์ดํ ์ฌ์ดํด์ ์ด๋จ๊น? ํ ์ ํจ์ํ ์ปดํฌ๋ํธ์ ๋ผ์ดํ ์ฌ์ดํด ์์์ ํ ์ด ์ธ์ ์คํ๋๊ณ ์ธ์ ์ ๋ฆฌ(cleanup)๋๋์ง๊ฐ ์ค์ํด์ ํด๋์คํ ์ปดํฌ๋ํธ์ ํจ์ํ ์ปดํฌ๋ํธ์ฒ๋ผ ๋ผ์ดํ ์ฌ์ดํด์ ๊ฐ์ง๊ณ ์๋ค๊ณ ๋ณด๊ธด ์ด๋ ค์ธ ๋ฏ ํ๋ค. ๊ทธ ์ค ๋ผ์ดํ ์ฌ์ดํด์ด ์๋ค๊ณ ๋ณด๊ธฐ ๊ฐ์ฅ ์ข์ ํ ์ useEffect์ด๋ค. ํจ์ํ ์ปดํฌ๋ํธ๋ ๋ ๋ ์ค์ฌ์ผ๋ก ๋์๊ฐ๋ฉด useEffect๋ ๋ ๋๊ฐ ํ๋ฉด์ ๋ฐ์๋ ๋ค์ ๋ถ๋๋ฐ ํ์ฒ๋ฆฌ ์ฅ์น๋ก ์๊ฐํ๋ฉด ๋๋ค.
Q. Counter๊ฐ ํจ์ํ ์ปดํฌ๋ํธ์ธ ์ด์ ๋?
A. ํจ์ํ ์ปดํฌ๋ํธ๋ UI๋ฅผ ๋ฐํํ๋ ํจ์๋ผ์ return์ <div>...</div>์ ๊ฐ์ ์ฝ๋๊ฐ ์๋ค. ์์ ์ฝ๋๋ <button>...</button>์ ์ ์๋ค. ์ด๋ ๊ฒ ์๊ธด ๊ฒฝ์ฐ ๋๋ถ๋ถ ํจ์ํ ์ปดํฌ๋ํธ๋ผ๊ณ ๋ณด๋ฉด ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฆ์ด ๋๋ฌธ์๋ก ์์ํด์ผํ๋ค. ์๋ฌธ์๋ก ์์ํ ๊ฒฝ์ฐ JSX๊ฐ HTML ํ๊ทธ์ฒ๋ผ ์คํดํ ์ ์๋ค. ํนํ ์์ ์ฝ๋์ฒ๋ผ ํ ์ ์ฌ์ฉํ๋ฉด์ JSX๋ฅผ ๋ฆฌํดํ๋ ๊ฒฝ์ฐ ๊ฑฐ์ ํจ์ํ ์ปดํฌ๋ํธ๋ผ๊ณ ๋ณผ ์ ์๋ค.
5. ํด๋์คํ ์ปดํฌ๋ํธ VS ํจ์ํ ์ปดํฌ๋ํธ์ Hook
- ํด๋์คํ ์ปดํฌ๋ํธ ์ฝ๋
import React from "react";
// ๊ตฌ์กฐ๊ฐ ๋ค๋ฅธ ๊ฑธ ํ์ธํ ์ ์๋ค.
// ํจ์ํ์ function Counter๋ก ์ผ๋ค.
// ๋ฆฌ์กํธ๊ฐ Counter์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค๊ณ ๊ทธ ๊ฐ์ฒด๋ฅผ ๊ณ์ ๋ค๊ณ ์๋ค.
class Counter extends React.Component {
state = {
count: 0,
};
handleClick = () => {
this.setState((prevState) => ({
count: prevState.count + 1,
}));
};
// ํด๋์คํ์ ๋ฐ๋์ render() ๋ฉ์๋ ์์์ return์ ์จ์ผํ๋ค.
// ํจ์ํ์ return์ด ๊ณง ๋ ๋ ๊ฒฐ๊ณผ์ด๋ค.
render() {
return (
<button onClick={this.handleClick}
// ์ ๊ทผํ ๋ this.state.count๋ก ํด์ผํ๋ค.
// ํจ์ํ์ this ์์ด ๊ทธ๋ฅ count, setCount ๋ณ์๋ก ์ฌ์ฉํ๋ค.
{this.state.count}
</button>
);
}
}
export default Counter;
- ํจ์ํ ์ปดํฌ๋ํธ + ํ
import { useState } from "react";
function Counter() {
const [count, setCount] = useState(0);
return (
<button onClick={() => setCount(count + 1)}>
{count}
</button>
);
}