Java Developer

Talk is cheap. Show me the code.

Sprout Method

24 Jul 2018

정의

“Working Effectively with Legacy Code by Michael Feathers” 책에 소개된 Sprout Method는 기존의 복잡한 Legacy코드를 쉽게? 리팩토링을 하는 방법중에 하나입니다. Legacy코드에 새로운 기능을 넣으려고 하면 기존 로직 사이에 분기를 통해서 추가 기능을 대부분 넣습니다. 하지만, 기존 코드 자체가 테스트가 어렵다면, 새로 추가된 기능 역시 테스트가 어렵게 됩니다. 즉 안좋은 악순환이 반복이 될뿐이고, 그 코드를 나중에 누군가가 보게 되면 지우고 싶은 코드가 될 수도 있습니다.

이런 상황에서는 2가지 옵션이 있다고 책에 나와있는데, 이 부분이 개인적으로 재미있었습니다.

  • Edit and Pray 수정한후에 버그가 없기를 기도하는 방법입니다. 테스크 케이스가 없는 어떤 코드가 본인이 전부 작성한 코드이면 정말 버그가 없이 잘 넘어갈 수도 있습니다. 하지만, 호출이 되는 곳이 많고, 내부 코드가 복잡할 수록 아무리 기도를 해도 배포 하는 순간 바로 버그가 나오기도 합니다. 그 코드를 작성자가 아닌 처음 본 사람이 수정한다면 어떻게 될까요? 기도만으로는 부족할거 같습니다.

  • Cover and Modify 다른 대안으로는 기존 코드에 대한 테스트 코드를 작성하고, 수정 코드를 반영하는 방식입니다.하지만, 기존 로직이 너무 크거나? 케이스가 많아서 전체 cover가 어려운 경우가 많습니다. 물론 이런 악조건에서도 test case를 작성할 수 있다면 TDD에 대해서 더 배우실게 없으실겁니다.

만약 새로운 기능을 추가하고자 할때 기존 로직과 분리되 새로운 함수를 만들고, 테스트 케이스를 작성하며, 기존 코드에서는 호출을 하는 방식으로 작성을 하면 이 코드 자체는 검증이 되어있고, 테스트가 가능하지 않을까요? 이방법이 Sprout method입니다.

How to make a Sprout Method

  • 변경이 필요한 코드를 확인합니다.
  • 변경사항이 기존 코드에서 호출만으로 해결할 수 있다면 그 위치을 기록을 해주세요.
  • 로컬에서 사용되는 변수가 필요하다면 새로 생성될 method의 파라미터로 전달하면 됩니다.
  • 새로 생성될 mehtod가 리턴이 필요한지 확인하고, 기존 코드의 어떤 변수에 담을지 결정하세요.
  • TDD를 활용해서 새로운 기능을 담을 sprout method를 개발하세요.
  • 기존 코드의 기록해두었던 위치에서 새로 추가된 method를 호출해주세요.

결론

Legacy code는 test case가 존재하지 않는 코드입니다. 이 코드를 개선을 진행할 수 없는 상황에서 새로운 기능을 추가해야한다면, 그 코드에 직접 비즈니스 로직을 담는 것을 중지하고, 조금씩이나마 검증해나갈 수 있는 sprout method를 도입을 권장합니다.

참조

  • https://danlimerick.wordpress.com/2012/04/25/tdd-when-up-to-your-neck-in-legacy-code/
  • http://taswar.zeytinsoft.com/learn-the-sprout-method-for-adding-new-functionality/