본문 바로가기
  • A space that records me :)
공부/정보처리기사

리팩토링이란?

by yjkim_97 2021. 4. 10.

리팩토링이란?

  • 외부 동작을 바꾸지 않고 내부 구조를 개선하는 방법
  • 소프트웨어를 쉽게 이해할 수 있고, 보다 효율적으로 동작하도록 소스코드 구조를 변경하는 것이다.
  • 소프트웨어가 제공하는 서비스에 대한 기능 및 동작을 변경해서는 안된다.
  • 처음부터 미리 계획해서 작업하는 것보다는 지속적으로 좋은 디자인을 찾아 진행한다.

리팩토링 목적

  • 소스코드를 보다 더 쉽게 이해하기 위해서
  • 보다 더 쉬운 유지보수를 위해서 (쉬운 이해로 인해 수정하기 쉽도록)

Why 리팩토링?

  • 소스코드를 의 이해도를 높이기 위해서
  • 중복되거나 불필요한 로직을 제거함으로써 각 작업별로 코드가 깔끔하게 구현된 상태로 만들기 위해서
  • 에러 및 버그의 원인을 쉽게 찾기 위해서
  • 소스코드의 디자인을 유지하기 위해서
  • 지속된 개발로 인해 망가지는 코드의 구조를 되돌리기 위해서
  • 메소드의 재사용성을 높이기 위해서

When 리팩토링?

  • 불필요하고 중복된 소스코드가 많아 이해도가 떨어질 때
  • 코드 리뷰 및 검토를 할 때
  • 소스코드를 이해하기 어려워 에러 및 버그의 원인을 쉽게 찾지 못할 때
  • 새로운 기능을 추가 구현할 때
  • 제공하는 서비스가 기능이 떨어질 때 (ex. 속도 저하)

리팩토링 방법

  • 중복코드
    • 중복된 코드를 제거하고 하나의 메소드로 만든다
    • 중복된 코드 외에 동일한 기능이 여기저기 다른 로직으로 구현되어 있다면, 마찬가지로 하나의 메소드로 만든다.
  • 메소드
    • 각 메소드가 제공하는 기능은 하나씩 명확하게 정의해서 구현한다.
    • 메소드의 길이는 가능한 짧게한다. 여러 기능이 포함되어 있는 메소드를 분리한다면 자연스럽게 각각의 메소드의 길이는 짧아진다.
    • 메소드의 이름은 역할, 기능을 잘 나타내도록 정의한다.
    • 메소드가 제공하는 기능에 알맞은 명확한 값을 return 하도록 한다. (ex. 볼펜에 잉크가 남았는지 확인하는 메소드인 경우, 남아있으면 true 그렇지 않으면 false로 리턴하도록 한다. 만일 남아있으면 볼펜의 이름을 리턴한다면 매우 별로인 메소드.. )
    • 메소드의 인자 개수를 줄인다. 부득이하게 인자 개수가 많아진다면 객체로 넘기도록 한다. (인자가 많을 경우 일관성이 사라져 사용이 불편해지고, 기능을 변경/추가할 때마다 계속 수정해야 한다.)
  • 주석
    • 기능에 대한 설명을 주석으로 달면 유지보수와 이해가 쉬워진다.
    • 불필요한 주석은 모두 제거한다.
  • 객체/클래스
    • 하나의 클래스다 다양한 원인으로 자주 수정된다면, 여러 개의 변형 객체로 분리하는 것이 좋다.
    • 클래스 내에서 자주 수정되는 부분을 별도의 객체로 분리하여, 그 객체만 수정하도록 한다.
    • 클래스에 성격에 맞지 않는 인스턴스는 분리한다.
    • 여러 클래스가 존재하고, 공통된 기능이 존재한다면 부모로 상속하거나 별도로 분리한다
    • 특정 상황에서만 할당된 변수들을 사용하는 다른 클래스를 생성한다.
  • 메시지 체인
    • 클라이언트가 한 객체에서 제2의 객체를 요청하면, 제 2의 객체가 또 다른 객체에게 요청하는 등등 연쇄적으로 요청이 발생하는 문제점을 제거한다.

주의사항

  • 리팩토링 할 때는 기능을 추가해서는 안된다.
  • 리팩토링 전과 후 제공되는 서비스의 기능 및 동작은 모두 동일해야 한다.
  • 오로지 소스코드의 구조의 변경만 신경 쓴다.
  • 현재 소프트웨어 서비스가 잘 작동하지 않아 코드 상의 문제가 있을 경우 리팩토링을 하면 안된다. 코드 재작성이 우선이다.
  • 리팩토링 할 때는 시간적 여유를 충분히 두고 작업해야 한다.
  • 리팩토링으로 인한 버그 및 에러가 발생해서는 안된다.

실제로 내가 리팩토링 한 이유

  1. 앱 속도가 느림
  2. 코드의 중복
  3. 다른 사람이 쉽게 코드를 이해할 수 없었음
  4. 함수/메소드가 기능별로 명확하게 정의되어 있지 않았음
  5. 유지보수가 힘들었음 (ex. 앱에서 병원 코드가 여기저기 하드코딩으로 박혀있어서 병원별로 코드 변경하기 힘들었음)
  6. 쓸데없는 변수를 너무 많이 선언해놨음.
  7. db에서 데이터 조회 시 index로 join 안 하고 select 해서 속도가 너무 느렸음.
  8. db에 insert문 날릴 때 for문으로 날리고 있었음

https://nesoy.github.io/articles/2018-05/Refactoring

 

Refactoring이란?

 

nesoy.github.io