Skip to content

๐Ÿคธ๐Ÿปโ€โ™‚๏ธ ์šฐ๋‹นํƒ•ํƒ• TDD ์ ์šฉ๊ธฐ

Soobeen Yoon edited this page Nov 17, 2022 · 30 revisions

TDD, ๊ทธ๊ฒŒ ๋ญ”๋ฐ,, ์–ด๋–ป๊ฒŒ ํ•˜๋Š”๊ฑด๋ฐ,,

TDD ํ•™์Šต์ •๋ฆฌ

TDD (Test Driven Development): TFD(Test First Development) + ๋ฆฌํŒฉํ† ๋ง

  • TDD๋ž€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์˜์‚ฌ๊ฒฐ์ •๊ณผ ํ”ผ๋“œ๋ฐฑ ์‚ฌ์ด์˜ ๊ฐ„๊ทน์„ ์˜์‹ํ•˜๊ณ  ์ด๋ฅผ ์ œ์–ดํ•˜๋Š” ๊ธฐ์ˆ .
  • TDD์˜ ์•„์ด๋Ÿฌ๋‹ˆ ์ค‘ ํ•˜๋‚˜๋Š” ํ…Œ์ŠคํŠธ ๊ธฐ์ˆ ์ด ์•„๋‹ˆ๋ผ๋Š” ์ ์ž…๋‹ˆ๋‹ค. TDD๋Š” ๋ถ„์„ ๊ธฐ์ˆ ์ด๋ฉฐ, ์„ค๊ณ„ ๊ธฐ์ˆ ์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

TDD๋ฅผ ํ•˜๋Š” ์ด์œ 

  • ์ž˜ ๋™์ž‘ํ•˜๋Š” ๊น”๋”ํ•œ ์ฝ”๋“œ ํ™•๋ณด
  • ๋””๋ฒ„๊น… ์‹œ๊ฐ„์„ ์ค„์—ฌ์ค๋‹ˆ๋‹ค.
  • ๋™์ž‘ํ•˜๋Š” ๋ฌธ์„œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์–ด๋–ป๊ฒŒ ํ•˜๋Š”๊ฑด๋ฐ,,

  1. feature ์ž‘์„ฑ ๋ฐ ์ด์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค ๊ตฌ์ƒ.
  2. 2๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ (์ตœ์ดˆ ์ž‘์„ฑ ์‹œ์—๋Š” ๋ฌด์กฐ๊ฑด fail์ผ ๊ฒƒ์ž„)
  3. ์—…๋ฌด ์ฝ”๋“œ ์ž‘์„ฑ
  4. ํ…Œ์ŠคํŠธ ํ†ต๊ณผ ์‹œ ๋ฆฌํŒฉํ† ๋ง

1 ~ 4 ๋ฐ˜๋ณต

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-11-18 แ„‹แ…ฉแ„Œแ…ฅแ†ซ 12 01 56

ํ˜„์žฌ ์ž‘์„ฑ ์‹œ์ ์—์„œ๋Š” 1๊นŒ์ง€ ์™„๋ฃŒํ•œ ์ƒํƒœ์ž„!

๊ณ ๋ฏผ

1. TDD๋ฅผ ์ ์šฉ ๋ฒ”์œ„๋Š” ์–ด๋–ป๊ฒŒ ์ •ํ• ๊นŒ?

  • ๊ธฐ๋ณธ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—๋งŒ ์ ์šฉํ•˜์ž!
    • ๋ณตํ•ฉ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๊ฒฝ์šฐ, ๊ธฐ๋ณธ ์ •๋ ฌ์ด ์™„๋ฒฝํ•˜๋‹ค๋ฉด ๋ฌธ์ œ ์—†์ด ์ˆ˜ํ–‰๋  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ.
    • ํ”„๋กœ์ ํŠธ์˜ ํ•ต์‹ฌ feature๊ฐ€ TodoList ์ •๋ ฌ์ด๊ธฐ ๋•Œ๋ฌธ์—, ์‹œ๊ฐ„/๋น„์šฉ์„ ๊ณ ๋ คํ•˜์—ฌ core logic์—๋งŒ TDD๋ฅผ ์ ์šฉํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.

