์ค๋์ ์์ฐ ํ์ด์ง๋ฅผ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
์ฐ์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋ฅ ๋จผ์ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
์ฐ๋ฆฌ๊ฐ ์ ์ฅํด์ผ ํ ์ค์ํ ๋ฐ์ดํฐ๊ฐ ์์ต๋๋ค.
๋ฐ๋ก ์ฌ์ฉ์๊ฐ ์
๋ ฅํ๋ ์์ฐ ๊ธ์ก์ด ๋๊ฒ ์ฃ !
useStateํจ์๋ฅผ ์ฌ์ฉํด์ ์ค์ํ ๋ณ์๋ฅผ ์ ์ฅํ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ input value๊ฐ์ budget์ผ๋ก ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ ํ์์ต๋๋ค.
์ด์ ์
๋ ฅ์ฐฝ์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด value๊ฐ์ด ๋ณ๊ฒฝ๋๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ๋ฑ๋กํ๋ฉด ๋ฉ๋๋ค.
๋ฆฌ์กํธ์์๋ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ ๋ setterํจ์
๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
์
๋ ฅ๊ฐ์ด ๋ณ๊ฒฝ๋์ด์ผ ํ๋๊น onChange
์ด๋ฒคํธ๋ฅผ ๋ฑ๋กํด์ฃผ๊ฒ ์ต๋๋ค.
import { useState } from 'react';
export default function App() {
const [budget, setBudget] = useState(0);
return (
<>
<label
htmlFor="budget"
>
ํ ๋ฌ ์์ฐ
</label>
<input
type="number"
placeholder="0"
value={budget}
onChange={(e) => setBudget(e.target.value)}
/>
<span>์</span>
</>
);
}
์ ๊ฐ placeholder
๊ฐ์ผ๋ก 0์ผ๋ก ์ฃผ์๊ธฐ ๋๋ฌธ์ ์๋์ ๊ฐ์ด ์์ํ๋ ํ๋ฉด์ด ๊ทธ๋ ค์ง๋ ๊ฑธ ํ์ธ ํ ์ ์์ด์.
์
๋ ฅ์ฐฝ์ ์ซ์๋ฅผ ์
๋ ฅํด๋ณด์์ต๋๋ค.
์ ๊ฐ input type
์ ์ซ์๋ก ์ฃผ์๊ธฐ ๋๋ฌธ์ ์ซ์๋ง ์
๋ ฅ๋๊ณ , ์ ๊ฐ ์
๋ ฅํ ๊ฐ์ผ๋ก ์ ๋ณ๊ฒฝ๋์ด ๋ณด์ด๋ ๊ฑธ ํ์ธ ํ ์ ์๋ค์.
์ด๋ ๊ฒ ์ ๊ฐ ๊ตฌํํ๊ณ ์ ํ๋ ๊ธฐ๋ฅ์ด ์ ์๋๋๋ค์!
๋ฆฌ์กํธ๋ก ์ํ ๊ด๋ฆฌ๋ฅผ ํด์ฃผ์๋๋ฐ, ์ ๋ ์ด๋ฒ ํ๋ก์ ํธ์์ ๋ฆฌ๋์ค๋ก ์ํ๋ฅผ ๊ด๋ฆฌํ๊ธฐ๋ก ํ์์ผ๋ ๋ฆฌ๋์ค๋ฅผ ์ฌ์ฉํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ฒ ํ๋ก์ ํธ์์ ํ
์คํธ ์ฝ๋ ์์ฑํ๊ณ ์๊ธฐ ๋๋ฌธ์ ํ
์คํธ ์ฝ๋
๋ฅผ ๋จผ์ ์์ฑํด์ผํฉ๋๋ค.
(TDD์ ๋ํ ๋ด์ฉ์ ๋ค์์ ์ ๋ฆฌํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.)
์์์ ๊ตฌํํ๊ณ ์ ํ๋ ๊ธฐ๋ฅ์ ์ฝ๋๋ก ๋จผ์ ๋ง๋ค์ด ๋ณด์๋๋ฐ,
์ฝ๋๋ก ์์ฑํ์ง ์์ ์ํ๋ผ๊ณ ๊ฐ์ ํด ๋ด
์๋ค.
๊ทธ๋ฆฌ๊ณ ํ ์คํธ ์ฝ๋๋ฅผ ๋จผ์ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค.
1๏ธโฃ given
2๏ธโฃ when
3๏ธโฃ then
์ด ์ธ ๊ฐ์ง๋ง ์ ์๊ฐํ๊ณ ํ๋ฉด์ ๋ฌด์์ด ๊ทธ๋ ค์ ธ์ผ ํ๋์ง ์ ์๊ฐํ๊ณ ํ ์คํธ ์ฝ๋๋ฅผ ๋จผ์ ์์ฑํฉ๋๋ค.
์์ฃผ ์์ ๊ฑฐ์์ ๋ถํฐ ์์ํฉ๋๋ค.
npm run test
ํ
์คํธ ์ฝ๋๋ฅผ ํ์ธ ํด๋ด
๋๋ค.
๐ Red ๋จ๊ณ์๋ ํต๊ณผํ์ง ๋ชปํ ํ
์คํธ๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค.
์ ๋ 'ํ ๋ฌ ์์ฐ'์ด๋ผ๋ ํ
์คํธ๋ฅผ ํ๋ฉด์ ๊ทธ๋ ค์ฃผ๋ ค๊ณ ํ๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ํ๋ ์ฝ๋๋ก ํ
์คํธ ์ฝ๋๋ฅผ ์์ฑํด๋ณด์์ต๋๋ค.
๊ทธ ๋ค์ ์ฝ๋๋ฅผ ๊ตฌํํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๐ Green ๋จ๊ณ๋ ํ
์คํธ๋ฅผ ํต๊ณผํ๋ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค.
ํ
์คํธ๊ฐ ํต๊ณผํ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ฒฐ๊ณผ ์ฝ๋๋ฅผ ์ต๋ํ ๊น๋ํ๊ฒ ๐ Refactoring ํ๋ ์งง์ ์ฃผ๊ธฐ๋ก ๋ฐ๋ณตํ๋ฉด ๋ฉ๋๋ค.
์ด๋ฐ ๋ฐฉ๋ฒ์ผ๋ก ์ฝ๋๋ฅผ ๊ตฌํํด ๋๊ฐ๋ฉด ๋ฉ๋๋ค.
1๏ธโฃ ๋ฆฌ์กํธ ๋ฒ์
useState ํจ์๋ฅผ ์ฌ์ฉํ์ต๋๋ค.
2๏ธโฃ ๋ฆฌ์กํธ ๋ฒ์
์ฝ๋๋ฅผ ์ข ์์ ํด ๋ณด์์ต๋๋ค.
3๏ธโฃ ๋ฆฌ์กํธ ๋ฒ์
์ฝ๋๋ฅผ ํ ๋ฒ ๋ ์์ ํด ๋ณด์์ต๋๋ค.
์ฌ๊ธฐ์ initialState
๋ ๋ฆฌ๋์์์ ์ฌ์ฉํ ์์ ์ด๊ณ , changeBudget
์ ์ก์
์ผ๋ก ๋ง๋ค์ด ์ค ์์ ์
๋๋ค.
4๏ธโฃ ๋ฆฌ๋์ค ๋ฒ์
๋ฆฌ๋์ค๋ก ์ํ๊ด๋ฆฌํ๊ธฐ ํธ์ ํ์ธํ๋ฉด ๋ฆฌ๋์ค๋ก ์ํ ๊ด๋ฆฌ ํ๋ ๋ฐฉ๋ฒ์ ์ ์ ์์ต๋๋ค.
reducer.js
ํ์ผ์ ๋ง๋ค๊ณ ์๋์ ๊ฐ์ด ๋ฆฌ๋์๋ฅผ ๋ง๋ค์ด ์ค๋๋ค.
5๏ธโฃ ๋ฆฌ๋์ค ๋ฒ์
actions.js
ํ์ผ์ ๋ง๋ค๊ณ ์๋์ ๊ฐ์ด ์ก์
์ ๋ง๋ค์ด ์ค๋๋ค.
6๏ธโฃ ๋ฆฌ๋์ค ๋ฒ์
useDispatch
์ useSelector
๋ฅผ ์ต์๋จ์ import ํด์ต๋๋ค.
๋ฆฌ๋์ค์ ์ํฏ๊ฐ์ ์์ ํ๋ ค๋ฉด ์ก์ ๊ฐ์ฒด์ ํจ๊ป dispatch ๋ฉ์๋๋ฅผ ํธ์ถํ๊ณ ๋ฆฌ๋์์์ ์ํ๊ฐ ๊ฐ์ง๊ณ ์ค๋๋ก ์ฝ๋๋ฅผ ์์ ํด๋ณด์์ต๋๋ค.
์์ฐ ํ์ด์ง์์ ๊ธ์ก ์
๋ ฅํ๋ ๋ถ๋ถ์ ๋ฆฌ๋์ค๋ก ๊ตฌํํด๋ณด์์ต๋๋ค.
CSS๋ก ์์๊ฒ ๊พธ๋ฉฐ์ฃผ๋ฉด ๋ฉ๋๋ค!
์๋์ ๊ฐ์ด ์์ฐ์ ์ค์ ํด๋์ผ๋ฉด ์ฌ์ฉํ ๋งํผ ๋ฌ๋ ค๊ฐ ์ค์ด๋๋ ๊ธฐ๋ฅ๋ ์ถ๊ฐ ํด๋ณด๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค์ ๐๐๐