리팩토링이란 무엇인가 (What, Who, Why)

What is Refactoring?

리팩터링 : [명사] 소프트웨어의 겉보기 동작은 그대로 유지한 채, 코드를 이해하고 수정하기 쉽도록 내부 구조를 변경하는 기법
리팩터링 : [동사] 소프트웨어의 겉보기 동작은 그대로 유지한 채, 여러 가지 리팩터링 기법을 적용해서 소프트웨어를 재구성하다.

리팩터링이 대한 위 정의에서 핵심은 '소프트웨어의 겉보기 동작은 그대로 유지한 채' 입니다.

리팩터링 하기 전/후 코드는 물론이고, 리팩터링이 진행되는 동안의 모든 과정의 코드는 모두 정상작동하는 동일한 결과를 얻을 수 있어야 합니다.

한가지 주의해야 할 사항은, 리팩터링의 목적은 프로그램의 성능을 높이는것이 아닌 코드를 이해하고 수정하게 쉽게 만드는 것 이라는 것을 명심해야합니다.

리팩터링의 결과 성능은 좋아 질수도, 오히려 나빠질 수도 있습니다. 다만 분명한것은 리팩터링을 잘 해두면 성능 튜닝을 하는데 시간적, 품질적 으로 좋은 효과를 얻을 수 있습니다.


Who is Refactoring?

1

테스트 주도 개발 책의 저서이자 수많은 개발서적에서 참조되는 켄트 백은 개발할때 목적을 명확하게 구분해야 한다는 것을 두개의 모자(two hats)에 비유했습니다.

두개의 모자는 아래와 같습니다.

  • 기능추가 모자 : 기존의 코드를 절대로 건드리지 않고 새 테스트와 새 기능만을 추가한다.
  • 리팩터링 모자 : 새로운 기능을 만들지 않고 오로지 코드 재구성에만 전념한다.

우리는 각각의 모자를 썼을때 내가 쓰고 있는 모자가 무엇인지 생각을 하고 스스로 작업방식에 차이를 두어야 합니다.

리팩터링 모자를 쓴 개발자가 리팩터링 작업을 해야합니다.


Why Refactoring?

리팩터링이 모든 소프트웨어의 문제를 해결해주는 마법은 아니지만, 코드를 건강하게 유지시켜주는 입니다.

은 다음과같은 효능이 있습니다.

소프트웨어 설계가 좋아진다.

  • 중복코드가 줄면 모든 코드가 언제나 고유한 일을 수행함이 보장 할 수 있고 이는 바람직한 설계의 핵심이다.

소프트웨어를 이해하기 쉬워진다.

  • 코드의 목적이 더 잘 드러나게끔 개선시킨다.

버그를 쉽게 찾을 수 있다.

  • 코드를 이해하기 쉬운만큼 버그를 쉽게 찾을 수 있다.

프로그래밍 속도를 높일 수 있다.

  • 위의 효능들로 인해 개발 속도가 높아진다.

모든 이 주의사항이 있듯이 이 도 다음과같은 주의사항이 있습니다.

새 기능의 개발속도가 저하 될 수 있다.

  • 장기적으로 보았을때 리팩터링의 궁극적인 목적은 개발 속도를 높여서 더 적은 노력으로 더 많은 가치를 창출하는것이다

코드 소유권이 없는 부분이 포함되어있을때 작업이 어려울 수 있다.

  • 일부분의 소유권이 없다고 리팩터링 할 수 없는것은 아니지만, 느슨한 코드소유 정책을 갖는것이 좋다.

동시 작업자가 많을때 브랜치 관리가 어려울 수 있다.

  • 브랜치 통합 주기를 가능한 짧게, 더짧게 가져가야 한다.

테스트 코드 작성으로 리팩터링 과정중에 발생하는 오류들을 재빨리 잡아야 한다.

레거시 코드를 리팩터링 할때에는 테스트를 보강하며 조금이라도 개선하려고 노력해야한다.

고전의 관점에서 소프트웨어 아키텍처는 '개발되기 전에 설계하는 것 이고 개발이 시작된 후로는 아키텍처가 변경 될 수 없다'라는 관점을 가지고 있었지만, 리팩터링의 개념이 활성화 되고 난 후로는 '수년간 운영되오던 소프트웨어라도 아키텍처를 변경 할 수 있다'는 관점으로 변했습니다.

이렇게 변한 관점으로 인해 소프트웨어 아키텍처는 지속적인 리팩터링으로 현재까지 파악한 요구사항들에 대해서 최선의 설계를 하는 점진적 설계, YAGNI (You aren't going to need it (필요 없을거다))를 하는 방식으로 많이 변경되었습니다.


Reference

  • 리팩터링 2판 (https://front.wemakeprice.com/product/822375110?search_keyword=%25EB%25A6%25AC%25ED%258C%25A9%25ED%2586%25A0%25EB%25A7%2581&_service=5&_no=1)