본문 바로가기
Refactoring

리팩토링 - 리팩토링 개론

by jayden-lee 2019. 5. 4.
728x90

리팩토링은 무엇인가

'리팩토링' 용어는 문맥에 따라 두 가지 의미로 정의된다.

 

  1. 겉으로 드러난 기능은 그대로 두고, 알아보기 쉽고 수정하기 간편하게 소프트웨어 내부를 수정하는 작업
  2. 리팩토링 기법을 연달아 적용해서 겉으로 드러나는 기능은 그대로 둔 채 소프트웨어 구조를 변경한다.

리팩토링의 목적은 소프트웨어를 더 이해하기 쉽고 수정하기 쉽게 만드는 것이다. 그리고 리팩토링은 겉으로 드러나는 소프트웨어 기능에 영향을 주지 않는다.

리팩토링은 왜 해야 하나

리팩토링은 소프트웨어 문제를 해결하는 만병통치약은 아니지만, 리팩토링의 가치는 코드를 쉽게 이해할 수 있게 도와주는 도구이다. 리팩토링은 다양한 용도로 사용이 가능하다.

소프트웨어 설계 개선되니까

가끔 단기적인 목적으로 코드를 추가할 때가 있다. 이러한 방식으로 코드를 추가하다 보면, 코드가 뒤죽박죽이 되어서 코드를 보고 이해하기 어려워진다. 이렇게 산만해진 코드를 정리하는 작업이 리팩토링이다. 리팩토링 작업을 할 때, 중복 코드를 제거하게 된다. 중복 코드가 제거 되면, 소프트웨어 설계와 유지보수를 하는데 있어서 분명 도움이 된다. 동일한 기능을 하는 코드가 여기저기 있다 보면, 기능의 일부분을 수정하더라도 모든 중복 코드에 손을 대야 한다. 중복 코드를 제거하면 한 군데에서만 수정하고 불필요한 리소스를 줄일 수 있다.

소프트웨어를 이해하기가 더 쉬워지니까

소프트웨어 개발 프로젝트는 대부분 동료 팀원과 함께 진행하게 된다. 따라서 특정 코드를 작성할 때, 동료 개발자를 고려해야 한다. 리팩토링을 하면 코드를 더 파악하기 쉬워진다. 기능은 정상 동작하지만 구조가 완전하지 못한 코드에 대해 실시한다. 불필요한 부분을 제거하다 보면, 본연의 목적을 충실해지는 코드가 완성된다.

버그를 찾기가 쉬워지니까

리팩토링 작업을 하면 전체 코드를 살펴보게 되고, 코드를 파악하기 쉽게 변경하다 보면 버그 발견도 쉬워진다.

프로그래밍 속도가 빨라지니까

깔끔한 설계는 소프트웨어 개발 속도를 높이기 위한 핵심이다. 설계가 깔끔하지 않으면 시간이 지날수록 개발 속도는 더디게 된다. 반면에 깔끔한 설계는 소프트웨어 개발 속도를 적절히 유지시키는데 반드시 필요하다. 리팩토링을 하면 설계가 깔끔해지며 새로운 기능을 추가하는 작업을 빨리 진행할 수 있다.

리팩토링은 어떨 때 필요한가

리팩토링은 일부로 시간내서 하는 작업이 아니다. 일상적으로 틈틈이 진행 해야 한다. 다른 작업을 해야 하는데 리팩토링을 하면 그 작업이 쉬워지기 때문에 하는 것이다.

같은 작업의 삼진 아웃 때

어떤 작업을 할 땐 첫 번째에는 그냥한다. 두 번째는 중복 작업이라 망설여져도 일단 그냥 한다. 세 번째에 동일한 작업을 하게 되면 그 때 리팩토링을 해야 할 때다.

기능을 추가할 때

리팩토링이 절실히 필요한 첫 번째 상황은 소프트웨어에 새로운 기능을 추가할 때다. 새로운 기능을 추가하려면 기존 코드를 분석해야 한다. 기존 코드는 나 혹은 동료가 작성했을 것이다. 코드의 기능을 파악하고 리팩토링이 필요한지 고민하고 리팩토링 작업을 진행한다.

 

리팩토링이 필요한 두 번째 상황은 설계가 지저분해서 어떤 기능을 추가하기 힘들 때다. 특정 기능을 추가하려고 보니 기존에 설계된 구조에서는 어렵다고 판단되면 리팩토링을 진행한다. 과거에는 이 기능이 들어온다고 생각하지 못했을 수 있다. 과거에 연연하지 않고, 리팩토링을 실시해서 설계를 수정한다.

버그를 수정할 때

버그를 수정할 땐 주로 코드를 이해하기 쉽게 만들려고 리팩토링한다. 버그가 발생한 기능에 해당하는 코드를 쉽게 파악하기 위해서 리팩토링을 작업을 하게 된다. 그러다보면 버그가 발생한 지점을 찾기가 수월해진다.

코드를 검수할 때

일부 기업에서는 일정 기간마다 코드를 검수한다. 코드 검수는 개발 팀원 모두가 전체 코드를 파악하게 되고, 선배 개발자가 후배 개발자에게 지식을 전수하는 효과도 얻게 된다. 리팩토링을 하면 다른 사람이 개발한 코드를 검수하는게 수월해진다. 의견만 제시하는 것이 아닌 아이디어가 실제 구현하면 도움이 될지 고민하고 가능하다고 판단되면 리팩토링을 실시 할 수 있다. 한 차원 높은 아이디어를 떠올릴 수 있다.

팀장에게 어떻게 말을 꺼내나