๊ธฐ๋ณธ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜

  • ์ •๋ ฌ์กฐ๊ฑด ๋‹น function 1๊ฐœ ์„ ์–ธ์„ ๊ฐ€์ •ํ•˜๊ณ , function ํ•˜๋‚˜ ๋‹น ํ•˜๋‚˜์˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ๋งŒ๋“ ๋‹ค.
  • '์˜ค๋Š˜ ๋‹น์žฅ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ์ผ' > ๊ฐ Todo์˜ ์ค‘์š”๋„๊ฐ€ ๋†’์€ ์ˆœ ์ •๋ ฌ > Deadline์ด ๋น ๋ฅธ ์ˆœ์œผ๋กœ ์ •๋ ฌ
Category Type Task Description
์•Œ๊ณ ๋ฆฌ์ฆ˜(TDD) ๊ธฐ๋ณธ ์ •๋ ฌ ํ…Œ์ŠคํŠธ Imminence ์ •๋ ฌ ๋‹ค๋ฅธ ์กฐ๊ฑด์ด ๋ชจ๋‘ ๋™์ผํ•˜๋‹ค๋ฉด, Imminent Todo๊ฐ€ Active๋œ๋‹ค.
์•Œ๊ณ ๋ฆฌ์ฆ˜(TDD) ๊ธฐ๋ณธ ์ •๋ ฌ ํ…Œ์ŠคํŠธ Importance ์ •๋ ฌ ๋‹ค๋ฅธ ์กฐ๊ฑด์ด ๋ชจ๋‘ ๋™์ผํ•˜๋‹ค๋ฉด, Importance๊ฐ€ ๋†’์€ Todo๊ฐ€ Active๋œ๋‹ค.
์•Œ๊ณ ๋ฆฌ์ฆ˜(TDD) ๊ธฐ๋ณธ ์ •๋ ฌ ํ…Œ์ŠคํŠธ EDF ์ •๋ ฌ ๋‹ค๋ฅธ ์กฐ๊ฑด์ด ๋ชจ๋‘ ๋™์ผํ•˜๊ณ , Deadline์ด ๋น ๋ฅธ Todo๊ฐ€ Active๋œ๋‹ค.

๋ณตํ•ฉ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜

  • ์ •๋ ฌ ํ•จ์ˆ˜๊ฐ€ ์ œ๋Œ€๋กœ ํ˜ธ์ถœ๋˜์—ˆ๋Š”์ง€ ์ˆ˜์ค€์œผ๋กœ๋งŒ ํ…Œ์ŠคํŠธ์ผ€์ด์Šค๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.

  • ๋ณตํ•ฉ์ ์ธ ์ƒํ™ฉ์ด๋ž€, ๋™์ ์ธ ๋ณ€ํ™”๊ฐ€ ์ƒ๊ฒผ์„ ๋•Œ ์ •๋ ฌ ๊ธฐ์ค€์— ๋งž๊ฒŒ ์ •๋ ฌ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ ์šฉ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์ž‘์—…์ด๋‹ค.

  • ์ด ๊ฒฝ์šฐ, ์ •๋ ฌ ํ•จ์ˆ˜๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค๊ณ„๋˜์—ˆ๋‹ค๋ฉด ํฐ ์ด์ƒ์ด ์—†์„ ๊ฒƒ์œผ๋กœ ํŒ๋‹จ๋˜๋ฏ€๋กœ, ์ œํ•œ์ ์œผ๋กœ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์ˆ˜์ค€์œผ๋กœ ํ…Œ์ŠคํŠธํ•œ๋‹ค. TDD๋ฅผ ์™„์ „ํžˆ ์ ์šฉํ•œ๋‹ค๊ธฐ ๋ณด๋‹ค๋Š”, ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ํ™•์ธํ•˜๋Š” ๊ฒƒ์„ ๊ธฐ๋ณธ์œผ๋กœ ํ•œ๋‹ค.

  • ์˜ˆ์‹œ) ์˜ค๋Š˜ ๋‹น์žฅ ํ•ด์•ผ ํ•˜๋Š” ์ผ์„ ๋ชจ๋‘ ๋๋‚ด๋ฉด TodoList์— ๋‚จ์•„์žˆ๋Š” ํ•ญ๋ชฉ ์ค‘ ๊ฐ€์žฅ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ์ผ์„ ์ตœ์šฐ์„ ์œผ๋กœ ๋ณด์—ฌ์ค€๋‹ค.

