세미나

[OKKYCON: 2018] 박재성 - 의식적인 연습으로 TDD, 리팩토링 연습하기

_min's 2020. 9. 13. 19:28
반응형

TDD는 무작정 연습하기보다 의식적으로 연습해야 한다.

 

책에서 추천하는 의식적인 연습 원칙

  • 한 단계 발전하기 위해서는 컴포트 존(익숙하고 편안한 수준)을 벗어난 지점에서 연습을 한다.
  • 피드백을 받을 수 있는 환경(코드리뷰나 테스트 코드 등)을 만들어서 피드백에 따라 다음 단계를 연습해야 한다.
  • 한 번에 많은걸 연습하기보다 한 가지 특정 부분을 개선하는 것이 효과적인 연습이다.

 

의식적인 TDD, 리팩토링 연습 과정

1단계 - 단위 테스트 연습

  • 내가 사용하는 API (String 클래스의 split, substring 등)
  • Input과 Output이 명확한 클래스 메서드 (보통 Util 성격의 메서드)
  • 알고리즘

2단계 - TDD 연습

  • 연습은 토이 프로젝트에 진행 ( 회사 프로젝트는 일정 압박에 연습이 잘 안됨 )
  • 외부 세상(웹 UI, DB)과 의존관계를 가지지 않은 요구사항으로 연습
  • 레드, 그린에 대한 연습을 충분히 진행하고 리팩토링 연습을 한다. 

3단계 - 리팩토링 연습

1. 메서드 분리

  • 한 메서드에 오직 한 단계의 들여 쓰기만 한다. ( 2단계 이상 들여 쓰기 X )
  • else를 쓰지 않는다. ( if문에서 return 시키면 아래 코드는 보지 않아도 됨 )
  • 메서드가 한 가지 일만 하도록 구현한다.
  • 꼭 필요하지 않은 로컬 변수를 제거 한다.
  • compose method 패턴 적용한다. ( 메서드의 의도가 잘 드러나도록 동등한 수준의 작업을 하는 여러 단계로 나눔 )
    ..... 잘 이해 안감

 

2. 클래스 분리

 

public class StringCalulator {
    public static int spliAndSum(String text) { ... }
    
    private static int[] toInts(String[] values) { ... }
    
    private static int toInt(String value) {
    	int number = Integer.parseInt(value);
        if (number < 0)
            throw new RumtimeException();
        return number;
    }
  • 모든 원시값과 문자열을 포장한다.
    원시 값인 toInt(String value)  메서드의 value를 클래스로 변환한다.
public class Positive {
    private int number;
    
    public Positive(String value) {
    	int number = Integer.parseInt(value);
        if (number < 0)
      	    throw new RuntimeException();
        this.number = number;
    }
}
  • value 값이 양수인 것을 보장하는 Positive 클래스를 파라미터 타입으로 활용
  • 일급 콜렉션을 쓴다.
  • 3개 이상의 인스턴스 변수를 가진 클래스를 쓰지 않는다.

 

4단계 - 토이 프로젝트 난이도 높이기

 

TDD, 리팩토링 연습하기 좋은 프로그램 요구사항

  • 게임과 같이 요구사항이 명확한 프로그램으로 연습
  • 의존관계(UI, DB, 외부 API)가 없이 연습
  • 약간은 복잡한 로직이 있는 프로그램 (로또, 사다리 타기, 볼링 게임 점수판, 체스 게임, 지뢰 찾기 게임)

 

5단계 - 의존관계(UI, DB, 외부 API) 추가를 통한 난이도 높이기

 

 

한 단계 더 나아간 연습하기

  • 컴파일 에러를 최소화하면서 리팩토링 하기
  • ATDD (통합 테스트)기반으로 응용 애플리케이션 개발하기
  • 레거시 애플리케이션에 트스트 코드 추가해 리팩토링하기

 

반응형