프로그래머는 품질에 대한 압박을 받지만 일정에 대한 압박만 못하다. 리팩토링 일정이나 이야기는 팀장에게 따로 이야기하지 않고, 그냥 실시하는 것이 좋다. 소프트웨어 개발자는 효과적인 소프트웨어를 신속하게 제작하는 것이 주 임무다. 리팩토링은 소프트웨어 개발 속도를 높이는 데 큰 도움이 된다. 리팩토링 작업이 왜 필요한지 앞에서 이미 알아봤다. 이번에는 간단하게만 알아보자.

  • 리팩토링을 통해 설계를 수정하면, 새로운 기능을 추가하는 작업이 수월해진다.
  • 버그가 발생한 경우에 리팩토링을 하면 기존 코드가 동작하는 원리를 이해하는데 도움이 된다.

리팩토링 작업은 별도의 작업으로 보면 안된다. 기능을 추가하거나 버그를 수정할 때, 같이 동시에 이루어지는 작업이라고 생각하면 좋을 것 같다.

리팩토링 관련 문제들

리팩토링을 장점을 얻으려면 리팩토링 작업을 하는 것도 중요하지만 과정을 모니터링 하는 것도 중요하다.

데이터베이스

리팩토링에서 문제되는 부분 중 하나는 데이터베이스이다. 수많은 비즈니스 애플리케이션은 데이터베이스 스키마와 강력하게 결합되어 있다. 이러한 점 때문에 데이터베이스 수정이 어려워진다. 또한, 데이터 이전 문제가 발생할 수 있다. 데이터베이스와 객체 모델의 상호 모델의 상호 의존을 최소화하려고 해도, 데이터베이스 스키마를 수정하면 데이터를 이전해야 하는데 이 작업은 시간이 오래거릴 뿐만 아니라 위험성이 높다.

인터페이스 변경

인터페이스를 건드리지 않고 내부의 구현 코드를 수정할 수 있는 것이 객체의 장점 중 하나이다. 하지만, 인터페이스를 수정하면 어떤 문제가 발생할지 예측이 불가능하다. 리팩토링에서 불안한 점은 상당수의 리팩토링이 인터페이스를 건드린다는 것이다.

리팩토링을 어렵게 하는 설계를 수정하는 일

설계 자체에 오류가 있거나 설계에 대한 결정이 나중에 바뀌었을 때 혹은 수정이 힘든 사항에도 대부분 리팩토링으로 해결된다.

리팩토링하면 안 되는 상황

코드를 처음부터 새로 작성해야 하는 상황일 때는 리팩토링을 하지 말아야 한다. 기존 코드가 복잡한 경우에 리팩토링을 할 수 있지만, 차라리 새로 코드를 작성하는 것이 쉬울 수 있다. 일정이 임박한 경우에는 리팩토링을 하지 않는 것이 좋다. 일정이 없는 상황에서 리팩토링을 진행하면, 예상한 일정보다 늦게 결과물이 나올 수 있다. 일정이 임박한 경우가 아니라면 리팩토링을 반드시 해야 한다.

리팩토링과 설계

리팩토링은 설계를 보완하는 특수한 역할을 한다. 설계를 완벽하게 하고 코드를 작성하더라도 반드시 빈틈이 존재한다. 그러한 빈틈은 틈틈이 리팩토링을 하면서 채워나가야 한다. 그리고 사전 설계 작업을 리팩토링으로 대체할 수 있다. 먼저, 기능이 동작하도록 코드를 작성한다. 그 다음에 리팩토링 작업을 통해 세밀하게 코드를 수정해 나간다.

 

리팩토링이 없다면 사전 설계가 더욱더 중요해지고 부담감이 커진다. 나중에 설계를 수정하려면 비용이 크기 때문에 완벽한 사전 설계를 만들려고 더 많은 시간과 비용을 쏟는다.

 

하지만, 리팩토링 작업을 하게 되면 중점적인 작업이 달라진다. 사전 설계는 완벽한 설계를 찾는 것이 아닌 적당한 솔루션만 찾으면 된다. 리팩토링을 진행하면서 최상의 솔루션에 가깝도록 변화시킨다.

작업 중점이 이동하면서 얻게 되는 장점은 설계가 단순해진다는 것이다.

리팩토링과 성능

리팩토링으로 인해 프로그램의 성능이 어떤 영향이 받는지 가장 관심이 많다. 소프트웨어를 이해하기 쉽게 만들기 위해서 여러 코드를 수정했는데, 프로그램이 오히려 느려진다면 이건 큰 문제이다.

 

소프트웨어 성능을 올리려면 소프트웨어가 튜닝이 가능하게끔 먼저 만들고, 나중에 충분한 속도가 나오도록 튜닝해야 한다.

빠른 소프트웨어를 작성할 수 있는 일반적인 세 가지 방법

  1. 철저한 실시간 시스템에 주로 사용되는 시간 분배
  2. 성능에 꾸준한 관심을 갖기
  3. 90% 비율의 장점만 활용

리팩토링의 유래

리팩토링은 코드를 깔끔하게 만드는 것 이상의 순기능을 한다. 소프트웨어 개발 과정의 핵심 요소 중 하나이다. 리팩토링 유래와 관련된 자세한 내용은 책을 참고해주세요.

 

'Refactoring' 카테고리의 다른 글

리팩토링 - 객체 간의 기능 이동  (0) 2019.06.06
리팩토링 - 메서드 정리  (0) 2019.05.16
리팩토링 - 코드의 구린내  (0) 2019.04.28

댓글