Category Type Task Description
์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ณตํ•ฉ CREATE Imminent Todo List๊ฐ€ ๋น„์–ด ์žˆ๋Š” ์ƒํ™ฉ์—, Imminent Todo๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. ์ด ๊ฒฝ์šฐ, ์ƒˆ๋กœ ์ƒ์„ฑ๋œ Todo๊ฐ€ Active๋œ๋‹ค.
์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ณตํ•ฉ CREATE Imminent Todo List์— Todo๊ฐ€ 1๊ฐœ ์ด์ƒ์ธ ์ƒํ™ฉ์— Imminent Todo๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. ์ด ๊ฒฝ์šฐ, Imminent Todo List ์ค‘ Importance๊ฐ€ ๊ฐ€์žฅ ๋†’์€ Todo๊ฐ€ Active๋œ๋‹ค.
์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ณตํ•ฉ DELETE + ์ˆœ์„œ๊ด€๊ณ„ Imminent Todo List๊ฐ€ ๋น„์–ด์žˆ๊ณ , Distant Todo List์˜ Todo๊ฐ€ 2๊ฐœ ์ด์ƒ์ผ ๋•Œ Active Todo๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด ๋‹ค์Œ Todo๊ฐ€ Active๋œ๋‹ค.

์ง„ํ–‰ ๋ฐฉ์‹

  • Test Code ์ž‘์„ฑ ํ›„ ์„ฑ๊ณต 100%๋˜๊ฒŒ๋” ๋งŒ๋“ค์ž
  • ์ฒ˜์Œ์—๋Š” 100% fail
  • ํ•œ ํ•ญ๋ชฉ์”ฉ success๋ฅผ ๋Š˜๋ ค๋‚˜๊ฐ€์ž๊ตฌ!

2. ํ…Œ์ŠคํŠธ ๋Œ€์ƒ์ด ๋˜๋Š” ํ•จ์ˆ˜ ์ŠคํŽ™์„ ์–ด๋–ป๊ฒŒ ์ •์˜ํ•  ๊ฒƒ์ธ๊ฐ€?

๊ณ ๋ฏผ์ด ์‹œ์ž‘๋œ ์ด์œ 

ํšŒ์˜ ์ค‘ ์•„๋ž˜์˜ ์„ธ ๊ฐ€์ง€ ๊ด€์ ๋“ค์ด ์–ธ๊ธ‰๋˜์—ˆ๊ณ , ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•  ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•œ ํ† ๋ก ์ด ์‹œ์ž‘๋˜์—ˆ๋‹ค.. ์ด์— ๋”ฐ๋ผ ์•„๋ž˜์— ์ด์–ด์„œ ๋‚˜์˜ค๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ๋…ผ์˜ ๋Œ€์ƒ์ด ๋˜์—ˆ๋‹ค.

  • ๊ด€์  1: ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์ข€๋” ์ˆ˜์›”ํ•˜๊ฒŒ ํ˜น์€ ๊ฐ€๋…์„ฑ ์ข‹๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ํ•จ์ˆ˜(ํ˜น์€ method)์˜ ์ŠคํŽ™์„ ์–ด๋–ป๊ฒŒ ์ •ํ• ๊นŒ?
  • ๊ด€์  2: ์šฐ๋ฆฌ๊ฐ€ ์‹ค์ œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ํ•จ์ˆ˜ ํ˜น์€ method๊ฐ€ ์–ด๋–ป๊ฒŒ ์ƒ๊ฒจ๋จน์–ด์•ผ ๋” ๊ฐ„๊ฒฐํ•˜๊ณ  ๊ฐ€๋…์„ฑ ์ข‹๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์„๊นŒ?
  • ๊ด€์  3: TDD๊ฐ€ ์ ์ง„์ ์œผ๋กœ refactoringํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋ฏ€๋กœ ์šฐ๋ฆฌ๊ฐ€ ์ผ๋‹จ ์ •ํ•˜๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ์ด๋ฅผ ์ •ํ•ด์•ผํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹๊นŒ?

