TDD 시작하기 - 4
TDD 기능 명세 및 설계
기능 명세
- 파워포인트를 이용한 스토리보드
- 이메일과 같은 간단한 문장 형태
- JIRA와 같은 이슈의 형태로 기능 명세 받음
- 회의 자리에서 구두로 전달
기능을 크게 2가지로 나누어 보면
입력과결과로 나눌 수 있음
ex) 로그인 기능
- 입력 : 아이디와 암호
- 결과 : 아이디와 암호가 일치하면 성공, 일치하지 않으면 실패
3장의 만료일 계산 기능을 예로 들면
인자로 받은 PayData가 입력이고 리턴값으로 받은 LocalDate인 만료일이 결과가 된다.
* Exception 또한 결과가 될 수 있음. ex) 회원 가입 기능 -> 동일 ID 존재
설계 과정을 지원하는 TDD
TDD를 하다 보면 테스트 코드를 작성하는 과정에서 일부 설계를 진행하게 된다.
여태 2장과 3장에서 했던 TDD를 떠올려보면 처음부터 완벽하게 설계하고 그것에 맞춰 코드를 작성하지 않았다. 기본적인 흐름은 현시점에서 테스트를 통과시키는데 필요한 만큼의 코드만 작성한 후, 테스트 사례를 새로 추가해 통과시키는 과정에서 설계 및 코드를 변경했다. 이러한 흐름은 실제 설계 과정과 매우 비슷하다.
테스트 코드 작성을 위해 결정하는 요소
- 클래스 이름
- 메서드 이름
- 메서드 파라미터
- 실행 결과
이 과정에서 타입이 제공할 기능을 실행하는데 필요한 값과 결과가 무엇인지 고민 = 실제 설계
만료일 계산기에서도 기존에 설계됐던 입력이 납부일과 납부액 이었는데
첫 납부일을 사용하게 되면서 코드가 변경되었다
// 기존 코드
LocalDate expiryDate = cal.calculateExpiryDate(billingDate, payAmount);
// 바뀐 코드
PayData.builder()
.firstBillingDate(LocalDate.of(2025, 1, 31))
.billingDate(LocalDate.of(2025, 2, 28))
.payAmount(20_000)
.build(),
LocalDate.of(2025, 4, 30));
// 납부일, 납부액, 첫 납부일을 담는 타입을 새로 만듦
- TDD는 미리 앞서서 코드를 만들지 않으므로 불필요한 구성 요소를 덜 만들게 된다.
기능 명세 구체화
기획자가 작성한 요구사항 명세(스토리보드, 와이어프레임 등)을 보고 개발자는 상황에 따라 기능이 어떻게 동작해야 하는지 구체적으로 정리해야 한다. TDD에서도 테스트 코드를 작성하기 위해 해당 기능에서 입력과 결과가 어떻게 이루어지는지 구체적인 내용이 필요하다.
만료일 계산 기능
- 서비스 사용하려면 매달 1만 원을 선불로 납부. 납부일 기준으로 한 달 뒤가 서비스 만료일이 된다.
- 2개월 이상 요금을 납부할 수 있다.
- 10만 원을 납부하면 서비스를 1년 제공한다.
이 요구사항을 보고 한 달 뒤 에 대한 정확한 예가 필요하다. 날짜는 말일의 시점이 월마다 달라지기 때문에 이 부분에 대한 구체화의 필요성이 먼저 느껴지게 될 것이다.
- 개발자 : 4월 1일에 만원을 납부하면 만료일은 언제에요? 4월 30일인가요? 5월 1일인가요?
- 기획자 : 5월 1일입니다.
...
- 개발자 : 1월 29일이나 1월 30일에 만원을 납부해도 2월 28일인가요? 윤년이면 2월 29일이 되구요?
- 기획자 : 네 맞아요.
- 개발자 : 그러면 1월 31일이나 5월 31일처럼 만원을 납부한 일자가 다음 달 말일 일자보다 크면 이때 만료일은 다음 달 말일이라고 생각하면 될까요?
- 기획자 : 네!
...
이런 식으로 요구사항에 대한 구체화를 해서 바로 테스트 코드에 반영하면 테스트 코드가 구체적인 명세가 될 수도 있다. 테스트 코드로 구체적인 명세가 관리되기 때문에 유지보수에도 큰 이점이 있다.
현재 내가 하고 있는 업무에서는 테스트 코드를 사용하지 않는다. 위 내용을 공부하고 보니 신규로 추가되는 기능중 핵심 기능만이라도 부분적으로 TDD를 도입하여 개발하면 테스트 및 유지보수가 효과적일거라는 생각이 들었다. 그리고 기존 레거시 코드들은 어떻게 관리를 할 수 있을까? 라는 궁금증도 들었다. 검색을 해보니 흥미로운 포스팅들이 나와서 나중에 읽어보고 고민할 시간을 가져봐야겠다고 생각했다..
https://techblog.woowahan.com/2613/
Leave a comment