
useState ๊ฐ์ ๊ฒ๋ค ๋ง์ด๋ค. ํ์ง๋ง ๋ด๋ถ์ ์ํ(state)๋ฅผ ์ค์ ํ ์ ์๋ ๋ก์ง์ ํฌํจํ ํจ์์ด๋ค. ์ปค์คํ
ํ
์ ๋ง๋ค์ด์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ํจ์์ ์ํ(state)๋ฅผ ์ค์ ํ๋ ๋ก์ง์ '์์์์ฑ' ํ ์ ์๋ค. ์ ๊ท ํจ์์๋ ๋ค๋ฅด๊ฒ, ์ปค์คํ
ํ
์ ๋ค๋ฅธ ์ปค์คํ
ํ
์ ํฌํจํ ๋ค๋ฅธ ๋ฆฌ์กํธ ํ
์ ์ฌ์ฉํ ์ ์๋ค. ๋ฐ๋ผ์ useState๋ useReducer์ ๊ฐ์ ์ํ(state) ๊ด๋ฆฌ ํ
์ ์ด์ฉํด์ ๋ฆฌ์กํธ์ ์ํ(state)๋ฅผ ํ์ฉํ ์ ์๋ค. ๋ํ, useEffect์๋ ์ ๊ทผํ ์ ์๋ค. ์ปค์คํ
ํ
์ ํตํด ๋ค๋ฅธ ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ ์ ์๋ ๋ก์ง์ ์ปค์คํ
ํ
์ผ๋ก ์์์์ฑํ ์ ์์ผ๋ฉฐ, ์ด๋ฅผ ํตํด ๋ค์ํ ์ปดํฌ๋ํธ ํธ์ถ์ด ๊ฐ๋ฅํ๋ค.
const ForwardCounter = () => {
const [counter, setCounter] = useState(0);
useEffect(() => {
const interval = setInterval(() => {
setCounter((prevCounter) => prevCounter + 1);
}, 1000);
return () => clearInterval(interval);
}, []);
return <Card>{counter}</Card>;
};
const BackwardCounter = () => {
const [counter, setCounter] = useState(0);
useEffect(() => {
const interval = setInterval(() => {
setCounter((prevCounter) => prevCounter - 1);
}, 1000);
return () => clearInterval(interval);
}, []);
return <Card>{counter}</Card>;
};
ForwardCounter ์ปดํฌ๋ํธ๋ useState์ useEffect๋ฅผ ์ฌ์ฉํด์ ์ํ(state)๋ฅผ ๊ด๋ฆฌํ๊ณ , ์๊ฐ ๊ฐ๊ฒฉ์ ๋ง๋ค์ด์(setInterval) ์ ๋ฐฉํฅ์ผ๋ก ์นด์ดํ
์ ์์ํ๋ฉฐ ๋งค ์ด, ์ฆ ๋งค 1000 ๋ฐ๋ฆฌ์ด ๋ง๋ค ์๋ก์ด counter ์ํ(state)๋ฅผ ์ค์ ํ๋ค. BackwardCounter ์ปดํฌ๋ํธ ์ญ์ ForwardCounter ์ปดํฌ๋ํธ์ ๋์ผํ ์ญํ ์ ํ์ง๋ง ๋ค๋ง ์ญ๋ฐฉํฅ์ผ๋ก ์นด์ดํ
์ ํ๊ณ ์๋ค. ์ด๊ฒ ์ธ์๋ ๋ ์ปดํฌ๋ํธ ๋ชจ๋ ๋์ผํ ๋ก์ง์ ๊ฐ์ง๊ณ ์๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์, ์ด ๋ ๊ฐ์ ์ปดํฌ๋ํธ๋ ๋งค์ฐ ์ ์ฌํ๋ค๊ณ ๋ณผ ์ ์๋ค. ๋ฌผ๋ก ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค๊ณ , ์ด ์ปดํฌ๋ํธ์ props ๋ฅผ ๋๊ฒจ๋ฐ๋ ํ์์ผ๋ก ์ค์ ํ๋ ๋ฐฉ๋ฒ์ผ๋ก๋ ๊ตฌ์ฑํ ์ ์์ง๋ง ์ค์ ์ดํ๋ฆฌ์ผ์ด์
์์๋ ์ํธ ๊ฐ์ ์ฐ๊ด๋ ์์
์ ์ํํ๋ ์๋ก ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ค์ด ์๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ด ์ ๋ฐฉํฅ/์ญ๋ฐฉํฅ counter ์๋ ์ ๋ก์ง๊ฐ์ ์ค๋ณต๋๋ ์ฝ๋๊ฐ ์กด์ฌํ ๊ฒ์ด๋ค. (์ด์จ๋ ๋ง์
๊ณผ ๋บ์
์ด๋ผ๋ ์ฐจ์ด๋ง ์ ์ธํ๋ฉด ์ด ๋์ ์ ํํ ๊ฐ์ ์ฝ๋๋ผ๊ณ ๋ณผ ์ ์๋ค.)useState๋ useEffect ๊ฐ์ ๋ฆฌ์กํธ ํ
์ ์ฌ์ฉํ๋ ๊ฒ์ด๊ณ , ์ด๋ ์ํ(state) ๊ฐฑ์ ํจ์๋ฅผ ํธ์ถํจ์ผ๋ก์ ์ํ๋ฅผ ๊ฐฑ์ ํ๊ฒ ๋๋ค๋ ๊ฒ์ ์๋ค. ์ฐ๋ฆฌ๊ฐ ๋ฐฐ์ ๋ ํ
์ ๊ท์น์ ๊ธฐ์ตํด๋ณด๋ผ. ๋ฆฌ์กํธ ์ปดํฌ๋ํธ ํจ์๊ฐ ์๋ ๋ค๋ฅธ ํจ์์์ ์ด๋ฌํ ๋ฆฌ์กํธ ํ
์ ์ฌ์ฉํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ค. ํ์ง๋ง ์ปค์คํ
ํ
์ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ ํจ์์ฒ๋ผ ๋ฆฌ์กํธ ํ
์ ์ฌ์ฉํ ์ ์๋ค.hooks ๋ผ๋ ๋ณ๋์ ํด๋๋ฅผ ๋จผ์ ๋ง๋ค์.
use๋ก ์์ํด์ผ ํ๋ค๋ ๊ฒ์ ์๋ค.const useCounter = () => {};
export default useCounter;
hooks ํด๋ ์์ use-counter.js ๋ผ๋ ์ปค์คํ
ํ
ํ์ผ์ ๋ง๋ ๋ค. ์์ ์ค๋ช
ํ๋ ๋ ๋ฒ์งธ ๊ท์น์ ๋ฐ๋ผ์ use๋ก ์์๋๋ ์ด๋ฆ์ ์ปค์คํ
ํ
์ด๋ค. ์ด๋ ๊ฒ ํ์ผ ์ด๋ฆ์ ์ง์ ๊ฒ์๋ ์ด์ ๊ฐ ์๋ค. ํ์ผ ์์ ํจ์ ์ด๋ฆ์ ๋ํด ๋ฐ๋ผ์ผ ํ๋ ๊ท์น์ด ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ฐ๋ฆฌ๋ use-counter.js ๋ผ๋ ํ์ผ ์์์ ํจ์๋ฅผ ๋ง๋ค ๊ฒ์ด๊ณ , ์ด๋ ๊ฒ ๋ง๋ค์ด์ง ํจ์๋ ๋ฐ๋์ ์ด๋ฆ์ use๋ก ๋ช
๋ช
ํด์ผ ํ๋ค. ์ด๋ ํ์์ ์ผ๋ก ์ง์ผ์ผํ๋ ์๊ฒฉํ ๊ท์น์ด๋ค.use ๋ค์ด๋ฐuse๋ ๋ฆฌ์กํธ์๊ฒ ํด๋น ํจ์๊ฐ ์ปค์คํ
ํ
์์ ์๋ ค์ฃผ๋ ์ ํธ๊ฐ ๋๋ค. ๊ทธ๋ฌ๋๊น, ์ด๋ฐ ์ ํธ๋ฅผ ํตํด์ ๋ฆฌ์กํธ๊ฐ ํด๋น ํจ์๋ฅผ ํ
์ ๊ท์น์ ๋ฐ๋ผ ์ฌ์ฉํ๊ฒ ๋ค๊ณ '๋ณด์ฅ'ํด ์ค์ ์๋ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ ๋ฆฌ์กํธ๊ฐ ์๊ตฌํ๋ ๊ท์น์ด๊ธฐ ๋๋ฌธ์ ๋ง์ฝ ์ด ๊ท์น์ ์งํค์ง ์๊ณ ๋ฆฌ์กํธ ํ
์ ์ปค์คํ
ํ
์์ ์ฌ์ฉํ๋ฉด์ ์ด ์ปค์คํ
ํ
์ ์๋ชป๋ ๊ณณ์์ ์ฌ์ฉํ๊ฒ ๋์ ์, ๋ด๋ถ์์ ์ฌ์ฉํ๊ณ ์๋ ๋ฆฌ์กํธ ํ
์ญ์ ์๋ชป๋ ๊ณณ์์ ์ธ ์ ์์์ ๋ดํฌํ๋ ๊ฒ๊ณผ ๊ฐ๋ค. ์ด๊ฒ์ด ์ปค์คํ
ํ
ํ์ผ์ ์ด๋ฆ์ use๋ก ์์ํ๊ฒ๋ ํ๋ ์ด์ ๋ค. ์ด๋ ๊ฒ ํด์ผ ๋ฆฌ์กํธ์์ ์ด๋ค ํจ์๊ฐ use๋ก ์์ํ๊ณ ์๋ค๋ ์ ํธ๋ฅผ ์์ ๋ณธ ๋ค์ ํ
์ ๊ท์น์ ์๋ฐํ ๊ฒ์ด ๋ฐ๊ฒฌ๋๋ค๋ฉด ๋ณด๋ค ์ ํํ ๊ฒฝ๊ณ ๋ฅผ ๋ณด๋ผ ์ ์์ ๊ฒ์ด๋ค.const useCounter = () => {};
export default useCounter;
useCounter ๋ผ๋ ์ ๊ท ํจ์๋ฅผ ๋ง๋ ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ํจ์์ ๊ถ๊ทน์ ์ธ ๋ชฉ์ ์ ์ธ๋ถ์ ๋ค๋ฅธ ํ์ผ์์ ๊ฐ์ ธ์ ์ฌ์ฉํ๋ ๊ฒ์ด๋ฏ๋ก, ์ด ํจ์๋ฅผ export ํ๋๋ก ์์ฑํ๋ค.import { useEffect, useState } from "react";
const useCounter = () => {
const [counter, setCounter] = useState(0);
useEffect(() => {
const interval = setInterval(() => {
setCounter((prevCounter) => prevCounter + 1);
}, 1000);
return () => clearInterval(interval);
}, []);
};
export default useCounter;
ForwardCounter ์ปดํฌ๋ํธ์ ์๋ ์ฝ๋๋ฅผ ๋ชจ๋ ๋ณต์ฌ(JSX ์ฝ๋๋ฅผ ๋ฐํํ๋ ์ฝ๋๋ ๋จ๊ฒจ๋๋ค.)ํด์ ํด๋น ์ปค์คํ
ํ
ํจ์ ์์ ์ด์ ์์ผ ์ค๋ค.import useCounter from "../hooks/use-counter";
ForwardCounter ์ปดํฌ๋ํธ์ ํด๋น ๋ก์ง์ ๋ณต์ฌํด๋์๋ ์ปค์คํ
ํ
(useCounter)๋ฅผ import ํด์จ๋ค.import useCounter from "../hooks/use-counter";
const ForwardCounter = () => {
useCounter();
const [counter, setCounter] = useState(0);
useEffect(() => {
const interval = setInterval(() => {
setCounter((prevCounter) => prevCounter + 1);
}, 1000);
return () => clearInterval(interval);
}, []);
return <Card>{counter}</Card>;
};
useCounter๋ฅผ ํธ์ถํ๋ค. useCounter๋ฅผ ํธ์ถํ๊ฒ ๋๋ฉด useCounter์ ๋ด๋ถ ์ฝ๋๋ค์ด ์คํ๋ ๊ฒ์ด๋ค.const useCounter = () => {
const [counter, setCounter] = useState(0);
useEffect(() => {
const interval = setInterval(() => {
setCounter((prevCounter) => prevCounter + 1);
}, 1000);
return () => clearInterval(interval);
}, []);
};
effect๊ฐ ํด๋น ์ปดํฌ๋ํธ์ ๋ฌถ์ด๊ฒ ๋๋ค. ๋ฐ๋ผ์ ForwardCounter์์ useCounter๋ฅผ ํธ์ถํ๊ฒ ๋๋ฉด useCounter์์ ๋ง๋ค์ด์ง ์ํ(state)๊ฐ ForwardCounter ์ปดํฌ๋ํธ์ ๋ฌถ์ด๋ ๊ฒ์ด๋ค. ๋ ๋ค์์ ์ปดํฌ๋ํธ์์ ํน์ ์ปค์คํ
ํ
์ ์ฌ์ฉํ๊ฒ ๋๋ฉด ์ด ๋ค์์ ์ปดํฌ๋ํธ๊ฐ ์ปค์คํ
ํ
์ ์ํ(state)๋ฅผ ๋ฐ๊ฒ ๋๋ค. ๋ฌผ๋ก ์ปค์คํ
ํ
์ ์ฌ์ฉํ๋ค๊ณ ํด์ ์ปดํฌ๋ํธ ์ ๋ฐ์ ๊ฑธ์ณ ๋์ผํ ์ํ(state)์ effect๋ฅผ ๊ณต์ ํ๋ ๊ฒ์ ์๋๋ค. ๋ค๋ง ๋ชจ๋ ์ปดํฌ๋ํธ์์ ์ปค์คํ
ํ
์ด ์ฌ์คํ๋๊ณ ์ด ์ปค์คํ
ํ
์ ํธ์ถํ๋ ๋ชจ๋ ์ปดํฌ๋ํธ๊ฐ ๊ฐ์์ ์ํ(state)๋ฅผ ๋ฐ๊ฒ ๋ ๋ฟ์ด๋ค.ForwardCounter ์ปดํฌ๋ํธ์์ useCounter๋ฅผ ํธ์ถํ์ผ๋ฏ๋ก useCounter์ ์ํ์ธ counter๋ ForwardCounter์ ์ํด์ ์ค์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ useCounter์ useEffect ์ญ์ ForwardCounter ์ ์ํด์ ์ค์ ๋๊ณ ๋ฐ์๋๋ค. ๊ทธ๋ ๋ค๋ฉด ForwardCounter์์ useCounter์ ์ํ counter์ ์ ๊ทผํด์ ์ค์ ํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ๋ ๊ฑธ๊น?useState ๊ฐ์ ๋ด์ฅ ํ
๋ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ฌด์ธ๊ฐ๋ฅผ ํ๊ณ ์๋ค. ์ํ๋ฅผ ๋ง๋ค๊ณ ๊ด๋ฆฌ๋ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ ํ ์ค์ํ ์ญํ ๋ ๋งก์์ ํ๋ค.const [counter, setCounter] = useState(0);
useState์ ์ฝ๋๋ฅผ ๋ณด๋ฉด ๋ฐฐ์ด ๊ตฌ์กฐ๋ถํดํ ๋น์ ํตํด ๋ฐํํ๊ณ ์๋ ๊ฑธ ์ ์ ์๋ค. ์ปค์คํ
ํ
์ญ์ ํจ์์ด๋ฏ๋ก, ์ปค์คํ
๋ด๋ถ์ ์๋ ์ด๋ค ๊ฒ์ด๋ ๋ฐํํ ์ ์๋ค๋ ๋ป์ด๋ค. useCounter ๊ฐ์ ์ปค์คํ
ํ
์ ํธ์ถํด์ ์ฌ์ฉํ๋ ์ปดํฌ๋ํธ์์ counter ๋ผ๋ ์ํ(state)์ ์ ๊ทผํด ์ค์ ํ๊ธฐ ์ํด์๋ ์ปค์คํ
ํ
์ธ useCounter์์ ์ธ๋ถ ์ปดํฌ๋ํธ๊ฐ ์ฌ์ฉํ ์ ์๋๋ก ๋ฐํ์ ํด์ค์ผ ํ๋ค.const useCounter = () => {
const [counter, setCounter] = useState(0);
useEffect(() => {
const interval = setInterval(() => {
setCounter((prevCounter) => prevCounter + 1);
}, 1000);
return () => clearInterval(interval);
}, []);
return counter;
};
counter๋ฅผ ์ถ๊ฐํด์ค์ผ๋ก์ useCounter ์ปค์คํ
ํ
์ ์ํ(state)๋ฅผ ์ธ๋ถ ์ปดํฌ๋ํธ์์ ์ ๊ทผํ ์ ์๋๋ก ํด์ค๋ค. ์ปค์คํ
ํ
์์๋ ์ธ๋ถ ์ปดํฌ๋ํธ์์ ํ์ํ ๋ฌด์์ด๋ ๊ฐ์ ๋ฐํ์ด ๊ฐ๋ฅํ๋ค. ๋ฐฐ์ด์ด๋ ๊ฐ์ฒด, ์ซ์๋ ๋ฐํํ ์ ์๋ค.const [counter, setCounter] = useState(0);
useCounter๋ฅผ ํธ์ถํ๊ณ ์๋ ForwardCounter ์ปดํฌ๋ํธ์์๋ useCounter๊ฐ ๋ฐํํ๋ ๊ฐ์ ์ด์ฉํ ์ ์๋ค.const counter = useCounter();
ForwardCounter ์ปดํฌ๋ํธ์์ ํธ์ถํ useCounter()๋ฅผ counter ๋ผ๋ ์์๋ก ์ง์ ํ๊ณ , ์ด๋ฅผ ํ ๋นํ๋ค. ์ด๋ ๊ฒ ํ๋ฉด, useCounter๊ฐ counter๋ก ๊ฐ์ ๋ฐํํ๊ธฐ ๋๋ฌธ์ ForwardCounter ์ปดํฌ๋ํธ ์์ ์์(counter)์ ๊ฐ์ ์ง์ ํ ์ ์๋ค.const ForwardCounter = () => {
const counter = useCounter();
return <Card>{counter}</Card>;
};
ForwardCounter ์ปดํฌ๋ํธ์ ๋ก์ง์ด ๋งค์ฐ ๊ฐ๊ฒฐํด์ก๋ค.
use๋ก ์์ํด์ผ ํ๊ณ , ์ปค์คํ
ํ
๋ด๋ถ์ ์ํ(state)์ ๊ด๋ จ๋ ๋ก์ง์ ์ฌ์ฉํ๋ค๋๊ฐ, ๋ค๋ฅธ ๋ฆฌ์กํธ ํ
์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ์ด๋ฅผ ํตํด์ ์ปดํฌ๋ํธ ๊ฐ์ ํน์ ๋ก์ง์ ๊ณต์ ํ ์ ์๊ฒ ๋๋ค.const BackwardCounter = () => {
const [counter, setCounter] = useState(0);
useEffect(() => {
const interval = setInterval(() => {
setCounter((prevCounter) => prevCounter - 1);
}, 1000);
return () => clearInterval(interval);
}, []);
return <Card>{counter}</Card>;
};
BackwardCounter ์ปดํฌ๋ํธ์๋ ForwardCounter ์ปดํฌ๋ํธ์ ๋์ผํ ๋ก์ง์ ๊ฐ์ง๊ณ ์๋ค. ๋ค๋ง ๋ง์
๋์ ๋บ์
์ ์ด์ฉํ ๋ฟ์ด๋ค. ๋น์ฐํ ForwardCounter ์ฒ๋ผ useCounter ์ปค์คํ
ํ
์ ์ฌ์ฉํ ์ ์์ ๊ฒ์ด๋ค. ๋ค๋ง ์ด ๋ ๊ฐ์ ์ปดํฌ๋ํธ์์์ ์ฐจ์ด์ (๋ง์
๊ณผ ๋บ์
)์ ๋ฐ๋ฅธ ์กฐ๊ฑด๋ถ ๋ก์ง์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ์๋ค์ด๊ฒ ํด์ผ๋ง ํ๋ค. ์ปค์คํ
ํ
๋ ํจ์์ด๊ธฐ์ ํจ์๋ฅผ ์ฌ์ฉํ ๋ ์ฐ๋ ๊ฒ์ฒ๋ผ ์ฌ์ฌ์ฉ ๋ฐ ์ฌ์ค์ ์ ์ํด์ ์ธ์์ ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ์์ฌ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.useState ์ญ์ ์ด๊ธฐ ๊ฐ์ ์ค์ ํด์ฃผ๋ ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ์ ์ ์๋ค. ๋ ๊ฐ์ ์ธ์๋ฅผ ๋ฐ๋ useEffect ์ญ์ 2๊ฐ์ ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ์ ์ ์๋ค. effect ํจ์๋ฅผ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ๋ฐ๊ณ , ์์กด์ฑ ๋ฐฐ์ด์ ๋ ๋ฒ์งธ ์ธ์๋ก ๋ฐ์๋ค์ด๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ ์ง๊ธ๊น์ง ์ฐ๋ฆฌ๊ฐ ํด์๋ ๋ฐฉ์์ด๊ณ , ์ด ๋ฐฉ์์ ์ปค์คํ
ํ
์์๋ ๋์ผํ๊ฒ ์ฌ์ฉํ ์ ์๋ค. ๊ทธ๋ฌ๋ฉด, ํ์ฌ์ ์ปค์คํ
ํ
์์๋ ์ด๋ค ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์์๊น?const interval = setInterval(() => {
setCounter((prevCounter) => prevCounter - 1);
}, 1000);
counter๊ฐ ์ด๋ป๊ฒ ์ฆ๊ฐํ๋์ง๋ฅผ ์ ์ดํ๋ ์งํ์ด๋ค. ์ด ์ํ(state) ๊ฐฑ์ ํจ์ ์ ์ฒด(setCounter)๋ฅผ ๋ฐ์๋ค์ฌ์ ์๋์ ๋ ์ ์ฐํ๊ฒ ํ ์๋ ์๋ค.const useCounter = (counterUpdateFn) => {
const [counter, setCounter] = useState(0);
useEffect(() => {
const interval = setInterval(() => {
setCounter((prevCounter) => prevCounter + 1);
}, 1000);
return () => clearInterval(interval);
}, []);
return counter;
};
counterUpdateFn ์ด๋ผ๋ counter ์ํ ๊ฐฑ์ ํจ์๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋ฃ๊ณ , ใ
์คํ
ํ
์์๋ ์ด counterUpdateFn๋ฅผ ์คํํด์ฃผ๊ธฐ๋ง ํ๋ฉด ๋๋ค.const useCounter = (counterUpdateFn) => {
const [counter, setCounter] = useState(0);
useEffect(() => {
const interval = setInterval(() => {
setCounter(counterUpdateFn());
}, 1000);
return () => clearInterval(interval);
}, []);
return counter;
};
useCounter ์์ ๋ฐ๊ฒ๋๋ counterUpdateFn ์ธ์๋ ์คํ ๊ฐ๋ฅํ ํจ์์ด๋ฉฐ, ์ด๋ ์ด์ ์ counter๋ฅผ ๋ฐ์ ์๋ก์ด counter๋ฅผ ๋ง๋ค์ด์ค๋ค. ๋ฌผ๋ก ์์ ์ฝ๋์ฒ๋ผ ์ปค์คํ
ํ
์ ์ด๋ ๊ฒ ์ ์ฐํ๊ฒ ๋ง๋ค ์๋ ์์ง๋ง, ๋ง์
์ ํ ์ง ๋บ์
์ ํ ์ง๋ฅผ ์ ์ดํ๋ boolean ํ๋๊ทธ์ ๊ฐ์ ๊ฒ์ ์ฌ์ฉํ ์๋ ์๋ค. ์๋ฅผ ๋ค์ด,const useCounter = (forwards) => {
const [counter, setCounter] = useState(0);
useEffect(() => {
const interval = setInterval(() => {
setCounter((prevCounter) => prevCounter + 1);
}, 1000);
return () => clearInterval(interval);
}, []);
return counter;
};
forwards ๋ผ๊ณ ๋ช
๋ช
ํ ๋งค๊ฐ ๋ณ์๋ฅผ ์
๋ ฅํ๋ค๊ณ ํด๋ณด์. forwards๊ฐ true ์ด๋ฉด ๋ง์
์ ํ ๊ฒ์ด๊ณ , false ๋ฉด ๋บ์
์ ํ๋๋ก ๋ง๋ค ๊ฒ์ด๋ค. ์ด forwards๋ ์ด๊ธฐ๊ฐ์ ์ค์ ํ ์๋ ์๊ณ , ๊ทธ๋ ๊ฒ ๋๋ฉด ์ด ๋งค๊ฐ๋ณ์๋ boolean ๋ฐฉ์์ผ๋ก ์ ํํ ์ ์์ ๊ฒ์ด๋ค.const useCounter = (forwards = true) => {
const [counter, setCounter] = useState(0);
useEffect(() => {
const interval = setInterval(() => {
setCounter((prevCounter) => prevCounter + 1);
}, 1000);
return () => clearInterval(interval);
}, []);
return counter;
};
forwards ๋ผ๋ ๋งค๊ฐ๋ณ์์ ์ด๊ธฐ ๊ฐ์ true๋ก ์ค์ ํ๋ค. setInterval() ์์์๋ ์ด forwards๊ฐ true ์ธ์ง false ์ธ์ง๋ฅผ ํ์ธํด์ true ๋ฉด setCounter์ ์์ ๋ง์
์ผ๋ก ๋ง๋ค ๊ฒ์ด๊ณ , false ์ด๋ฉด setCounter์ ์์ ๋บ์
์ผ๋ก ๋ง๋ค ๊ฒ์ด๋ค.useEffect((forwards) => {
const interval = setInterval(() => {
if (forwards) {
setCounter((prevCounter) => prevCounter + 1);
} else {
setCounter((prevCounter) => prevCounter - 1);
}
}, 1000);
return () => clearInterval(interval);
}, []);
setCounter๋ฅผ ๊ฐ๊ฐ์ ๋งค๊ฐ๋ณ์ ์กฐ๊ฑด์ ๋ง๊ฒ ๊ฐฑ์ ํ๋๋ก ํ์ง๋ง, ์์ ํ๋ ๋ฐฉ์์ผ๋ก ์ ์ฒด ํจ์(ex. counterUpdateFn)๋ฅผ ๋ฐ์๋ค์ด๋ ๋ฐฉ๋ฒ๋ ๊ฐ๋ฅํ๋ค. ์ด๋ ์ชฝ์ด๋ ๊ฐ์ ์ด ์ปค์คํ
ํ
์ effect ์์๋ ์ด์ ์๋ก์ด ์์กด์ฑ์ด ์๊ฒผ์์ ์ ์ ์๋ค.useEffect ์์์ ์ฌ์ฉํ๊ณ ์๋ ๋งค๊ฐ๋ณ์ forwards๋ ๋ถ๋ช
์์กด์ฑ์ด๋ค. ์ด๋ useEffect ํจ์ ๋ด๋ถ์์ ์ ์๋ ๊ฒ๋ ์๋๊ณ , useCounter ์ปค์คํ
ํ
'์ธ๋ถ' ์์ ์ค์ ๋ ๊ฒ๋ ์๋๋ค. ๋์ ์ ์ด๋ ๋งค๊ฐ๋ณ์๋ก์ useCounter๊ฐ ๋ฐ๊ฒ ๋๋ ๊ฐ์ด๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ useEffect์ ์์กด์ฑ์ผ๋ก ์ถ๊ฐํด์ผ๋ง ํ๋ค.useEffect(() => {
const interval = setInterval(() => {
if (forwards) {
setCounter((prevCounter) => prevCounter + 1);
} else {
setCounter((prevCounter) => prevCounter - 1);
}
}, 1000);
return () => clearInterval(interval);
}, [forwards]);
forwards ๋ฅผ ์์กด์ฑ์ผ๋ก ์ถ๊ฐํจ์ผ๋ก์จ ์์กด์ฑ(forwards) ๋ณ๊ฒฝ์ด ์ผ์ด๋ ๋๋ง๋ค useEffect ํจ์๊ฐ ์ฌ์คํ ํ ์ ์๋๋ก ํด์ค๋ค.forwards)์ด ๋ฐ๋์ง ์์ ๊ฐ๋ฅ์ฑ๋ ์๋ค. ์ปดํฌ๋ํธ ์์์ ๊ทธ ๊ฐ์ด ํญ์ ์ฐธ ๋๋ ๊ฑฐ์ง์ผ๋ก ๊ณ ์ ๋ ์๋ ์๊ธฐ ๋๋ฌธ์ด๋ค. ํ์ง๋ง ๊ด์ฐฎ๋ค. ์์กด์ฑ์ด ๋ฐ๋์ง ์๋ ์ด์ useEffect๋ ์ฌ์คํ ๋์ง ์๊ธฐ ๋๋ฌธ์ด๋ค. ๋ํ, ์์กด์ฑ ๊ฐ์ด ๋ฐ๋์ง ์์ ๊ฐ๋ฅ์ฑ์๋ ๋ถ๊ตฌํ๊ณ useEffect์ ํด๋น ์์กด์ฑ์ ์ถ๊ฐํ๊ธฐ๋ฅผ ๊ถ์ฅํ๋ ๊ฒ์๋ ํฐ ์ด์ ๊ฐ ์๋ค. useCounter ์ปค์คํ
ํ
์ ํธ์ถํด์ ์ฌ์ฉํ๋ ์ปดํฌ๋ํธ(์๋ก ๋ค๋ฅธ ์ธ์๋ฅผ ์ฌ์ฉ)๊ฐ ์๋ ๊ฒฝ์ฐ์ ์ธ์๊ฐ ๋ฐ๋๋ฉด effect ํจ์ ์ญ์ ์ฌ์คํํ ์ ์๋๋ก ๋ณด์ฅํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.BackwardCounter ์ปดํฌ๋ํธ์์ useCounter ํ
์ ํธ์ถํด์ผ๋ง ํ๋ค. ์ด์ ๊ณผ ๋์ผํ๊ฒ useCounter๋ฅผ import ํด์จ ๋ค์ useCounter์ ์ธ์๋ฅผ ์ ๋ฌํ๋ค.import useCounter from "../hooks/use-counter";
const BackwardCounter = () => {
const counter = useCounter(false);
return <Card>{counter}</Card>;
};
BackwardCounter ์ปดํฌ๋ํธ์ ๋บ์
๋ก์ง์ useCounter๋ก ์ ๋ฌํ๋ ๋งค๊ฐ๋ณ์(forwards)์ ๊ฐ์ด false ์ฌ์ผ ํ๊ธฐ ๋๋ฌธ์ useCounter์ false ๋ฅผ ์ ๋ฌํ๋ค.
ForwardCounter์ปดํฌ๋ํธ์ ๋ง์ ๋ก์ง์ ๋งค๊ฐ๋ณ์๊ฐ true ์ด๊ณ , ๋งค๊ฐ๋ณ์์ ์ด๊ธฐ๊ฐ์ด true ์ด๊ธฐ ๋๋ฌธ์ ๊ทธ๋๋กuseCounter๋ฅผ ํธ์ถ๋ง ํ๋ค.
๋ง์ฝ, ๋งค๊ฐ๋ณ์์ ๊ธฐ๋ณธ ๊ฐ ์ธ์ ๋ค๋ฅธ ๊ฐ์ ์ํ๋ค๋ฉด ๋น์ฐํ BackwardCounter ์ปดํฌ๋ํธ์ useCounter(false) ์ฒ๋ผ ํด๋น ๊ฐ์ ์ง์ ํด์ ๋๊ฒจ์ค์ผ ํ๋ค. ์ด์ ๋ชจ๋ ๋ก์ง์ด ์๋ฃ ๋์๋ค. BackwardCounter ์ปดํฌ๋ํธ ์ญ์ ForwardCounter ์ปดํฌ๋ํธ์ฒ๋ผ ๋ก์ง์ด ๋งค์ฐ ๊ฐ๊ฒฐํด์ง ๊ฒ์ ์ ์ ์๋ค.
const BackwardCounter = () => {
const counter = useCounter(false);
return <Card>{counter}</Card>;
};

useCounter)๋ฅผ ํตํด ์ ์์ ์ผ๋ก ์๋๋๋ ๊ฑธ ํ์ธํ ์ ์๋ค.์ง๊ธ๊น์ง์ ์ฝ๋๋ค์ ์ธ์์ ์ธ ์์์ผ ๋ฟ์ด๋ฉฐ, ํ์ค์ ์ผ๋ก ์ค๋ฌด์์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ์๋ ์๋ ์๋ค. ์๋ฅผ ๋ค๋ฉด ๋ ๊ฐ์ ์ปดํฌ๋ํธ ๋์ ํ๋์ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ ์๋ ์์ง๋ง ์ปค์คํ ํ ์ ์ดํดํ๊ธฐ ์ํด ๋ณ๊ฐ๋ก ๋๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ์ด ์ ์ ์ธ์งํ๊ณ ์๋๋ก ํ์.
๐จ ํด๋น ํฌ์คํ ์ Udemy์ โReact ์๋ฒฝ ๊ฐ์ด๋โ ๊ฐ์๋ฅผ ๋ฒ ์ด์ค๋ก ํ ๊ธฐ๋ก์ ๋๋ค.
โ๐ป ๊ฐ์ git repo ๋ฐ๋ก๊ฐ๊ธฐ