도서

테스트 주도 개발 (TDD) - 켄트 백

꼰딩 2023. 3. 8. 23:38

테스트 주도 개발, 즉 TDD 라는 책을 구매했습니다.



최근 테스트코드에 대한 관심이 생겼는데, 테스트 코드 하면 TDD도 빠뜨릴 수 없다고 생각했습니다.



그렇다고 퇴근 하고 집에서 보려고 한 것은 아니고,


출퇴근 할 때 지하철에서 읽을 생각으로 샀습니다.



편도로 약 1시간 정도 걸리는데, 지하철에서만 40분정도를 있기 때문에


평소에는 휴대폰으로 뭘 검색하면서 가거나, 개발바닥 유튜브를 보거나, 힘들때는 웹툰같이 재밌는 것을 보면서 왔다갔다 합니다.



이 출퇴근 시간이 제 하루 중에 가장 부담없이 다른 공부를 할 수 있는 때라고 생각했고,


오늘 한 번 시도해봤습니다.



우선 책의 37페이지 까지는 서론이라서 건너뛰고, 114페이지 까지 읽었습니다. (총 380페이지)


책을 읽으면서 '결국은 OOP 구나' 하는 생각이 들었습니다.


그리고 테스트를 위한 코드를 작성하고, 테스트를 토대로 구현체를 바꿔가는 모습이 재밌었습니다.


자바 코드로 되어 있지만, 타입스크립트로 개발을 해서 그런지 어려운 부분은 없었습니다.



잠깐 여담으로, 제가 책을 6일 출근 전에 구매했는데, 출근하면서 포프TV의 영상을 보았습니다.


https://youtu.be/gs1qM1TF5zA


이 영상인데, 주 내용은 다음과 같습니다.


  • 함수의 선조건, 후조건을 잘 알고 코드를 잘 작성하면 코드를 작성하기 전에 테스트코드부터 작성하는 쓸데없는 짓을 안해도 된다.
  • 시간이 배로 걸린다.
  • 해외에서는 이미 비효율적인게 증명된 방법론이다.


이 영상을 보고 '아, 책을 괜히 샀구나' 싶어서 주문 취소를 하려고 보니까


당일배송 책이라서 구매한지 두시간지났는데 주문 취소가 막혀있었습니다. (정작 책은 7일 오후 11시50분쯤 도착..)



그런데 또 계속 생각을 해보니, 어차피 테스트 코드는 OOP의 중요성으로 이어지고,


tdd로 인해 테스트 코드 프레임워크가 매우 발달한것은 포프TV도 인정을 한 부분이니


아직 신입에 불과한 제가 배울 점이 많다고 느껴졌습니다.



또한, 포프TV가 대단한 개발자인것은 맞지만,


그래도 국내의 많은 개발자들이 (해외는 잘 모르겠네요) tdd를 좋아하는 것에는 이유가 있을 것이라고 생각했습니다.



책을 오늘 하루 읽어본 결과, 읽어볼만한 책이라고 생각합니다.


TDD의 이론을 배우기 위해서가 아니라, 테스트 코드를 어떤 흐름으로, 어떤 방식으로 작성해야 하는지 알 수 있는 부분이 많이 나와있기 때문입니다.


또 좋은 점은, 하나의 과정이 끝날 때 마다, 그 과정을 하기 위해 무엇을 했고 다음 과정에서는 무엇을 할 것이라고 챕터 마지막에 정리를 해줍니다.



예시로는 통화가 다른 화폐에 대한 곱셈을 계산하기 위한 코드가 나왔습니다.


public void testMultiplication() {
  Dollar five = new Dollar(5);
  five.times(2);
  assertEquals(10, five.amount);
}

아무런 코드가 없는 상황에서 이 테스트 코드로 시작을 합니다.


그러고서 코드를 깔끔하게 하기보다는 일단은 테스트를 통과하기 위해 코드를 작성하라고 말합니다.


처음에는 정말 이상하게 코드를 작성하는데, 점점 아름다워 지는 것을 느낄 수 있었습니다.



최종 목표는 dollar와 franc을 나타낼 수 있는 객체를 만드는 것이였는데,


dollar와 franc 클래스를 각각 만드는것부터 시작해서 최종적으로는 Money 클래스 하나만 남게 되었습니다.


class Money {
  static Money dollar(int amount) {
    return new Money(amount, "USD");
  }

  static Money franc(int amount) {
    return new Money(amount, "CHF);
  }

  Money times(int multiplier) {
    return new Money(amount * multiplier, currency);
  }

  public boolean equals(Object object) {
    Money money = (Money) object;
    return amount == money.amount && currency().equals(money.currency());
  }
}

자바 코드로 개발은 안해봐서 완전한 구조는 잘 모르겠지만,


대략 이런 코드가 작성됩니다



책에서 이런 표현이 나옵니다


컴퓨터라면 10초에서 15초 사이에 대답할 수 있는 문제를 놓고 최고의 소프트웨어 엔지니어들이 5분에서 10분 동안 고민하곤 한다.