React์ Hook
ํ์ต ํค์๋
React Hook ์ด๋
HOC ๊ณ ์ฐจ ์ปดํฌ๋ํธ
React Hook
Hook
์ ๋ฆฌ์กํธ v16.8์ ์๋ก ๋์ ๋ ๊ธฐ๋ฅ์ด๋ค.ํด๋์คํ ์ปดํฌ๋ํธ ๊ณ ์ ๊ธฐ๋ฅ์ธ ์ํ(state)๊ด๋ฆฌ์ ๋ผ์ดํ์ฌ์ดํด ๊ด๋ฆฌ ๊ธฐ๋ฅ์ ํจ์ํ ์ปดํฌ๋ํธ์์๋ ์ธ ์ ์๋๋ก ํด์ฃผ๋ ํจ์๋ค์ ์ด์นญํ๋ค.
๐ React Hook์ ๋ฑ์ฅ ๋ฐฐ๊ฒฝ
๋ฆฌ์กํธ ์ปดํฌ๋ํธ๋ ํด๋์คํ ์ปดํฌ๋ํธ(Class Component)์ ํจ์ํ ์ปดํฌ๋ํธ(Functional Component)๋ก ๋๋๋ค. ๊ธฐ์กด์ ๊ฐ๋ฐ๋ฐฉ์์ ์ผ๋ฐ์ ์ผ๋ก ํจ์ํ ์ปดํฌ๋ํธ๋ฅผ ์ฃผ๋ก ์ฌ์ฉํ๋ state์ด๋ Life Cycle Method๋ฅผ ์ฌ์ฉํด์ผ ํ ๋์๋ง ํด๋์คํ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์์ด์๋ค.
์์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ๋ ๋ช๊ฐ์ง ๋ฌธ์ ์ ๋ค์ด ์์๋ค.
๐จ Wrapper Hell (์ํ๋ก์ง์ ์ฌ์ฌ์ฉ์ฑ ์ด๋ ค์)
๋ฆฌ์กํธ๋ฅผ ์ฐ๋ค ๋ณด๋ฉด ์์ฃผ ์ฐ๋ ๋ก์ง์ ๋ฐ๋ก ๋นผ๋ด์ ์ฌ์ฉํ ํ์๊ฐ ์๋๋ฐ HOC(High Order Component)๋ฅผ ์ด์ฉํด์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
๐ HOC(High Order Component) ๊ณ ์ฐจ ์ปดํฌ๋ํธ ํ๋ฉด์์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๋ก์ง๋ง์ ๋ถ๋ฆฌํด์ component๋ก ๋ง๋ค๊ณ , ์ฌ์ฌ์ฉ ๋ถ๊ฐ๋ฅํ UI์ ๊ฐ์ ๋ค๋ฅธ ๋ถ๋ถ์ Parameter๋ก ๋ฐ์์ ์ฒ๋ฆฌํ๋๋ก ํ๋ ํจํด โ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ๋ฅผ ์ธ์๋ก ๋ฐ์์ ์๋ก์ด ๋ฆฌ์กํธ ์ปดํฌ๋ํธ๋ฅผ ๋ฆฌํดํ๋ ํจ์
ํ์ง๋ง HOC์ ์ฌ์ฉํ์ ๋, Wrapper hell์ด๋ผ๋ ๋ ๋ค๋ฅธ ๋ฌธ์ ๊ฐ ๋ฐ์ ํ๋ค. "Wrapper hell" ์ ์ค์ฒฉ๋๋ Component๊ฐ ๋ง์์ ธ depth๊ฐ ๊น์ด์ง๊ฒ ๋์ด ์ฝ๋ ์ถ์ ์ ์ด๋ ต๊ฒ ๋ง๋ค๊ณ ์ปดํฌ๋ํธ์ ์ฌ๊ตฌ์ฑ์ ๊ฐ์ํ๊ฒ ํ๋ค.
HOC ๊ณ ์ฐจ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ ์ฝ๋
SomeComponent๊ฐ ๋ง์ฐ์ค ํฌ์ง์ , window ํฌ๊ธฐ, ์ ์ ์์น ๋ฑ์ ์ ๋ณด๊ฐ ํ์ํ๋ค๋ฉด ์๋์ ๊ฐ์ด HOC๊ตฌ์กฐ๊ฐ ๋ฐ์ํ๋ค. ์ด๋ฐ ๊ตฌ์กฐ๋ ๊ฐ๋ ์ฑ๋ ์ข์ง์๊ณ element๋ฅผ ์ฐพ๊ธฐ ํ๋ค์ด์ง๋ค.
const HocHell = () => {
return (
<Hoc1>
<WithMousePosition>
<WithWindowSize>
<WithUserLocation>
<SomeComponent />
</WithUserLocation>
</WithWindowSize>
</WithMousePosition>
</Hoc1>
);
};
Custom Hook์ ์ฌ์ฉํ ์ฝ๋
Custom Hook์ ํตํด ๋ชจ๋ํํ์ฌ SomeComponent ์ ๋ฌํ๊ธฐ ๋๋ฌธ์ ๊ณ์ธต๊ตฌ์กฐ๊ฐ ๋จ์ํด์ง๋ฉฐ ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํด์ง๋ค.
const WithHook = () => {
const mousePosition = useMousePosition()
const windowSizes = useWindowSize()
const userLocation = useUserLocation()
return (
<SomeComponent
mousePosition={mousePosition}
windowSizes={windowSizes}
userLocation={useLocation}
/>
)
}
โ Hook์ ๊ณ์ธต์ ๋ณํ ์์ด ์ํ ๊ด๋ จ ๋ก์ง์ ์ฌ์ฌ์ฉํ ์ ์๋๋ก ๋์์ค๋ค.
๐จ Huge Components (์ดํดํ๊ธฐ ์ด๋ ค์ด ๋ณต์กํ ์ปดํฌ๋ํธ)
๐ค ๋ง์ฝ ํ ์ปดํฌ๋ํธ๋ ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ ๋์ ๋ ๊ทธ๋ฆฌ๊ณ PathName Prop์ด ๋ณ๊ฒฝ๋์ ๋ lookups ๋ฐ์ดํฐ๋ฅผ API์์ ๋ฐ์์์ผ ํ๋ค๊ณ ํ์ ๋?
Classํ ์ปดํฌ๋ํธ์ LifeCycle ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ฝ๋
componentDidMount, componentDidUpdate์ LifeCycle API๋ฅผ ์ด์ฉํ์ฌ ์์ ์ ์ฒ๋ฆฌ ํ๊ฒ ๋์ด ํจ์๋ ๋จ์ผ ์ฑ ์ ์์น์ ๋ฒ์ด๋๊ฒ ๋๊ณ , ์ฝ๋๋ ๋ณต์กํด์ง๋ฉฐ, ํ ์คํธ๋ ์ ์ฐจ ์ด๋ ค์์ง๋ค.
class Home extends React.Component {
constructor(props) {
super(props);
this.state = {
lookups: null
};
// this๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์ ์๋์ ๊ฐ์ด ๋ฐ์ธ๋
this.fetchLookups = this.fetchLookups.bind(this);
}
componentDidMount() {
this.fetchLookups(this.props.pathName);
}
componentDidUpdate(prevProps) {
// pathName prop์ด ๋ณ๊ฒฝ ๋์์ ๋
if (prevProps.pathName !== this.props.pathName) {
this.fetchLookups(this.props.pathName);
}
}
fetchLookups(pathName) {
fetchApi({ url: `/lookup?url=${pathName}` }).then((lookups) => {
// lookups ๋ฐ์ดํฐ๊ฐ ๋ฐํ ๋๋ฉด state์
๋ฐ์ดํธ
this.setState({
lookups
});
});
}
render() {
if (!this.state.lookups) return null;
return <pre>{JSON.stringify(this.state.lookups)}</pre>;
}
}
ํจ์ํ ์ปดํฌ๋ํธ์ LifeCycle ๊ด๋ฆฌํ๋ Hook์ ์ฌ์ฉํ ์ฝ๋
useState, useEffect์ Hook์ ์ฌ์ฉํ๋ฉด ์ฝ๋๋ ๊ฐ๊ฒฐํด์ง๊ณ ๋ฐ๋ณต์ ์ด๊ณ ๋ถํ์ํ ์ฝ๋๋ค์ด ์ ๊ฑฐ๋๋ค.
const HomeWithHook = ({ pathName }) => {
const [lookups, updateLookups] = useState(null);
useEffect(() => {
if (pathName) {
fetchApi({ url: `/lookup?url=${pathName}` }).then((lookups) => {
updateLookups(lookups);
});
}
// dependency๋ฅผ pathName์ผ๋ก ํด์ฃผ๋ฉด ๋งจ ์ฒ์์ ํ๋ฒ pathName์ด ๋ณ๊ฒฝ ๋์์ ๋ ๋ ์คํ
}, [pathName]);
if (!lookups) return null;
return <pre>{JSON.stringify(lookups)}</pre>;
};
โ Hook์ ํตํด ์๋ก ๋น์ทํ ๊ฒ์ ํ๋ ์์ ํจ์์ ๋ฌถ์์ผ๋ก ์ปดํฌ๋ํธ๋ฅผ ๋๋๋ ๋ฐฉ๋ฒ์ผ๋ก ์ฌ์ฉ ํ ์ ์๋ค.
๐จ Confusing Classes (์ฌ๋๊ณผ ๊ธฐ๊ณ๋ฅผ ํผ๋์ํค๋ Class)
React์์์ ClassComponent๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ JavaScript์ this
ํค์๋๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง ์์์ผ ํ๋ค. JavaScript์ this
ํค์๋๋ ๋๋ถ๋ถ์ ๋ค๋ฅธ ์ธ์ด์์์๋ ๋ค๋ฅด๊ฒ ์๋ํจ์ผ๋ก ํผ๋์ ์ ๋ฐํ๊ณ ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ๊ณผ ๊ตฌ์ฑ์ ์ด๋ ต๊ฒ ๋ง๋ ๋ค.
โ Hook์ Class์์ด React๊ธฐ๋ฅ๋ค์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ ์ํ๋ค.
โ๐ป React Hook ์ ๋ฆฌ
React hook 16.8 ๋ฒ์ ์ดํ ๋์ ๋ ๊ธฐ๋ฅ์ด๋ค.
๊ธฐ์กด์ React๊ฐ ๊ฐ์ง๊ณ ์๋ ๋ฌธ์ ์ ๋ค์ ํด๊ฒฐํ๊ธฐ ์ํด hook์ด ํ์ํ์๋ค.โ ํจ์ํ ์ปดํฌ๋ํธ์ Update
Class ์ปดํฌ๋ํธ์ ๋ฌธ์ โ this ํค์๋, extends ํค์๋๋ฅผ ํตํ ์์์ผ๋ก ๋ฐ๋ณต์ ์ธ ์ฝ๋ ์์ฑ
์ํ ๊ด๋ฆฌ ๋ก์ง(์ปดํฌ๋ํธ)์ ์ฌ์ฌ์ฉ ์ด๋ ค์ โ Custom hook ์ปดํฌ๋ํธ์ ๋ชจ๋ํ
Class ์ปดํฌ๋ํธ์ LifeCycle(์๋ช ์ฃผ๊ธฐ)์ ๊ด๋ จ๋ ๋ฉ์๋๋ก ์ธํ ๋ณต์กํ ์ปดํฌ๋ํธ
Hook์ ํตํด ์ฝ๋๊ฐ ๊ฐ๊ฒฐํ๊ณ ๊ฐ๋ ์ฑ ์๊ฒ ํ๋ฉฐ, ์ฌ์ฌ์ฉ์ ํจ์จ์ ๊ทน๋ํ ์ํค๊ธฐ ์ํ ๊ธฐ๋ฅ์ ์ ๊ณต
๐ ์ฐธ๊ณ
Last updated