๊ณตํ†ต

  • ๊ณตํ†ต ์ „์ œ
    1. ์ „์ฒด Todo List๋Š” State๋กœ ๊ด€๋ฆฌํ•œ๋‹ค.
    2. ๋ชจ๋“  function์€ ์›๋ณธ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๋„๋ก ์ž‘์„ฑํ•œ๋‹ค. (๋ถˆ๋ณ€์„ฑ ์ค€์ˆ˜)
  • ๊ณตํ†ต ์ฝ”๋“œ
interface Todo {
  id: string;
  importance: number;
}

const todo1: Todo = {
  id: 'id',
  importance: 3,
};

const todo2: Todo = {
  id: 'id',
  importance: 2,
};

1) TodoList Class ๋จผ์ € ์„ ์–ธ ํ›„ ํ…Œ์ŠคํŠธ

class TodoList {
  todoList: Array<Todo>;

  constructor(initialTodoList: Array<Todo>) {
    this.todoList = initialTodoList;
  }

  sort(): TodoList {
    return new TodoList(
      [...this.todoList].sort((x, y) => {
        return x.importance - y.importance;
      }),
    );
  }
}

function App() {
  const [todoList, setTodoList] = useState(new TodoList([todo1, todo2]));

  useEffect(() => {
    // sort ์ง„ํ–‰ ์‹œ
    setTodoList((prevTodoList: TodoList) => {
      return prevTodoList.sort();
    });
  }, []);

  return (
    <div>
      Hello World!
    </div>
  );
}

์žฅ์ 

  1. ํ•จ์ˆ˜ import๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.
  2. todoList.pop().sort(); ์™€ ๊ฐ™์ด ์ฒด์ด๋‹ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  3. todoList๋ผ๋Š” parameter๋ฅผ ๋งค๋ฒˆ ๋„˜๊ธฐ์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

๋‹จ์ 

  1. ๋ฏธ๋ฆฌ ์„ ์–ธํ•ด๋‘์—ˆ๋‹ค๊ฐ€ ํด๋ž˜์Šค์˜ ๊ตฌ์กฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ๋‹ค์‹œ ์„ ์–ธํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  2. ํ…Œ์ŠคํŠธ ์‹œ ๋ณต์žกํ•  ์ˆ˜ ์žˆ๋‹ค.
expect(new TodoList([todo2, todo3, todo1]).sort()).toEqual(new TodoList([todo1, todo2, todo3])); //..? ํ™•์‹คํ•˜์ง„ ์•Š์Œ

์žฅ๋‹จ์„ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ค์šด ๋ถ€๋ถ„

  • todoList๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜๋“ค(sort, update ๋“ฑ)์ด class ๋‚ด์— ์„ ์–ธ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ๊ฐ•๊ฒฐํ•ฉ์ธ ๊ฑด ์•„๋‹Œ์ง€ ๊ณ ๋ฏผ๋œ๋‹ค. (?)

2) ๊ธฐ๋Šฅ ๋‹น ํ•จ์ˆ˜ ํ•˜๋‚˜์”ฉ ์„ ์–ธ ํ›„ ํ…Œ์ŠคํŠธ

const MANAGE_TODOLIST = {
  sort: (initialTodoList: Array<Todo>) => {
    return [...initialTodoList].sort((x, y) => {
      return x.importance - y.importance;
    });
  },
};

