오늘은 소프트웨어 리팩터링에 대해 얘기해 볼까 합니다. 리팩터링은 기존의 소스 코드를 개선시키는 과정을 말합니다.
의식의 흐름에 따른 코드(생각나는 대로 작성한 코드 또는 스파게티 코드)는 나중에 다시 보면 상당히 읽기가 어렵습니다. 그런 소스코드를 재작성하여 일목요연하고 중복을 제거하는 과정을 리팩터링으로 보시면 됩니다.
리펙터링(Refactoring)의 정의
코드의 기능은 유지하면서 클래스, 함수, 필드처럼 여러 프로그래밍 요소를 변경하여 더 나은 코드로 개선하는 과정 또는 그러한 기술을 말합니다.
리펙터링의 목적
가장 핵심적인 목표는 소프트웨어를 더 이해하기 쉽고, 수정하기 쉽게 만드는 작업입니다.
리팩터링은 디자인 패턴(Design Pattern)을 기반으로 탄생했습니다.
디자인 패턴은 객체 간의 관계를 분석해 최적의 객체 관계를 유지하기 위해 객체 간의 관계를 정의하는 방법입니다. 뭐, 디자인 패턴이던 리팩터링이던 핵심은 중복의 제거입니다. 그리고 코드의 생산성을 올려주게 되어 있습니다.
소스의 중복은 소스의 복잡성을 올리는 아주 나쁜 습관입니다.
구조화되지 않은 코드(엉망진창인 코드)를
"Big ball of mud", "Spaghetti", "House of cards"
라고 부릅니다.
이런 코드들은 대체로 중복이 많고, 결합도가 높은 특징을 가지고 있어 개발자가 코드를 딱 보는 순가 모니터를 끄고 싶게 만듭니다.
이런 코드를 읽기 쉽고 결합도가 낮은 코드로 변경하는 일련의 작업입니다. 리팩터링의 핵신은 기능은 변경하지 않고 내부 소스를 변경하는 것입니다. 그리고 리팩터링을 진행하다 보면 인지하지 못하던 버그도 수정할 수 있습니다.
개발이 어렵다고 느껴지고 나중에 자신의 소스를 볼 때 가독성이 떨어진다면, 무조건 리팩터링을 진행해서 리팩터링의 개념을 습득하는 것이 중요합니다. 리팩터링이 어려운 것이 아닙니다. 소스를 작성한 후 어느 정도 소스 양을 넘기면 무조건 리뷰(Review)를 진행하여 개선시킬 수 있는 사항을 찾는 과정을 반복하는 것입니다.
리펙터링을 진행하면 코드의 가독성은 향상되고 구조적으로 안정적인 코드를 작성하게 되어 유사한 코드를 작성할 때 생산성을 올려줄 수 있습니다.
리펙터링 vs 클린코드
클린코드는 가독성이 높은 코드를 말합니다.
가독성이 높은 코드는 다음과 같은 특성을 가지고 있습니다.
- 네이밍이 잘 되어 있음
- 중복이 없음
- 응집도가 높은 상태
- 결합도가 낮은 상태
리펙토링은 클린코드를 포함하고 그 외에 객체 간의 관계까지 살펴보는 넓은 의미입니다.
클린 코드는 단순히 가독성을 올리는 작업입니다.
리펙터링의 주의 사항
한 번에 2개씩 수정하지 않는다.
수정하고자 하는 소스가 있으면 해당 기능을 테스트하여 이상 여부를 확인하고, 해당 기능의 소스만 수정한 후 다시 테스트를 실시해 기능의 이상 여부를 지속적으로 확인합니다.
한 번에 2개 이상의 소스를 수정하지 않습니다. 그래야 문제가 발생했을 때 바로 전 단계로 복구할 수 있습니다.
기존 코드를 대체하는 코드로 개선한다.
수정하고자 하는 소스를 고치는 것보다는 새로운 소스를 작성하여 기존의 기능을 대체하는 방법이 안전합니다.
기존 코드를 유지하고 새로운 코드로 테스트하여 최종적으로 기능의 이상 유무를 확인하고 새로운 코드로 적용하는 방법입니다. 또한, 새로운 코드가 정상적으로 작동하면 보통 기존 코드를 주석으로 남기는데 제 경험 상 기존 코드를 주석으로 남긴다고 한 들 새로운 코드가 아주 잘 작동한다면 기존 코드는 지워버리시는 것이 좋습니다.
나중에 절대 보지 않을 코드가 되고, 소스 중간에 지저분하게 주석 처리된 코드를 보면 가독성이 떨어지기 때문입니다.
'IT > 아키텍처' 카테고리의 다른 글
결합도(Coupling)과 응집도(Cohesion) (0) | 2022.07.13 |
---|---|
객체 설계의 원칙(SOLID) (0) | 2022.07.04 |
Bad smells in code(마틴 파울러의 코드의 악취) (0) | 2022.06.24 |
네이밍 룰 - 메소드 [2편, 단어] (0) | 2022.05.26 |
네이밍 룰 - 메서드 [1편, 기본편] (0) | 2022.05.26 |
댓글