-
Notifications
You must be signed in to change notification settings - Fork 1
๐คธ๐ปโโ๏ธ ์ฐ๋นํํ TDD ์ ์ฉ๊ธฐ
- TDD๋ ํ๋ก๊ทธ๋๋ฐ ์์ฌ๊ฒฐ์ ๊ณผ ํผ๋๋ฐฑ ์ฌ์ด์ ๊ฐ๊ทน์ ์์ํ๊ณ ์ด๋ฅผ ์ ์ดํ๋ ๊ธฐ์ .
- TDD์ ์์ด๋ฌ๋ ์ค ํ๋๋ ํ ์คํธ ๊ธฐ์ ์ด ์๋๋ผ๋ ์ ์ ๋๋ค. TDD๋ ๋ถ์ ๊ธฐ์ ์ด๋ฉฐ, ์ค๊ณ ๊ธฐ์ ์ด๊ธฐ๋ ํฉ๋๋ค.
- ์ ๋์ํ๋ ๊น๋ํ ์ฝ๋ ํ๋ณด
- ๋๋ฒ๊น ์๊ฐ์ ์ค์ฌ์ค๋๋ค.
- ๋์ํ๋ ๋ฌธ์ ์ญํ ์ ํฉ๋๋ค.
- feature ์์ฑ ๋ฐ ์ด์ ๋ํ ํ ์คํธ ์๋๋ฆฌ์ค ๊ตฌ์.
- 2๋ฅผ ๋ฐํ์ผ๋ก ํ ์คํธ ์ฝ๋ ์์ฑ (์ต์ด ์์ฑ ์์๋ ๋ฌด์กฐ๊ฑด fail์ผ ๊ฒ์)
- ์ ๋ฌด ์ฝ๋ ์์ฑ
- ํ ์คํธ ํต๊ณผ ์ ๋ฆฌํฉํ ๋ง
1 ~ 4 ๋ฐ๋ณต

