리팩토링

S-rim·2020년 12월 4일
0

리팩토링이란?

리팩토링이란 유지보수 생산성 향상 위해 기능을 변경하지 않고 소스코드를 수정, 보완하는 소프트웨어 품질향상 기법이다. 쉽게 말하면 코드를 다 작성하고 끝낸 상태에서 내부 구조를 개선하는 작업이다.

리팩토링은 성능 최적화라기보단 가독성과 유지보수를 목표로 하는것에 가깝다. 이 글을 읽는 여러분도 많이 들어봤을 것 같다. 예를들어 프로젝트 끝내고 더 리팩토링하고 유지보수하자 뭐 이런말을 한번쯤은 해봤을 거라 예상한다. 나도 그렇다. 이 리팩토링을 하는 목적은 크게 4가지가 있다.

리팩토링의 목적

리팩토링의 목적은 유지보수성 향상, 유연한 시스템, 생산성 향상, 소프트웨어 품질 향상이 있다.

리팩토링의 원인

그럼 왜 리팩토링을 하게될까? 이런 리팩토링의 원인은 바로 일명 베드 스멜이다. 더러운 냄새가 날 것 같은 코드라고 직관적으로 받아들여도 된다.

베드 스멜은 중복된 코드가 있을 때, 메소드가 지나치게 길 때, 클래스 하나가 너무 많은 일을 하려할 때, 클래스가 충분히 역할을 하지 않을때, 필요하지 않는 것을 처리하기 위해 작성된 코드가 있을 때, 클래스들이 지나치게 친밀할 때, 클래스의 상속 구조가 잘못되었을 때, 주석이 잔뜩 붙어있을 때, 한 클래스에 너무 많은 인스턴스 변수를 가질때 등 정말 다양한 문제들이 있다.

리팩토링의 절차

이런 베드스멜이 원인인 리팩토링의 절차를 살펴보자. 간단하다. 코드가, 베드스멜이 난다. 그럼 리팩토링을 하고, 심플코드가 된다. 그리고 그 코드를 테스트한다. 이게 리팩토링의 과정이다.

리팩토링하면 뭐가 좋은가?

그럼 리팩토링을 뭐가 좋아서 할까? 먼저 첫번째로는 소프트웨어 설계에서 질 향상을 위해 리팩토링을 한다. 그리고, 소프트웨어 이해도를 높이고 가독성을 높이기 위해 한다. 그러면 나중에 버그를 찾는데에도 도움이 되기 때문이다. 그리고 리팩토링을 하면 프로그램 개발 속도가 향상된다. 좋은 설계가 기반이 되어있다면 개발 속도를 단축할 가능성이 높아진다. 이런 점들을 위해 리팩토링을 한다.

그럼 어떻게 리팩토링할까? 소프트웨어 리팩토링의 주요 기법은 다양하다.

리팩토링 기법

첫번째는 메소드 추출이다. 그룹으로 묶을 수 있는 메서드를 추출해 묶는다. 기대효과로 결합도가 감소된다.

두번째는 클래스 추출이다. 두개의 클래스 업무를 새로운 클래스로 이동시켜 새 클래스로 만드는 것이다. 응집도가 증가하고 결합도가 감소한다.

다음은 메소드 이름변경이다. 메서드의 이름이 무엇을 하는 메서드인지 목적을 드러내도록 이름을 변경한다. 가독성이 향상되고 유지보수에 도움이 된다.

또, 풀 업 메소드. 이것은 동일한 기능을 하는 메소드들을 가장 큰 슈퍼 클래스로 이동시켜 중복을 제거하는 것이다.

그리고 방금은 메소드였다면 클래스를 슈퍼클래스로 이동시키는 풀업 필드도 있다. 이렇게 아주 다양한 리팩토링 기법들이 있다.

실질적으로 리팩토링할 때 고려해야할 부분들


실질적으로 리팩토링할 때 고려해야할 부분들에 대해 알아보자. 가독성이 높은 코드를 짜야한다. 분명 하나하나의 역할이 있을 것이다. 그만큼 명확한 가독성이여야 코드의 이해가 쉬워진다.

두번째로 결합도를 없애야한다. 여기서 말하는 결합도란 하나의 모듈의 어떤 부분을 바꿀 때 다른 모듈도 함께 바꾸어야 하는 것이다. 프로그래머들은 단순하고 명확한 모듈을 선호한다. 하나의 모듈의 일은 하나의 모듈 안에서 끝날 수 있도록 코드를 짜야한다.

마지막으로 하나의 메소드는 하나의 역할만 하게 해야한다. 메소드가 너무 복잡하고 여러개의 기능을 다 짬뽕하여 가지게 된다면 활용성이 떨어지고 이해하기 어려운 코드가 된다. 이 경우 메소드를 쪼개고, 하나의 인풋, 하나의 아웃풋을 가지도록 변경하고 그 메소드들을 쓸 때 조립하여 사용하는 것으로 코드를 다시 정의하는 것이 좋다. 이 세가지만 지켜도 충분히 괜찮은 코드가 될 수 있다고 한다.

성공적인 리팩토링이란


그럼 성공적인 리팩토링이란 뭘까? 여러 조건을 만족해야한다. 일단 첫번째로 소규모로 변경해야한다. 그리고, 회귀테스트에 성공해야한다. 회귀테스트란 기존 오류를 제거하고 수정에 따른 새로운 오류 발생여부를 확인하기 위해 수행하는 반복 테스트 기법이다.

또, 하나라도 미작동한다면 실패이다. 무엇보다도 리팩토링의 가장 중요한 사항은 기존 서비스에 영향 없이, 안정성을 가지고 수행이 되어야하는 것이기 때문이다.

클린코드와 리팩토링의 차이

그럼 클린코드와 리팩토링의 차이는 무엇일까? 리팩토링이 더 넓은 의미를 가진다.

클린 코드는 단순히 가독성을 높이기 위한 작업으로 이루어져있지만, 리팩토링은 클린코드를 기반으로한 유지보수를 위한 코드 개선이 이루어진다.

리팩토링은 결과물이 다 나온 후에 수정하고 추가 작업을 할 때 개선해 나가는 것이 올바른 리팩토링 방향이다.

profile
🤗

0개의 댓글