function App() {
  const [todoList, setTodoList] = useState([todo1, todo2]);
  useEffect(() => {
    // sort ์ง„ํ–‰ ์‹œ
    setTodoList((prevTodoList: Array<Todo>) => {
      return MANAGE_TODOLIST.sort(prevTodoList);
    });
  }, []);
  return (
    <div>
      Hello World!
    </div>
  );
}

์žฅ์ 

  1. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ/๋ฐ์ดํ„ฐ๊ฐ€ ๋‹จ์ˆœํ•˜๋‹ค. (๋‹จ์ˆœ ๋ฐฐ์—ด๋กœ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.)
expect(sort([todo2, todo3, todo1])).toEqual([todo1, todo2, todo3]);

2. ์ •๋ง ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ฐ™๋‹ค(?)

๋‹จ์ 

  1. ์ฒด์ด๋‹์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. (ํ™•์žฅ์„ฑ์— ๋ถˆ๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.)
  2. ๋งค๋ฒˆ todoList๋ฅผ parameter๋กœ ๋„˜๊ฒจ์•ผ ํ•œ๋‹ค.
  3. (๋Šฅ ์ถ”๊ฐ€) interface๊ฐ„ ์—ฐ๊ด€๊ด€๊ณ„๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ค์›Œ์ง„๋‹ค. (sortTodoList(todoList: TodoList)๊ฐ€ todoCompare(todo: Todo)๋ฅผ ํ™œ์šฉํ•œ๋‹ค๋ฉด, sortTodoList๊ฐ€ ์„ ์–ธ๋˜๋Š” ๋ชจ๋“ˆ์—์„œ๋Š” TodoList, Todo, todoCompare๋ฅผ ๊ฐ๊ฐ importํ•ด์•ผ๋งŒ ํ•œ๋‹ค... (class method ๋ฐฉ์‹์€ TodoList์™€ Todo ๋ชจ๋“ˆ๋งŒ์ด ์กด์žฌ))

์ถ”๊ฐ€๋กœ ๋…ผ์˜ํ–ˆ๋˜ ๋‚ด์šฉ๋“ค

FP์™€ OOP๋Š” ์„œ๋กœ ๋ฐฐ์ฒ™ํ•˜๋Š” ๊ฐœ๋…์ด ์•„๋‹ˆ๋‹ค.

  • ์•ž์„œ ๋…ผ์˜ํ–ˆ๋˜ class๋กœ ๊ด€๋ฆฌํ•˜๋Š” TodoList ์—ญ์‹œ ๋‚ด๋ถ€ ํ•จ์ˆ˜๋ฅผ ์ˆœ์ˆ˜ํ•จ์ˆ˜๋กœ ์ž‘์„ฑํ•˜๋ฉด FP + OOP์˜ ์žฅ์ ์„ ๋ชจ๋‘ ๋ˆ„๋ฆด ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