ํ์ฌ ์์ฑ ์์ ์์๋ 1๊น์ง ์๋ฃํ ์ํ์!
-
๊ธฐ๋ณธ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ
์๋ง ์ ์ฉํ์!- ๋ณตํฉ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ๊ฒฝ์ฐ, ๊ธฐ๋ณธ ์ ๋ ฌ์ด ์๋ฒฝํ๋ค๋ฉด ๋ฌธ์ ์์ด ์ํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ.
- ํ๋ก์ ํธ์ ํต์ฌ 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
๋ฅผ ๋๋ ค๋๊ฐ์๊ตฌ!
ํ์ ์ค ์๋์ ์ธ ๊ฐ์ง ๊ด์ ๋ค์ด ์ธ๊ธ๋์๊ณ , ์ด๋ค ๋ฐฉ์์ผ๋ก ํจ์๋ฅผ ์ ์ํ๊ณ ํ ์คํธํ ๊ฒ์ธ์ง์ ๋ํ ํ ๋ก ์ด ์์๋์๋ค.. ์ด์ ๋ฐ๋ผ ์๋์ ์ด์ด์ ๋์ค๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ๋ ผ์ ๋์์ด ๋์๋ค.
- ๊ด์ 1: ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ ๋ ์ข๋ ์์ํ๊ฒ ํน์ ๊ฐ๋ ์ฑ ์ข๊ฒ ํ๊ธฐ ์ํด ํจ์(ํน์ method)์ ์คํ์ ์ด๋ป๊ฒ ์ ํ ๊น?
- ๊ด์ 2: ์ฐ๋ฆฌ๊ฐ ์ค์ ์ฝ๋๋ฅผ ์์ฑํ ๋ ํจ์ ํน์ method๊ฐ ์ด๋ป๊ฒ ์๊ฒจ๋จน์ด์ผ ๋ ๊ฐ๊ฒฐํ๊ณ ๊ฐ๋ ์ฑ ์ข๊ฒ ์์ฑํ ์ ์์๊น?
- ๊ด์ 3: TDD๊ฐ ์ ์ง์ ์ผ๋ก refactoringํ๋ ๋ฐฉ๋ฒ์ด๋ฏ๋ก ์ฐ๋ฆฌ๊ฐ ์ผ๋จ ์ ํ๊ณ ํ ์คํธ๋ฅผ ์งํํ๋ฉด์ ์ด๋ฅผ ์ ํด์ผํ๋ ๊ฒ์ด ์๋๊น?
- ๊ณตํต ์ ์
- ์ ์ฒด 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 {
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>
);
}
- ํจ์ 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๋ก ๋๊ฒจ์ผ ํ๋ค.
- (๋ฅ ์ถ๊ฐ) interface๊ฐ ์ฐ๊ด๊ด๊ณ๊ฐ ์๋ค๋ฉด ๊ด๋ฆฌ๊ฐ ์ด๋ ค์์ง๋ค. (
sortTodoList(todoList: TodoList)
๊ฐtodoCompare(todo: Todo)
๋ฅผ ํ์ฉํ๋ค๋ฉด,sortTodoList
๊ฐ ์ ์ธ๋๋ ๋ชจ๋์์๋TodoList
,Todo
,todoCompare
๋ฅผ ๊ฐ๊ฐ importํด์ผ๋ง ํ๋ค... (class method ๋ฐฉ์์TodoList
์Todo
๋ชจ๋๋ง์ด ์กด์ฌ))
- ์์ ๋ ผ์ํ๋ class๋ก ๊ด๋ฆฌํ๋ TodoList ์ญ์ ๋ด๋ถ ํจ์๋ฅผ ์์ํจ์๋ก ์์ฑํ๋ฉด FP + OOP์ ์ฅ์ ์ ๋ชจ๋ ๋๋ฆด ์ ์์ ๊ฒ์ด๋ค.
- ๊ฒฐ๊ตญ์ ํ ์คํธ์ ๊ด์ฌ์ฌ๊ฐ ์ ์ผ ์ค์ํ๋ค. ์ง๋ฌธ์ ์๋๋ ์ฝ๊ฐ ๊ณ ๋ฏผ๊ณผ ๋ค๋ฅด์ง๋ง, ์์ ํจ์๊ฐ ์์์ ์์กด์ด๋ฉด (ํ ์คํธ ๋ฑ์) ์ ์ข๋๋ StackOverflow ์ง๋ฌธ์ ๋ฌ๋ฆฐ ๋๋ถ๋ถ์ ๋ต๊ธ์ ๋ณด๋ฉด ์์กด์ฑ์ ์ ์ ๊ฒฝ์? ์ด๋ผ๊ณ ๋๋ถ๋ถ์ ๋ต๋ณ์๊ฐ ์ฝ๋ฉํธํ๋ค. ์์ปจ๋ฐ ํ ์คํธํ๊ณ ์ถ์ ๊ธฐ๋ฅ์ด TodoList์ ์ ๋ ฌ์ด๋ผ๋ฉด Todo์ ์์กดํ๋ ๊ฒ์ ๋น์ฐํ๊ณ , ๊ทธ ์ด์์ ์์กด์ฑ ๋ถ๋ฆฌ๋ ์ ์ด์ ํ ์คํธ์ ๊ด์ฌ์ฌ๊ฐ ์๋๋ฐ ์ ์ ๊ฒฝ์ ์ฐ๋๋๋ ๊ด์ ์ด ๋ง์๋ค.
TDD๋ฅผ ๊ณํํ๋ฉด์ ํ ์คํธ ์ผ์ด์ค(์๋๋ฆฌ์ค)๋ฅผ ์์ฑํ๋ค ๋ณด๋ ์๊ณ ๋ฆฌ์ฆ ์ค๊ณ๊ฐ ์ข ๋ ๊ฒฌ๊ณ ํด์ก๋ค.
- ํ์๋ค๋ผ๋ฆฌ์ ์๊ฐ์ ์ผ์น์ํฌ ์ ์์๊ณ , ์๋ก ๋ค๋ฅธ ์๊ฐ์ ๊ฐ์ง ๋ถ๋ถ์ ํฉ์ํ๋ ๋ฐ ๋ ์์ํ๋ ๊ฒ ๊ฐ๋ค.
- ์๋ก ์์ธ ์ผ์ด์ค๋ฅผ ๊ณต์ ํ๋ฉด์ ์๊ณ ๋ฆฌ์ฆ์ ์ข ๋ ๊ฒฌ๊ณ ํ๊ฒ ๋ง๋ค์๊ณ , ์ฐ๋ฆฌ ํ๋ก์ ํธ์ ๋ํ ํ์ ๊ฐ์์ ์ดํด๋ ์ญ์ ํฅ์๋ ์ ์์๋ค.
- TDD๋ ๋ถ์ ๊ธฐ์ ์ด์, ์ค๊ณ ๊ธฐ์ ์ด ๋ง๋ ๊ฒ ๊ฐ๋ค..?
- 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 ๋ถ๋ฆฌ๊ธฐ ๐น
- ์ ํ๊ด๊ณ๋ฅผ ์๋์์ฑ์ผ๋ก ์ถ๊ฐํด๋ณด์ ๐