๐Ÿœ Mine ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœ์ ํŠธ - ์˜ˆ์‚ฐ ํŽ˜์ด์ง€

Darleneยท2021๋…„ 8์›” 3์ผ
0

Mine ํ”„๋กœ์ ํŠธ

๋ชฉ๋ก ๋ณด๊ธฐ
7/12
post-thumbnail

๐Ÿœ Mine ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœ์ ํŠธ - ์˜ˆ์‚ฐ ํŽ˜์ด์ง€

๐Ÿ“‹ ๋ฆฌ์•กํŠธ, ๋ฆฌ๋•์Šค๋ฅผ ์ด์šฉํ•ด์„œ input๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ณผ์ •๊ณผ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ์†Œ๊ฐœ

์˜ค๋Š˜์€ ์˜ˆ์‚ฐ ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
์šฐ์„  ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋Šฅ ๋จผ์ € ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ์ €์žฅํ•ด์•ผ ํ•  ์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ฐ”๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•˜๋Š” ์˜ˆ์‚ฐ ๊ธˆ์•ก์ด ๋˜๊ฒ ์ฃ !

๋จผ์ € ๋ฆฌ์•กํŠธ๋กœ input์— ์ž…๋ ฅํ•œ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์–ด ๋ณด์ด๋„๋ก ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

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)์„ ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

(TDD์— ๋Œ€ํ•œ ๋‚ด์šฉ์€ ๋‹ค์Œ์— ์ •๋ฆฌํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.)

  • Red Green Refactoring

์•ž์—์„œ ๊ตฌํ˜„ํ•˜๊ณ ์ž ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ฝ”๋“œ๋กœ ๋จผ์ € ๋งŒ๋“ค์–ด ๋ณด์•˜๋Š”๋ฐ,
์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•˜์ง€ ์•Š์€ ์ƒํƒœ๋ผ๊ณ  ๊ฐ€์ •ํ•ด ๋ด…์‹œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋จผ์ € ์ž‘์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

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๋กœ ์˜ˆ์˜๊ฒŒ ๊พธ๋ฉฐ์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค!

๐Ÿพ ์ฐจ๊ทผ ์ฐจ๊ทผ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์•„๋ž˜์™€ ๊ฐ™์ด ์˜ˆ์‚ฐ์„ ์„ค์ •ํ•ด๋†“์œผ๋ฉด ์‚ฌ์šฉํ•œ ๋งŒํผ ๋‹ฌ๋ ค๊ฐ€ ์ค„์–ด๋“œ๋Š” ๊ธฐ๋Šฅ๋„ ์ถ”๊ฐ€ ํ•ด๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋„ค์š” ๐Ÿ™๐Ÿ™๐Ÿ™

0๊ฐœ์˜ ๋Œ“๊ธ€