React Hook
React ๊ณต์์ฌ์ดํธ ์ฐธ์กฐ : https://ko.reactjs.org/docs/hooks-intro.html
Hook ์๊ฐ
Hook์ ์ด๋ค ๊ฒ์ด๊ณ ์ ๋์ค๊ฒ ๋์์๊น?
Hook์ด๋?
์ฐ์ Hook์ React 16.8 ๋ฒ์ ์ ์๋ก ์ถ๊ฐ๋ ์ต์ ๊ธฐ๋ฅ์ผ๋ก, ํด๋์คํ ์ปดํฌ๋ํธ์ ๋จ์ ์ ๊ทน๋ณตํ๊ณ ์ ๋์จ ํจ์ํ ์ปดํฌ๋ํธ์ ๋ํ ๊ธฐ๋ฅ์ด๋ค. Hook์ ํจ์ํ ์ปดํฌ๋ํธ๋ก๋ ํด๋์คํ ์ปดํฌ๋ํธ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋๋ก ํด์ค๋ค.
ํจ์ํ ์ปดํฌ๋ํธ๋?
// ํด๋์คํ ์ปดํฌ๋ํธ
import React, { Component } from 'react';
class App extends Component {
render(){
return (
//jsx
);
}
}
export default App;
// ํจ์ํ ์ปดํฌ๋ํธ
import React from 'react';
function App(){
// ํ์ดํ ํจ์ ํํ๋ ๊ฐ๋ฅํ๋ค.
return(
//jsx
);
}
export default App;
ํด๋์คํ ์ปดํฌ๋ํธ๋ ์ง๊ด์ ์ผ๋ก ์์ ์ฝ๋์ ๊ฐ์ ์ฐจ์ด๊ฐ ์๋ค. ์ด๋ฆ ๊ทธ๋๋ก ์ปดํฌ๋ํธ๋ฅผ ํด๋์ค๋ก ๊ตฌํํ ๊ฒ์ธ์ง ํจ์ ํํ๋ก ๊ตฌํํ ๊ฒ์ธ์ง์ ๋ฐ๋ฅธ ์ฐจ์ด์ด๋ค.
ํจ์ํํ์ ์ปดํฌ๋ํธ์์ ์ฌ์ฉ๋๋ ๋ช๊ฐ์ง ๊ธฐ์ ์ Hook์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
๊ธฐ์กด ๋ฒ์ ๊ณผ์ ํธํ
๊ฐ์๊ธฐ ํจ์ํ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค๋ฉด ์ด์ ๋ฒ์ ๊ณผ๋ ํธํ์ด ๋๋๊ฑธ๊น? Hook์ ์ผ๋ถ ์ปดํฌ๋ํธ์๋ง ์ ์ฉํด๋ ๋๊ณ ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ๊นจ๋จ๋ฆฌ๋ ๋ณํ๊ฐ ์ ํ ์์ผ๋ฏ๋ก ์ฌ์ฉํด๋ ๋๋ค. ์์ง๊น์ง๋ ํด๋์คํ ์ปดํฌ๋ํธ๋ฅผ ์ ๊ฑฐํ๋ ค๋ ๊ณํ๋ ์์ผ๋ฏ๋ก ๋ ํํ ๋ชจ๋ ํผํฉํด์ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
๊ทธ๋ ๋ค๋ฉด ์ ๊ตณ์ด ์ ์ฐ๊ณ ์๋ ํด๋์คํ ์ปดํฌ๋ํธ๋ฅผ ํจ์ํ ์ปดํฌ๋ํธ๋ก ๋ฐ๊ฟ์ผํ ๊น?
ํจ์ํ ์ปดํฌ๋ํธ์ ํน์ง
ํด๋์ค๋ react๋ฅผ ๋ฐฐ์ฐ๋ ๋ฐ์ ์์ด์ ํฐ ์ง์ ์ฅ๋ฒฝ์ด์๋ค. ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ๊ณผ ์ฝ๋ ๊ตฌ์ฑ์ ์ด๋ ต๊ฒ ๋ง๋ค๊ณ , this์ ์ฌ์ฉ์ด๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ์ ๋ฑ๋ก ๋ฑ ๊ธฐ๋ณธ์ ์ธ JS ๋ฌธ๋ฒ ์ฌํญ์ ์์์ผ ๋ค๋ฃฐ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ํ ํด๋์ค๋ ์ ์ถ์๋์ง ์๊ณ , reloading์ ๊นจ์ง๊ธฐ ์ฝ๊ณ ์ ๋ขฐํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ ๋ค. ๋ฐ๋ผ์ react์ ์ต์ ๊ธฐ์ ๋ค์ด ํด๋์คํ ์ปดํฌ๋ํธ์ ํจ๊ณผ์ ์ผ๋ก ์ ์ฉ๋์ง ์์๋ค.
์ ๋ฆฌํด๋ณด์๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
- ํด๋์ค์ ๋ฌธ๋ฒ์ด ์ด๋ ต๋ค.
- ์ถ์๊ฐ ์ด๋ ต๋ค.
- reloading์ ์ ๋ขฐ์ฑ์ด ๋จ์ด์ง๋ค.
- ์ต์ ๊ธฐ์ ์ ์ ์ฉ์ด ํจ๊ณผ์ ์ด์ง ์๋ค.
ํจ์ํ ์ปดํฌ๋ํธ๋ ์ด๋ฌํ ๋จ์ ๋ค์ ์ปค๋ฒํ ์ ์๋ค. ํ์ง๋ง ํด๋์ค ์ปดํฌ๋ํธ์ ์ฅ์ ์ธ state ์ฌ์ฉ์ด๋ life cycle์ ์ง์ ๋ค๋ฃจ๋ ๋ฑ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ง ๋ชปํ๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Hook์ด ๋ฑ์ฅํ๋ค.
Hook์ ํน์ง
Hook์ React ๊ฐ๋ ์ ๋ณด๋ค ์ง๊ด์ ์ธ API๋ฅผ ์ ๊ณตํ๋ค. ๋ํ ์ํ์ ๊ด๋ จ๋ ๋ก์ง์ ์ฌ์ฌ์ฉํ๊ธฐ ์ฝ๊ฒ ๋ง๋ ๋ค.
mixin, HOC, render props ๋ฑ์ ๋ด์ฉ => ์ ๋ฆฌํ๊ธฐ
Hook ๊ธฐ๋ฅ
Hook์ ํจ์ํ ์ปดํฌ๋ํธ๊ฐ ํด๋์คํ ์ปดํฌ๋ํธ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋๋ก ํด์ฃผ๋ ๊ธฐ๋ฅ์ด๋ค. ํน์ง์ ์ผ๋ก state์ lifecycle๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ์ฌ์ฉ ๊ฐ๋ฅํ๊ฒ ํด์ค๋ค.
State Hook
ํจ์ํ ์ปดํฌ๋ํธ์์ state๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น?
const [count, setCount] = useState(0);
useState
๋ Hook์ ๊ธฐ์ ์ด๋ค. ํจ์ํ ์ปดํฌ๋ํธ์์๋ ํด๋์คํ ์ปดํฌ๋ํธ์ ๊ฐ์ด state๋ฅผ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์, Hook์ ์ฌ์ฉํด์ state์ ๊ฐ์ ๊ธฐ๋ฅ์ ํ ์ ์๋๋ก ๋ง๋ค์ด์ฃผ์๋ค.
useState
๋ ์ค์ ํ state ๊ฐ๊ณผ ์ด ๊ฐ์ ์
๋ฐ์ดํธํ๋ ํจ์๋ฅผ ์์ผ๋ก ์ ๊ณตํ๋ค. ์ด ํจ์๋ ํด๋์ค ์ปดํฌ๋ํธ์์์ this.setState
์ ์ ์ฌํ์ง๋ง ์ด์ state์ ์๋ก์ด state๋ฅผ ํฉ์น์ง ์๋๋ค๋ ์ฐจ์ด์ ์ด ์๋ค.
useState
๋ ์ธ์๋ก ์ด๊ธฐ state ์ค์ ๊ฐ์ ํ๋ ๋ฐ๋๋ค. ์ด ์ด๊ธฐ๊ฐ์ ์ฒซ ๋ฒ์งธ ๋ ๋๋ง ์์ ํ ๋ฒ ์ฌ์ฉ๋๋ค.
Effect Hook
react์ ์ปดํฌ๋ํธ ๋ด์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ฑฐ๋ ๊ตฌ๋ ํ๊ณ , DOM์ ์กฐ์ํ๋ ์์ ์ side effects ๋๋ effects๋ผ๊ณ ํ๋ค. ์ด๋ ๋ค๋ฅธ ์ปดํฌ๋ํธ์ ์ํฅ์ ์ค ์ ๋ ์๊ณ ๋ ๋๋ง ๊ณผ์ ์์๋ ๊ตฌํ ๋ถ๊ฐ๋ฅํ ์์ ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
useEffect
๋ ์ด๋ฌํ side effects๋ฅผ ์ํํ ์ ์๋๋ก ํด์ค๋ค. ํด๋์ค ์ปดํฌ๋ํธ์ componentDidMount
๋ componentDidUpdate
, componentWillUnmount
์ ๊ฐ์ด lifecycle์ ๋ค๋ฃจ๋ ๋ชฉ์ ์ผ๋ก ์ ๊ณต๋์ง๋ง ์ด๋ฅผ ํ๋์ API๋ก ํตํฉํ์๋ค๋ ๊ฒ์ด ์ฐจ์ด์ ์ด๋ค.
ํด๋์คํ ์ปดํฌ๋ํธ์ life cycle
react์ ์๋ lifecycle์ ์์ ๊ทธ๋ฆผ๊ณผ ๊ฐ๋ค. react ์ปดํฌ๋ํธ side effect์๋ ์ผ๋ฐ์ ์ผ๋ก ์ ๋ฆฌ๊ฐ ํ์ํ ๊ฒ๊ณผ ๊ทธ๋ ์ง ์์ ๊ฒ์ด ์๋ค.
์ ๋ฆฌ๊ฐ ํ์ํ์ง ์์ effects
์ ๋ฆฌ๊ฐ ํ์ํ์ง ์์ effects๋ react๊ฐ DOM์ ์ ๋ฐ์ดํธํ ํ ์ถ๊ฐ๋ก ์ฝ๋๋ฅผ ์คํํด์ผํ๋ ๊ฒฝ์ฐ์ด๋ค.
componentDidMount() {
// same code
}
componentDidUpdate() {
// same code
}
-
ํด๋์ค ์ปดํฌ๋ํธ
ํด๋์ค ์ปดํฌ๋ํธ์์๋ ์ด๋ฌํ side effect๋ฅผ
componentDidMount
๋componentDidUpdate
ํจ์๋ก ๋ค๋ฃฌ๋ค. ์ปดํฌ๋ํธ๊ฐ ๋ง ๋ง์ดํธ๋๋ ๋จ๊ณ์ธ์ง ์ ๋ฐ์ดํธ๋๋ ๋จ๊ณ์ธ์ง์ ๋ฐ๋ผ ๋ ์ค ์ด๋ค ํจ์๋ฅผ ์ธ ์ง๊ฐ ๋ฌ๋ผ์ง๋ฏ๋ก ํญ์ ์คํ๋๊ฒ ํ๋ ค๋ฉด ํด๋์คํ ์ปดํฌ๋ํธ์์๋ ์ค๋ณต๋ ์ฝ๋๋ฅผ ์์ฑํด์ผํ๋ค.
useEffect(() => {
// same code
});
-
ํจ์ํ ์ปดํฌ๋ํธ
ํจ์ํ ์ปดํฌ๋ํธ์์๋
useEffect
hook์ ์ฌ์ฉํ์ฌ ํ๋ฒ์ ๋ํ๋ผ ์ ์๋ค. ์ด hook์ ๋ง์ดํ ๊ณผ ์ ๋ฐ์ดํธ์ ๊ฐ๋ ์ด ์์ด ๋ ๋๋ง ์ดํ์ ๋งค๋ฒ ์ํ๋๋ค.
์ ๋ฆฌ๊ฐ ํ์ํ effects
์ ๋ฆฌ๊ฐ ํ์ํ effects๋ ์ธ๋ถ ๋ฐ์ดํฐ์ ๊ตฌ๋ ์ ์ค์ ํด์ผํ๋ ๊ฒฝ์ฐ๋ฅผ ๋ค ์ ์๋ค. ์ด๋ฐ ๊ฒฝ์ฐ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ์ง ์๋๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฆฌํ๋ ๊ฒ์ด ๋งค์ฐ ์ค์ํ๋ค.
-
ํด๋์ค ์ปดํฌ๋ํธ
ํด๋์ค ์ปดํฌ๋ํธ์์๋
componentDidMount
ํจ์์์ ๊ตฌ๋ ์ ์ค์ ํ ํ,componentWillUnmount
ํจ์์์ ์ด๋ฅผ ์ ๋ฆฌํ๋ค. -
ํจ์ํ ์ปดํฌ๋ํธ
ํจ์ํ ์ปดํฌ๋ํธ์์๋
useEffect
hook์์ ์ด๋ฅผ ํจ๊ป ๋ค๋ฃจ์ด์ผํ๋ค.useEffect
์์ ์ ๋ฆฌ๋ฅผ ์ํ ํจ์๋ return์ผ๋ก ๋ฐํํด์ค ์ ์๋ค. ๋ฐ๋ผ์ ๊ตฌ๋ ์ ๋ก์ง์useEffect
hook ๋ด์ ์ ์ํ๊ณ , ์ ๋ฆฌ๋ฅผ ์ํ ๋ก์ง์ return์ผ๋ก ๋ฐํํด์ฃผ๋ฉด ๋๋ค.๋ฐ๋ผ์ ๊ตฌ๋ ์ด๋ผ๋ ํ๋์ ๋ก์ง๊ณผ ๊ด๋ จ๋ ์์๊ฐ ํด๋์ค์๋ ๋ฌ๋ฆฌ ํจ์ํ ์ปดํฌ๋ํธ์์๋ ํ ๊ณณ์ ๋ฌถ์ฌ์๊ฒ ๋๋ค.
์ด๋ ๊ฒ Hook์ ์ฌ์ฉํ๋ฉด ํด๋์คํ ์ปดํฌ๋ํธ์๋ ๋ค๋ฅด๊ฒ ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋๊ฐ ์๋๋ผ ํน์ ๊ธฐ์ค์ ๋ฐ๋ผ ๋ก์ง๋ค์ ๋๋ ์๊ฐ ์๋ค.
useEffect
์์ ๊ตฌ๋
๊ณผ ์ ๋ฆฌ๋ฅผ ๋์์ ๋ค๋ฃธ์ผ๋ก์จ ํ๋์ ๋ก์ง์ ๋ฌถ์ด์ ๋ค๋ฃฐ ์๋ ์๊ฒ ๋์๋ค. ๊ทธ๋ ๋ค๋ฉด ๊ด๋ จ์ด ์๋ ๋ก์ง๋ค์ ์ด๋ป๊ฒ ๊ตฌ๋ถํ ๊น?
useEffect
hook๋ useState์ ๊ฐ์ด ์ฌ๋ฌ๋ฒ ์ฌ์ฉํ ์ ์๋ค. ๋ฐ๋ผ์ ๋ค๋ฅธ hook์ ์ ์ํจ์ผ๋ก์จ ์๋ก ๊ด๋ จ์ด ์๋ ๋ก์ง๋ค์ ๊ฐ๋ผ๋์ ์ ์๋ค. react๋ ์ด hook๋ค์ ์ง์ ๋ ์์์ ๋ฐ๋ผ ์ ์ฉํ๋ค.
๊ธฐํ ์ฃผ์
useEffect๋ ๋๋๋ง ๋๋ง๋ค ์คํ๋๋๋ฐ, ๋งค๋ฒ ์ ๋ฆฌ๋ฅผ ํ๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ด ์ ํ๋ ์๋ ์๋ค. ์ด๋ฅผ ์ด๋ป๊ฒ ํด๊ฒฐํ ๊น?
ํด๋์ค ์ปดํฌ๋ํธ์์๋ componentDidUpdate
ํจ์์ ๋งค๊ฐ๋ณ์๋ก prevProps
์ prevState
๋ฅผ ๋ฐ์ ์ ์๋ค. ์ด์ ๊ฐ์ด hook์์๋ ์ด ๋ ์์๊ฐ ๋ณ๊ฒฝ๋์ง ์์๋ค๋ฉด effect๋ฅผ ๊ฑด๋๋ฐ๋๋ก ํ ์ ์๋ค.
useEffect(() => {
document.title = `You clicked ${count} times`;
}, [count]);
// count๊ฐ ๋ฐ๋ ๋๋ง effect๋ฅผ ์ฌ์คํํฉ๋๋ค.
์ด๋ ๊ฒ useEffect
์ ์ ํ์ ์ธ์์ธ ๋ ๋ฒ์งธ ์ธ์๋ก ๋ฐฐ์ด์ ๋๊ธฐ๋ฉด ๋๋ค. ์์ ์์ ์์ count๊ฐ ์ด์ ๊ฐ๊ณผ ๊ฐ์ผ๋ฉด useEffect
๋ ์คํ๋์ง ์์ ๊ฒ์ด๋ค.
componentDidUpdate ํจ์๋ ๊ธฐ์กด์ด ์ด๋ค ์ญํ ์ด์์ผ๋ฉฐ, useEffect
๋ก ๋ฐ๋ ํ ์ด๋ค ๊ฒ์ด ๋ณํํ์๊น?
componentDidupdate
ํจ์๋ ํด๋์คํ ์ปดํฌ๋ํธ์์ ์ด์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฒ๊ทธ๊ฐ ์ผ์ด๋๋ ๊ฒฝ์ฐ๋ฅผ ๋ฐฉ์งํ๋ ์ญํ ์ ์ํํ๋ค. ํจ์ํ ์ปดํฌ๋ํธ์์๋ useEffect
์์ฒด๊ฐ ์
๋ฐ์ดํธ๋ฅผ ๋ค๋ฃจ๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ๊ตฌ์ฑํ์ง ์์๋ ๋๋ค. ์
๋ฐ์ดํธ์ ๋์์ ์ด์ state๋ฅผ ์ ๋ฆฌํด์ฃผ๊ธฐ ๋๋ฌธ์ด๋ค.
Hook์ ๊ท์น
- ์ต์์์์๋ง ํธ์ถํด์ผํ๋ค.
๋ฐ๋ณต๋ฌธ, ์กฐ๊ฑด๋ฌธ ํน์ ์ค์ฒฉ๋ ํจ์ ๋ด์์ Hook์ ํธ์ถํ๋ฉด ์๋๋ค. ์ด ๊ท์น์ ๋ฐ๋ฅธ๋ค๋ฉด ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง ๋ ๋๋ง๋ค ํญ์ ๋์ผํ ์์๋ก Hook์ด ํธ์ถ๋๋ค. ์ด๋ react๊ฐ useState์ useEffect๋ฅผ ์ฌ๋ฌ ๋ฒ ํธ์ถํ๋ ์ค์๋ Hook ์ํ๋ฅผ ์ ์งํ ์ ์๋๋ก ํด์ฃผ๊ธฐ ๋๋ฌธ์ด๋ค.
- ์ค์ง React ํจ์ ๋ด์์๋ง ํธ์ถํด์ผํ๋ค.
์ผ๋ฐ์ ์ธ JS ํจ์์์ Hook์ ํธ์ถํ๋ฉด ์๋๋ค.
์ด ๋ ๊ท์น์ ๊ฐ์ ํ๋ ํ๋ฌ๊ทธ์ธ์ eslint-plugin-react-hooks
์ด๊ณ ์ด๋ฅผ ํ๋ก์ ํธ์ ์ถ๊ฐํ ์ ์๋ค. Create React App์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํฌํจ๋์ด์๋ค.
Comment