-
Notifications
You must be signed in to change notification settings - Fork 1
๐คธ๐ปโโ๏ธ ์ฐ๋นํํ TDD ์ ์ฉ๊ธฐ
Soobeen Yoon edited this page Nov 17, 2022
·
30 revisions
-
๊ธฐ๋ณธ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์๋ง ์ ์ฉํ์!- ๋ณตํฉ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ๊ฒฝ์ฐ, ๊ธฐ๋ณธ ์ ๋ ฌ์ด ์๋ฒฝํ๋ค๋ฉด ๋ฌธ์ ์์ด ์ํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ.
- ํ๋ก์ ํธ์ ํต์ฌ feature๊ฐ TodoList ์ ๋ ฌ์ด๊ธฐ ๋๋ฌธ์, ์๊ฐ/๋น์ฉ์ ๊ณ ๋ คํ์ฌ core logic์๋ง TDD๋ฅผ ์ ์ฉํ๊ธฐ๋ก ํ๋ค.
- ์ ๋ ฌ์กฐ๊ฑด ๋น function 1๊ฐ ์ ์ธ์ ๊ฐ์ ํ๊ณ ,
function ํ๋ ๋น ํ๋์ ํ ์คํธ ์ผ์ด์ค๋ฅผ ๋ง๋ ๋ค.
| Category | Type | Task | Description |
|---|---|---|---|
| ์๊ณ ๋ฆฌ์ฆ(TDD) | ๊ธฐ๋ณธ ์ ๋ ฌ ํ ์คํธ | Imminence ์ ๋ ฌ | ๋ค๋ฅธ ์กฐ๊ฑด์ด ๋ชจ๋ ๋์ผํ๋ค๋ฉด, Imminent Todo๊ฐ Active๋๋ค. |
| ์๊ณ ๋ฆฌ์ฆ(TDD) | ๊ธฐ๋ณธ ์ ๋ ฌ ํ ์คํธ | Importance ์ ๋ ฌ | ๋ค๋ฅธ ์กฐ๊ฑด์ด ๋ชจ๋ ๋์ผํ๋ค๋ฉด, Importance๊ฐ ๋์ Todo๊ฐ Active๋๋ค. |
| ์๊ณ ๋ฆฌ์ฆ(TDD) | ๊ธฐ๋ณธ ์ ๋ ฌ ํ ์คํธ | EDF ์ ๋ ฌ | ๋ค๋ฅธ ์กฐ๊ฑด์ด ๋ชจ๋ ๋์ผํ๊ณ , Deadline์ด ๋น ๋ฅธ Todo๊ฐ Active๋๋ค. |
- ์ ๋ ฌ ํจ์๊ฐ ์ ๋๋ก ํธ์ถ๋์๋์ง ์์ค์ผ๋ก๋ง ํ ์คํธ์ผ์ด์ค๋ฅผ ์์ฑํ๋ค.
- ๋ณตํฉ์ ์ธ ์ํฉ์ด๋, ๋์ ์ธ ๋ณํ๊ฐ ์๊ฒผ์ ๋ ์ ๋ ฌ ๊ธฐ์ค์ ๋ง๊ฒ ์ ๋ ฌ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ ์ฉ๋์๋์ง ํ์ธํ๋ ์์ ์ด๋ค.
- ์ด ๊ฒฝ์ฐ, ์ ๋ ฌ ํจ์๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ค๊ณ๋์๋ค๋ฉด ํฐ ์ด์์ด ์์ ๊ฒ์ผ๋ก ํ๋จ๋๋ฏ๋ก, ์ ํ์ ์ผ๋ก ํจ์๊ฐ ํธ์ถ๋์๋์ง ํ์ธํ๋ ์์ค์ผ๋ก ํ ์คํธํ๋ค. TDD๋ฅผ ์์ ํ ์ ์ฉํ๋ค๊ธฐ ๋ณด๋ค๋, ๊ฐ๋ฐ์๊ฐ ์ง์ ํ์ธํ๋ ๊ฒ์ ๊ธฐ๋ณธ์ผ๋ก ํ๋ค.
| 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๋ฅผ ๋๋ ค๋๊ฐ์๊ตฌ!
- ๊ณตํต ์ ์
- ์ ์ฒด Todo List๋ State๋ก ๊ด๋ฆฌํ๋ค.
- ๋ชจ๋ function์ ์๋ณธ ๋ฐ์ดํฐ๋ฅผ ์์ ํ์ง ์๋๋ก ์์ฑํ๋ค. (๋ถ๋ณ์ฑ ์ค์)
- ๊ณตํต ์ฝ๋
interface Todo {
id: string;
importance: number;
}
const todo1: Todo = {
id: 'id',
importance: 3,
};
const todo2: Todo = {
id: 'id',
importance: 2,
};class TodoList {
todoList: Array<Todo>;
constructor(initialTodoList: Array<Todo>) {
this.todoList = initialTodoList;
}
sort(): TodoList {
const todoList = [...this.todoList];
return new TodoList(
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>
);
}- ํจ์ import๋ฅผ ์ค์ผ ์ ์๋ค.
-
todoList.pop().sort();์ ๊ฐ์ด ์ฒด์ด๋ํ์ฌ ์ฌ์ฉํ ์ ์๋ค. - todoList๋ผ๋ parameter๋ฅผ ๋งค๋ฒ ๋๊ธฐ์ง ์์๋ ๋๋ค.
- ๋ฏธ๋ฆฌ ์ ์ธํด๋์๋ค๊ฐ ํด๋์ค์ ๊ตฌ์กฐ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ๋ค์ ์ ์ธํด์ผ ํ ์ ์๋ค.
- ํ ์คํธ ์ ๋ณต์กํ ์ ์๋ค.
expect(new TodoList([todo2, todo3, todo1]).sort()).toEqual(new TodoList([todo1, todo2, todo3])); //..? ํ์คํ์ง ์์- todoList๋ฅผ ๊ด๋ฆฌํ๋ ํจ์๋ค(sort, update ๋ฑ)์ด class ๋ด์ ์ ์ธ๋์ด ์์ผ๋ฏ๋ก ๊ฐ๊ฒฐํฉ์ธ ๊ฑด ์๋์ง ๊ณ ๋ฏผ๋๋ค. (?)
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>
);
}- ํ ์คํธ ์ฝ๋/๋ฐ์ดํฐ๊ฐ ๋จ์ํ๋ค. (๋จ์ ๋ฐฐ์ด๋ก ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ๊ตฌ์ฑํ ์ ์๋ค.)
expect(sort([todo2, todo3, todo1])).toEqual([todo1, todo2, todo3]);2. ์ ๋ง ํจ์ํ ํ๋ก๊ทธ๋๋ฐ๊ฐ๋ค(?)
- ์ฒด์ด๋์ด ๋ถ๊ฐ๋ฅํ๋ค. (ํ์ฅ์ฑ์ ๋ถ๋ฆฌํ ์ ์๋ค.)
- ๋งค๋ฒ todoList๋ฅผ parameter๋ก ๋๊ฒจ์ผ ํ๋ค.
- ์์ ๋ ผ์ํ๋ class๋ก ๊ด๋ฆฌํ๋ TodoList ์ญ์ ๋ด๋ถ ํจ์๋ฅผ ์์ํจ์๋ก ์์ฑํ๋ฉด FP + OOP์ ์ฅ์ ์ ๋ชจ๋ ๋๋ฆด ์ ์์ ๊ฒ์ด๋ค.
- OaO ํ๊ฒฝ์ค์ A to Z
- CRLF ๋๊ฐ ๋ญ๋ฐ ๋ ํ๋ค๊ฒ ํด?
- Github Issue ๋๋ํ๊ฒ ์ฌ์ฉํ๊ธฐ
- OAO! CI CD ์ ์ฉ๊ธฐ with release ์๋ํ
- ๋งค๋ฒ ๋ค๋ฅธ import๋ฌธ
- ๋ชป์๊ธด ์๋๊ฒฝ๋ก์์ ๊ฐzlzl์กด ์ ๋๊ฒฝ๋ก๋ก๐
- TodoList API ๊ฐ๋ฐ๊ธฐ
- ์์กด์ฑ ์ฃผ์ ์ผ๋ก DB๋ฅผ ๋ฐ๊ฟ๋ณด์
- ๋ ๋๋ง ์ต์ ํ ์๋ง: useNavigate๋ฅผ ์ถ๊ฐํ ์๊ฐ ๋ฆฌ๋ ๋ ๋ฒ์๊ฐ ํ์ฅ๋ ๊ฑด์ ๋ํ์ฌ
- ๋ ๋๋ง ์ต์ ํ 1ํ: ๋ ๋๋ง ๋ฒ์์ ๋ํ์ฌ (by ์ต์ ํ๋ฌด์)
- ๋ ๋๋ง ์ต์ ํ 2ํ: ์๋ชป๋ custom hook ์ฌ์ฉ,, ์ ์ฒด ๋ฆฌ๋ ๋๋ง์ ๋ถ๋ฅด๋ค,,
- ๋ ๋๋ง ์ต์ ํ 3ํ: Todo ์์ธ ์ข ๋ดค๋ค๊ณ ํ ์ด๋ธ ์ ์ฒด๊ฐ ์ฌ๋ ๋๋ง ๋๋๊ฑด์ ๊ณ ์น๊ธฐ๐
- ๋ ๋๋ง ์ต์ ํ 4ํ: ๋ค์ด์ด๊ทธ๋จ ํธ
- ๐ ๋ง์ฐ์ค ์๋์์น ๊ณ์ฐ์ ์ด์ํด
- React ์ปดํฌ๋ํธ์ ์ ๋๋ฉ์ด์ ์ ์ ์ฉํด๋ณด์ ๐๐ป๐จ
- ์ปดํฌ๋ํธ ์ฌ์ฌ์ฉ์ฑ์ ๋์ฌ๋ณด์: Modal ๋ถ๋ฆฌ๊ธฐ ๐น
- ์ ํ๊ด๊ณ๋ฅผ ์๋์์ฑ์ผ๋ก ์ถ๊ฐํด๋ณด์ ๐