(๋Šฅ ์ถ”๊ฐ€, ์–ด๋””๋„ฃ์„์ง€ ๋ชจ๋ฅด๊ฒ ์Œ) ํ…Œ์ŠคํŠธ์˜ ๊ด€์‹ฌ์‚ฌ๊ฐ€ ๊ฒฐ๊ตญ ์ค‘์š”ํ•˜๋‹ค.

  • ๊ฒฐ๊ตญ์€ ํ…Œ์ŠคํŠธ์˜ ๊ด€์‹ฌ์‚ฌ๊ฐ€ ์ œ์ผ ์ค‘์š”ํ•˜๋‹ค. ์งˆ๋ฌธ์˜ ์˜๋„๋Š” ์•ฝ๊ฐ„ ๊ณ ๋ฏผ๊ณผ ๋‹ค๋ฅด์ง€๋งŒ, ์ˆœ์ˆ˜ ํ•จ์ˆ˜๊ฐ€ ์•”์‹œ์  ์˜์กด์ด๋ฉด (ํ…Œ์ŠคํŠธ ๋“ฑ์—) ์•ˆ ์ข‹๋ƒ๋Š” StackOverflow ์งˆ๋ฌธ์— ๋‹ฌ๋ฆฐ ๋Œ€๋ถ€๋ถ„์˜ ๋‹ต๊ธ€์„ ๋ณด๋ฉด ์˜์กด์„ฑ์„ ์™œ ์‹ ๊ฒฝ์”€? ์ด๋ผ๊ณ  ๋Œ€๋ถ€๋ถ„์˜ ๋‹ต๋ณ€์ž๊ฐ€ ์ฝ”๋ฉ˜ํŠธํ–ˆ๋‹ค. ์š”์ปจ๋ฐ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์‹ถ์€ ๊ธฐ๋Šฅ์ด TodoList์˜ ์ •๋ ฌ์ด๋ผ๋ฉด Todo์— ์˜์กดํ•˜๋Š” ๊ฒƒ์€ ๋‹น์—ฐํ•˜๊ณ , ๊ทธ ์ด์ƒ์˜ ์˜์กด์„ฑ ๋ถ„๋ฆฌ๋Š” ์• ์ดˆ์— ํ…Œ์ŠคํŠธ์˜ ๊ด€์‹ฌ์‚ฌ๊ฐ€ ์•„๋‹Œ๋ฐ ์™œ ์‹ ๊ฒฝ์„ ์“ฐ๋Š๋ƒ๋Š” ๊ด€์ ์ด ๋งŽ์•˜๋‹ค.

๋Š๋‚€์ 

TDD๋ฅผ ๊ณ„ํšํ•˜๋ฉด์„œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค(์‹œ๋‚˜๋ฆฌ์˜ค)๋ฅผ ์ž‘์„ฑํ•˜๋‹ค ๋ณด๋‹ˆ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ค๊ณ„๊ฐ€ ์ข€ ๋” ๊ฒฌ๊ณ ํ•ด์กŒ๋‹ค.

  • ํŒ€์›๋“ค๋ผ๋ฆฌ์˜ ์ƒ๊ฐ์„ ์ผ์น˜์‹œํ‚ฌ ์ˆ˜ ์žˆ์—ˆ๊ณ , ์„œ๋กœ ๋‹ค๋ฅธ ์ƒ๊ฐ์„ ๊ฐ€์ง„ ๋ถ€๋ถ„์„ ํ•ฉ์˜ํ•˜๋Š” ๋ฐ ๋” ์ˆ˜์›”ํ–ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.
  • ์„œ๋กœ ์˜ˆ์™ธ ์ผ€์ด์Šค๋ฅผ ๊ณต์œ ํ•˜๋ฉด์„œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ข€ ๋” ๊ฒฌ๊ณ ํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ๊ณ , ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ํŒ€์› ๊ฐ์ž์˜ ์ดํ•ด๋„ ์—ญ์‹œ ํ–ฅ์ƒ๋  ์ˆ˜ ์žˆ์—ˆ๋‹ค.
  • TDD๋Š” ๋ถ„์„ ๊ธฐ์ˆ ์ด์ž, ์„ค๊ณ„ ๊ธฐ์ˆ ์ด ๋งž๋Š” ๊ฒƒ ๊ฐ™๋‹ค..?

๐Ÿ’Š ๋น„ํƒ€500

๐Ÿ“Œ ํ”„๋กœ์ ํŠธ

๐Ÿพ ๊ฐœ๋ฐœ ์ผ์ง€

๐Ÿฅ‘ ๊ทธ๋ฃนํ™œ๋™

๐ŸŒด ๋ฉ˜ํ† ๋ง
๐Ÿฅ• ๋ฐ์ผ๋ฆฌ ์Šคํฌ๋Ÿผ
๐Ÿ’ ๋ฐ์ผ๋ฆฌ ๊ฐœ์ธ ํšŒ๊ณ 
๐Ÿฅ ์ฃผ๊ฐ„ ํšŒ๊ณ 
๐Ÿ‘ฏ ๋ฐœํ‘œ ์ž๋ฃŒ
Clone this wiki locally