이론 정리
TDD 장단점 - Bob martin 과 Jim Coplien 토론을 보고
철매존
2024. 5. 25. 14:29
728x90
TDD 장단점 - Bob martin 과 Jim Coplien 토론을 보고
https://www.youtube.com/watch?v=eRxc4PD6RN0
일단 Bob은 TDD 신봉 Jim은 정반대
- TDD 3가지 법칙
- 실패하는 단위 테스트 작성 전까지는 한 줄의 상용 코드를 작성할 수 없다.
- 실패하기에 충분한 양의 단위 테스트만 작성해야 한다. (컴파일이 안되는것도 실패에 해당)
- 현댖 실패하는 테스트 코드들을 성공시킬 만큼만 상용 코드를 작성해야 한다.
- 즉 지금 실패하는 코드에 해당하는것 이상의 코드는 작성할 수 없다는 것
위의 내용은 30초단위로 실패코드-상용코드를 한꺼번에 작성한다는것을 의미한다.
- TDD의 2가지 문제(Jim이 경험한)
- 아키텍처나 프레임워크 없이 TDD를 사용한다.
- kent(아마 켄트백?) 이 얘기한 내용중 TDD를 사용해 아키텍처를 이끌어야 한다는것.
- 이거는 즉 하향식 아키텍처를 초래한다. 현재는 주체가 객체이고 절차를 테스트하는데 여기서 전체를 이용해 아키텍쳐를 구성한다면? 길을 잃고 리팩터링이 힘들다는것.(왜냐면 주체가 객체인데 다른 곳에서 아키텍쳐를 만드는거니까)
- kent(아마 켄트백?) 이 얘기한 내용중 TDD를 사용해 아키텍처를 이끌어야 한다는것.
- GUI를 망가뜨린다.
- 절차적 아키텍처가 자바 클래스 래퍼 안에 들어가면서 구조를 도메인 지식이나 사용자 개념 모델에 따라 이끌어 갈 수 없다.
- 아키텍처나 프레임워크 없이 TDD를 사용한다.
위의 3가지 법칙은 매우 좋은데, 이런 문제가 없다면 괜찮을 것이라고 생각한다.
-> 결국 여기서 얘기는 테스트를 하면서 구조를 만들어가는게 아키텍처를 구성하기 힘들다는것이 주제인것같음.
- Bob의 반박
- 애자일 커뮤니티에 따르면 아키텍처를 할 필요가 없다(?)
- 단지 더 많은 테스트와 스토리를 만들면 알아서 조립될 것이다.
- 이거는 말도안된다고 한다(나도 그래)
- 단지 더 많은 테스트와 스토리를 만들면 알아서 조립될 것이다.
- 아키텍처가 한번에 만들어지지는 않는다.
- 좋은 기술을 통해 여러번에 걸처 아키텍처를 만드는 것이다.
- 그래서 다양한 실험을 하고나서 두세번의 반복이 지나면 좋은 아키텍처가 될 것이다.
- 그게 실행되는 코드에 의해(+ 테스트)
- 그래서 다양한 실험을 하고나서 두세번의 반복이 지나면 좋은 아키텍처가 될 것이다.
- 좋은 기술을 통해 여러번에 걸처 아키텍처를 만드는 것이다.
- 애자일 커뮤니티에 따르면 아키텍처를 할 필요가 없다(?)
그리고
- 여기서 Jim 반박 -> 도메인 지식 없이 고객과의 상호작용만으로 하려하면 잘못된 방향으로 갈 수 있다.
- 예를들어 은행같은 경우 보이는게 다가 아니고 뒤에 복잡한 상호작용이 있는데 그거를 애자일하게 갈수 있느냐? 도메인 지식을 활용해서 미리 어떻게 할지 생각해둔다면 더 잘 접근할 수 있을 것이다.
그 다음에는 미리 구조를 잡아두는게 맞는지에 대한 얘기
- Bob : 나는 테스트를 하면서 만들어가고 미리 만드는건 하지 않겠다. 테스트하면서 자연스럽게 생길것
- Jimmy : 근데 우리는 명확하게 무엇을 만들지를 알고있으면 그걸 만들면 될것이다.
그다음은 프로페셔널에 대한 정의인데
- Bob : 프로페셔널하지 않은 개발자 -> 아무 테스트 코드 없이 그냥 배포하는사람 -> 그걸 방지하려면? TDD실천하기
- Jimmy : 전혀 동의하지 않고 더 중요한것은 계약에 의한 설계라는 생각이다. -> 사전,사후,불변 조건을 설정하는것. 이게 TDD의 장점을 다 가지고 있다는 생각이다. 그리고 계약은 인자의 전체 범위를 다루기 때문에 더 넓은 범위를 커버할 수 있다. 근데 테스트는 무작위로 흩뿌려서 하는거임. -> 근데 TDD는 그냥 유닛테스트 단위로 하기 때문에 API를 클래스 수준에서 비즈니스 중요성까지 추적하기가 매우 힘들다.
뭔가 얘기하다가 끊긴거 같은데
혼자 생각
나름대로 겪었던거랑 생각을 정리해 보면
- TDD의 장점
- 적어도 내가 생각한 문제상황에 대해서는 막아줄 수 있다는 것.
- 작은 단위로 테스트가 있고 그게 문제상황에 대한 것들이 많아서 코드가 많아질 때에 혹시 잘못된 동작을 하는걸 막을 수 있다는 장점이 있어보인다.
- 클래스에 관련 로직을 넣을 수 있다(근데 장점인지 단점인지는 잘 모르겠음...)
- 적어도 내가 생각한 문제상황에 대해서는 막아줄 수 있다는 것.
- TDD의 단점(다른거랑 같이 언급하면)
- 전체 로직에 대한 테스트를 하기가 쉽지않음(하나씩 조합하는거기는 한데 큰 단위는?)
- 쓸데없는 코드가 늘어날 수 있다.
- 뭔가 아키텍쳐 짤때 골때리는 경우가 많이 있긴했다.
개인적으로 TDD는 개발의 하방을 올리는 장점이 있고 뭔가 큰그림을 보기 어렵다는 느낌이 든다.
근데 좀 많이 공부하고 해봐야할것같다.
처음부터 TDD랑 OOP를 도입한 개발을 한다면 장점이 될 것 같고, 그거에 대한 도메인적 지식을 누군가 나중에 들어와서 파악하기는 좀 힘들것같은 느낌적인 느낌