팩토링은 무엇인가
  • (명사) 겉으로 드러나는 기능은 그대로 둔 채, 알아보기 쉽고 수정하기 간편하게 소프트웨어 내부를 수정하는 방법
  • (동사) 리팩토링 기법을 연달아 적용해서 겉으로 드러나는 기능은 그대로 둔 채 소프트웨어 구조를 변경한다.

  • 강조할 내용
    1. 리팩토링의 목적은 소프트웨어를 더 이해하기 쉽고 수정하기 쉽게 만드는 것이다.
    2. 리팩토링은 겉으로 드러나는 소프트웨어 기능에 영향을 주지 않는다.
리팩토링은 왜 해야 하나
  • 소프트웨어 설계가 개선되기 되니까
  • 소프트웨어를 이해하기가 더 쉬워지기 되니까
  • 버그를 찾기가 쉬워지니까
  • 프로그래밍 속도가 빨라지니까
리팩토링은 어떨 때 필요한가
  • 같은 작업의 삼진아웃 때
  • 비슷한 작업을 할 때 두번까진 그냥하고 세번째 하게 되면 리팩토링을 실시하는 것이다.
  • 기능을 추가할 때
  • 버그를 수정할 때
  • 코드를 검수할 때
리팩토링의 효용성 (_켄트 벡)
  • 프로그램은 다음 4가지 상황일 때 수정하기 힘들어진다
  • 코드를 알아보기 힘들 때
  • 중복된 로직이 들어 있을 때
  • 추가 기능을 넣어야 해서 실행 중인 코드를 변경해야 할 때
  • 조건문 구조가 복잡할 때

  • 그러므로 프로그램은 코드를 알아보기 쉽고, 모든 로직이 한 곳에 있으며, 기존 기능을 건드릴 필요 없이 조건문 구조가 최대한 간결하게 끔 작성해야 한다.

  • 리팩토링은 실행 중인 프로그램의 기능을 바꾸는 작업이 아니고 신속한 개발 공정을 가능하게 하는 이런 성질을 가중하면서 가치를 높이는 일이다.
리팩토링 관련 문제들
  • 데이터베이스
  • 데이터베이스 스키마를 수정하면 데이터도 이전해야 하는데, 이것은 시간도 오래 걸릴 뿐 아니라 위험성도 높다. 이 문제를 해결하기 위해 객체 모델과 데이터베이스 모델 사이에 별도의 소프트웨어 계층을 두는 방법이 있다. 이렇게 하면 두 모델에 생긴 변경 사항을 따로 유지할 수 있어서 한 모델을 수정할 때 다른 모델은 수정할 필요 없이 그저 중개 계층만 수정하면 된다.

  • 인터페이스변경
  • 객체의 중대한 장점중 하나는 인터페이스를 건드리지 않고 내부의 구현 코드를 수정할 수 있다는 점이다. 리팩토링에서 불안한 점은 상당수의 리팩토링이 인터페이스를 건드린다는 것이다.

  • 그렇다면 배포 인터페이스를 수정하는 리팩토링 기법들을 실시할 때는 어떻게 해야 할까?

  • 간단히 말하면 어떤 리팩토링 기법이 배포 인터페이스를 건드릴 경우 개발자는 적어도 그 인터페이스를 사용하는 부분이 그 인터페이스 변경에 맞춰 수정되기 전까지는 기존 인터페이스와 새 인터페이스를 모두 그대로 유지시켜야 한다. 그리고 deprecation 같은 타입을 작성해서 호출자에게 그 코드를 사용하지 말아야 함을 알려야 한다.

  • 리팩토링하면 안되는 상황
  • 처음부터 새로 작성하는게 리팩토링보다 더 쉬울 경우
  • 코드가 돌아가지 않는 경우
  • 납기가 임박했을 때
리팩토링과 성능
  • 많은 이들이 리팩토링으로 인해 프로그램 성능이 어떤 영향을 받는지에 관심이 많다. 소프트웨어를 이해하기 쉽게 만들려면 수정할 일이 많은데 그런 수정으로 프로그램이 느려질 수도 있다. 이건 아주 큰 문제다. 리팩토링을 실시하면 분명 소프트웨어는 더 느려지지만, 소프트웨어 성능을 더 간단히 조절할 수 있다. 소프트웨어 성능을 올리려면 먼저 소프트웨어를 튜닝가능하게 만들어 놓고 나중에 충분한 속도가 나오게 튜닝하는 것이다. 이것은 철저한 실시간 환경을 제외한 모든 환경에 적용된다.