
Hook์ ํ๊ตญ์ด๋ก ๊ณ ๋ฆฌ, ๋์ฏ๋ฐ๋์ ์๋ฏธํฉ๋๋ค.
๋ง์ฝ ์ ๊ฐ ๋์๋ฅผ ํ๋ค๊ณ ์๊ฐํ์์๋ ๋์๋๋ฅผ ์ค๋นํด์ผํ๋๊ฒ์ด ํจ์จ์ ์ผ ๊ฒ์ด๊ณ ,
๊ทธ ๋์๋์๋ ๊ณ ๊ธฐ๋ฅผ ๋๊ธฐ์ํ ๋์ฏ๋ฐ๋์ด ์๊ฒ ์ฃ ?
๊ทธ๋ฆฌ๊ณ ๊ทธ ๋์ฏ๋ฐ๋์ ๋ฏธ๋ผ๋ฅผ ๊ฑธ๊ณ ๊ธฐ๋ค๋ฆฌ๋ค๋ณด๋ฉด ๋ฌผ๊ณ ๊ธฐ๊ฐ ๊ทธ ๋ฏธ๋ผ๋ฅผ ๋ฌผ๊ณ , ๋์๋ฐ๋์ ๊ฑธ๋ฆฌ๊ณ ๋ง๋๋ค.
( ๊ฐ์ธ์ ์ผ๋ก ์ดํดํ๊ธฐ ์ํด ์์ฑํ ์์์ ๋๋ค. ํ๋ฆฌ๊ฑฐ๋ ๋น์ ๊ฐ ์ด์ํ ์์์ผ์๋ ์์ต๋๋ค! )
์ ๊ณผ์ ์ ์ด๋ ๊ฒ ๋ฐ๊พธ์ด์ ๋งํด๋ณด๊ฒ ์ต๋๋ค.
๊ฐ๋ฐ์๊ฐ ํ์ํ ๋, ํน์ ์ฌ์ฉํ๋ฉด ์ ์ฉํ ๊ฒ ๊ฐ์๋ ๊ฐ์ ธ์ ์ฌ์ฉํ๋ ์ผ์ข
์ ๋์ฏ๋ฐ๋์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋ฌผ๋ก ๋์๋ฐ๋, ์ฆ hook์ด ํ์๊ฐ ์๋ ์ํฉ์ด๋ผ๋ฉด ๊ตณ์ด ์ฌ์ฉํ์ง ์์๋ ๋๊ฒ ์ฃ ?
hook์ ๋ํ ์ ์๋ ์๋์ ๊ฐ์ต๋๋ค.
React hook์ ํจ์ํ ์ปดํฌ๋ํธ์์ ์ํ๊ด๋ฆฌ, ๋ผ์ดํ๋ผ์ดํด ๋ฉ์๋ ์ฌ์ฉ,
๊ทธ ์ธ ๋ค๋ฅธ React ๊ธฐ๋ฅ๋ค์ ์ฌ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ ํจ์์ ๋๋ค.
ํจ์ํ ์ปดํฌ๋ํธ ๋ด์์ hook์ ์ฌ์ฉํ์ฌ ์ํ์ ๋ผ์ดํ์ฌ์ดํด ๋ฉ์๋๋ฅผ ๊ด๋ฆฌํ๊ณ ,
ํด๋์ค ์ปดํฌ๋ํธ์์๋ง ๊ฐ๋ฅํ๋ ์์ ๋ค์ ํจ์ ์ปดํฌ๋ํธ์์๋ ์ํํ ์ ์์ต๋๋ค.
useState, useReducer, useEffect, useContext, useRef ๋ฑ
๋ฆฌ์กํธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ด์ฅ๋์ด์๋ ์๋ง์ hook๋ค์ ์ ๊ณตํฉ๋๋ค.
๊ทธ๋ฐ๋ฐ๋ ์ ์ฐ๋ฆฌ๋ ๊ตณ์ด React๊ฐ ๋ง๋ค์ด ๋ ํ
์ด ์๋๋ฐ ๋ฐ๋ก custom hook์ ๋ง๋ค์ด์ ์ฌ์ฉํ๋ ค๊ณ ํ ๊น์?
React๋ useState, useContext, ๊ทธ๋ฆฌ๊ณ useEffect๊ฐ์ด ๋ช๋ช ๋ด์ฌํ๊ณ ์๋ Hook์ด ์กด์ฌํฉ๋๋ค.
๊ฐ๋ ์กฐ๊ธ ๋ ๊ตฌ์ฒด์ ์ธ ๋ชฉ์ ์ ๊ฐ์ง Hook์ด ์กด์ฌํ๊ธธ ๋ฐ๋ ๋๋ ์์ ๊ฒ๋๋ค.
์๋ฅผ ๋ค์ด, ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ๋ค๋๊ฐ, ์ฌ์ฉ์๊ฐ ์จ๋ผ์ธ ์ํ์ธ์ง ๊ณ์ ํ์ธํ๋ค๋๊ฐ, ํน์ ์ฑํ ๋ฐฉ์ ์ฐ๊ฒฐํ๊ธฐ ์ํ ๋ชฉ์ ๋ค์ฒ๋ผ์.
React์์ ๋ค์๊ณผ ๊ฐ์ Hook๋ค์ ์ฐพ๊ธฐ๋ ์ด๋ ค์ธ ๊ฒ์ ๋๋ค.
ํ์ง๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์์ ์๋ง์ ๋ณธ์ธ๋ง์ Hook์ ๋ง๋ค ์ ์์ต๋๋ค.
React Docs์ custom hook์ ๋ํ ๊ฐ์์
๋๋ค.
๋ด์ฌ๋์ด ์๋ hook์ด ์กด์ฌํ์ง๋ง,
์กฐ๊ธ ๋ ๊ตฌ์ฒด์ ์ธ ๋ชฉ์ ์ ๊ฐ์ง hook์ด ํ์ํ ๋ custom hook์ ๋ง๋ค์ด์ ์ฌ์ฉํ๋ค!
๋ผ๊ณ ์ค๋ช
ํฉ๋๋ค.
๋ง์ฝ ์ฐ๋ฆฌ์ ์น์ฌ์ดํธ์์ ์ ์ ์๊ฒ ๋คํธ์ํฌ ์ํ(์ธํฐ๋ท์ ์ํ)๋ฅผ ์๋ ค์ฃผ๊ณ ์ถ์๋,
์๋์ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
export default function HomePage() {
const [isOnline, setIsOnline] = useState(true);
useEffect(() => {
function handleOnline() {
setIsOnline(true);
}
function handleOffline() {
setIsOnline(false);
}
window.addEventListener('online', handleOnline);
window.addEventListener('offline', handleOffline);
return () => {
window.removeEventListener('online', handleOnline);
window.removeEventListener('offline', handleOffline);
};
}, []);
return (
<div>
<h1>ํํ์ด์ง์
๋๋ค.<p>
<p>{isOnline ? 'โ
์จ๋ผ์ธ' : 'โ ์ฐ๊ฒฐ ์ ๋จ'}<p>
</div>);
}
์ ์์๋ ๋ง์ฝ ์ ์ ๊ฐ ํํ์ด์ง์์ ์ธํฐ๋ท์ ์ฐ๊ฒฐ๋์ด์์ง ์๋ค๋ฉด 'โ ์ฐ๊ฒฐ ์ ๋จ'์ ๋ณด์ฌ์ฃผ๊ณ ,
์ฐ๊ฒฐ์ด ๋์ด์๋ค๋ฉด 'โ
์จ๋ผ์ธ' ์ด๋ผ๋ UI๋ฅผ ๋ณด์ฌ์ค๋๋ค.
ํ์ง๋ง ๋ค๋ฅธ ํ์ด์ง์์๋ ์ด ๋ก์ง์ ์ฌ์ฉํ๋ค๋ฉด ์ด๋จ๊น์?
export default function DetailPage() {
const [isOnline, setIsOnline] = useState(true);
useEffect(() => {
function handleOnline() {
setIsOnline(true);
}
function handleOffline() {
setIsOnline(false);
}
window.addEventListener('online', handleOnline);
window.addEventListener('offline', handleOffline);
return () => {
window.removeEventListener('online', handleOnline);
window.removeEventListener('offline', handleOffline);
};
}, []);
return (
<div>
<h1>๋ํ
์ผ ํ์ด์ง์
๋๋ค.<p>
<p>{isOnline ? 'โ
์จ๋ผ์ธ' : 'โ ์ฐ๊ฒฐ ์ ๋จ'}<p>
</div>);
}
๋ง์ฝ ๋์ผํ ๋ก์ง์ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด, ์์ ๊ฐ์ด ์ฝ๋๋ฅผ ๋ฐ๋ณตํด์ ์ฌ์ฉํด์ฃผ๋ ๋ฐฉ๋ฒ๋ ์๊ฒ ์ฃ .
์์ ๋ ํ์ด์ง๋ ๊ธฐ๋ฅ์ ์ผ๋ก๋ ์ ๋์ํ๊ณ , ๋ฌธ์ ๊ฐ ์์ด๋ณด์
๋๋ค.
๋ค๋ง ์์ฌ์ด ์ ์ ๋ ํ์ด์ง์ ๋ก์ง์ด ์ค๋ณต๋๋ ์ ์ด ์์ฌ์ด ์ ์ด๊ฒ ์ฃ .
์ฌ๊ธฐ๊น์ง ์ฝ์ด๋ณด์๋ฉด์ ๋ฌด์ธ๊ฐ ์์ฌ์์ด ์์ผ์
จ๋ค๊ณ ์๊ฐํ์ ๋ค๋ฉด,
์ง๊ธ์ด ๋ฐ๋ก custom hook์ ์ ์ฉ์ํฌ ํ์ด๋ฐ์
๋๋ค!
์์ฐจ์ ์ผ๋ก ์ค๋ณต๋๋ ๋ก์ง์ custom hook์ผ๋ก ๋ฐ๊พธ๋ ๊ณผ์ ์ ์งํํด๋ณผ๊น์?
const [isOnline, setIsOnline] = useState(true);
useEffect(() => {
function handleOnline() {
setIsOnline(true);
}
function handleOffline() {
setIsOnline(false);
}
window.addEventListener('online', handleOnline);
window.addEventListener('offline', handleOffline);
return () => {
window.removeEventListener('online', handleOnline);
window.removeEventListener('offline', handleOffline);
};
}, []);
๋ค์ ์ฝ๋๋ฅผ ์ดํด๋ณด๋ฉด, ์ ๋ก์ง์ด ์ ํํ ๋์ผํ๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ํ, ์ฌ์ฉํ๋ state๋ isOnline ์ผ๋ก ๋์ผํ์ฃ !
// useOnlineStatus.js
function useOnlineStatus() {
const [isOnline, setIsOnline] = useState(true);
useEffect(() => {
function handleOnline() {
setIsOnline(true);
}
function handleOffline() {
setIsOnline(false);
}
window.addEventListener('online', handleOnline);
window.addEventListener('offline', handleOffline);
return () => {
window.removeEventListener('online', handleOnline);
window.removeEventListener('offline', handleOffline);
};
}, []);
return isOnline;
}
์, ์์์ ๋์ผํ ๋ก์ง์ ํ์
ํ๊ณ , ๋์ผํ๊ฒ ์ฌ์ฉ๋๋ state์ธ isOnline์ ๋ฐํํด์ฃผ๋ custom hook์ ๋ง๋ค์์ต๋๋ค.
export default function HomePage() {
const isOnline = useOnlineStatus();
return (
<div>
<h1>ํํ์ด์ง์
๋๋ค.<p>
<p>{isOnline ? 'โ
์จ๋ผ์ธ' : 'โ ์ฐ๊ฒฐ ์ ๋จ'}<p>
</div>);
}
export default function DetailPage() {
const isOnline = useOnlineStatus();
return (
<div>
<h1>๋ํ
์ผ ํ์ด์ง์
๋๋ค.<p>
<p>{isOnline ? 'โ
์จ๋ผ์ธ' : 'โ ์ฐ๊ฒฐ ์ ๋จ'}<p>
</div>);
}
์ด๋ค๊ฐ์? ์ฝ๋๊ฐ ์งง์์ ธ ๊ฐ๋
์ฑ์ด ์ฌ๋ผ๊ฐ์ง ์์๋์?
์ด์ ๋ ํ์ด์ง๋ ๋ฐ๋ณต๋๋ ๋ก์ง์ด ๊ฑฐ์ ์ฌ๋ผ์ก์ต๋๋ค.
์ค์ํ ์ ์,
๋ ํ์ด์ง์ ๋ด๋ถ ์ฝ๋๊ฐ ์ด๋ป๊ฒ ๊ทธ๊ฒ์ ํ๋์ง๋ณด๋ค
๊ทธ ํ์ด์ง๋ค์ด ๋ฌด์์ ํ๋ ค๋์ง์ ๋ํด ์์ฑ์ ํ๋ค๋ ์ ์
๋๋ค.
custom hook์ ๋ง๋ค์ด ๋ก์ง์ ์ฌ์ฌ์ฉํ๋ฉด
๋ธ๋ผ์ฐ์ API๋ ์ธ๋ถ ์์คํ
(์๋ฒ)๊ณผ ์ํตํ๋ ์ฝ๋์ ๋ํด ๋ถํ์ํ ์ธ๋ถ ์ฌํญ์ ์จ๊ธธ ์ ์์ต๋๋ค.
์์์ ์ค๋ช
ํ๋ฏ์ด, custom hook์ ์ฌ์ฉํ๋ ์ปดํฌ๋ํธ์์๋
๋ด๋ถ ์ฝ๋๊ฐ ์ด๋ป๊ฒ ๊ทธ๊ฒ์ ํ๋์ง ๊ฐ ์๋,
๊ทธ ์ปดํฌ๋ํธ๊ฐ ํด๋น custom hook์ ๊ฐ์ง๊ณ ๋ฌด์์ ํ๋ ค๋์ง์ ๋ํด์๋ง ์ ๊ฒฝ์ ์ฐ๋ฉด๋๋
์๋ก์ ๊ด์ฌ์ฌ๋ฅผ ๋ถ๋ฆฌํด ๊ฐ๋
์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ด ์ฌ๋ผ๊ฐ๋๋ค!
๋ชจ๋ hook์ ์ด๋ฆ์ use ๋ค์ ๋๋ฌธ์๋ก ์์ํด์ผ ํฉ๋๋ค.
Ex. useCustomHook ์ ๊ฐ์ด ์ฌ์ฉํฉ๋๋ค!