[리팩터링 2판] #2 리팩터링 원칙

joy_five·2023년 3월 12일
0

2.1 리팩터링 정의

리팩터링

  • [명사]
    소프트웨어의 겉보기 동작은 유지한 채, 코드를 이해하고 수정하기 쉽도록 내부 구조를 변경하는 기법
  • [동사]
    소프트웨어의 겉보기 동작은 그대로 유지한 채, 여러가지 리팩터링 기법을 적용해서 소프트웨어를 재구성하다.

리팩터링 정의에서의 핵심은 '특정한 방식'에 따라 코드를 정리하는 것만을 의미하므로, 동작을 보존하는 작은 단계들을 거쳐 코드를 수정하면서 순차적으로 해당 단계를 따라가며 큰 변화를 만들어내되 리팩터링하는 동안에는 코드가 항상 정상 작동을 해야 한다는 것이다.

'겉보기 동작' 이라는 표현은 코드의 이전 동작과 동일한 동작이 문제없이 작동해야한다는 뜻이다. 이는 리팩터링 과정에서 버그를 발견하더라도 리팩터링 이후에도 해당 버그가 유지되도록, 리팩터링 이전과 이후의 동작이 동일하게 이어지는 것이 핵심이다.

2.2 두 개의 모자

소프트웨어 개발 시에는 '기능 추가'와 '리팩터링' 두 가지 목적을 명확히 구분하여 작업하는 것을 효율적인 접근방식으로 제시하고 있다.
켄트백이 두 목적을 두 개의 모자로 비유한 케이스를 예시로 들었는데, 기능 추가 시에는 기존 코드는 절대 건드리지 않고 새 기능을 추가하기만 하고, 리팩터링 시 에는 기능 추가를 삼가고 오로지 코드 재구성에만 전념한다.

일종의 작업모드를 설정하고, 업무의 작은 단위까지 명확한 목적과 목표를 설정함으로써 효율적인 작업관리가 가능한 마인드셋이다.

2.3 리팩터링 하는 이유

리팩터링하면 소프트웨어 설계가 좋아진다

아키텍처를 충분히 이해하지 못한 채 단기 목표를 위해 코드 작업을 하다보면 기반 구조가 무너지기 쉽상이다. 규칙적인 리팩터링을 통해 코드의 구조를 지탱하는 역할을 수행한다.

리팩터링하면 소프트웨어를 이해하기 쉬워진다

추후 코드를 유지보수 하기 위해 되돌아보았을 때 손쉽게 이해할 수 있도록 리팩터링을 해두면, 다른 작업자가 투입되었을때 뿐 아니라 나 자신이 되돌아보았을때도 수정하는데 투입되는 리소스를 최소화할 수 있다.

리팩터링하면 버그를 쉽게 찾을 수 있다

코드를 이해하기 쉽다는 말은 버그를 찾기 쉽다는 의미와 동일하다. 프로그램의 구조를 명확하게 다듬을 수록 '이럴 것이다'라고 가정하던 점들이 명확하게 드러나는데, 버그 또한 명확하게 인지할 수 있게 된다.

리팩터링하면 프로그래밍 속도를 높일 수 있다

새로운 기능을 추가할 수록 기존 코드베이스에 잘 녹여낼 방법을 찾는데 드는 시간이 늘어나게 된다. 하지만 리팩터링된 코드들로 이루어져있다면 구조화된 코드와 명확한 목적성이 드러나는 코드로 구성되어있으므로 새로운 기능을 추가하기 위한 효율적인 방법을 찾는데 드는 리소스도 최소화할 수 있게 된다.
이에 따라 최종적인 개발 리소스를 최적화할 수 있다.

내부 설계가 잘 된 소프트웨어는 새로운 기능을 추가할 지점과 어떻게 고칠지를 쉽게 찾을 수 있고, 모듈화가 잘 되어있으면 전체 코드베이스중 작은 일부만 이해하면 활용할 수 있으므로 코드가 명확할 수록 버그를 만들 가능성이 줄어들고, 버그가 생기더라도 디버깅하기 쉬워진다. 내부 품질이 뛰어난 코드베이스는 새 기능 구축을 돕는 견고한 토대가 된다. 이 효과를 설계 지구력 가설이라고 부른다. 내부 설계에 심혈을 기울이면, 소프트웨어의 지구력이 높아져서 빠르게 개발할 수 있는 상태를 더 오래 지속할 수 있다.

2.4 언제 리팩터링해야 할까?

준비를 위한 리팩터링: 기능을 쉽게 추가하게 만들기

요구사항을 거의 만족하지만, 리터럴 값 몇개가 방해되는 함수의 경우 함수를 그대로 복제하여 값만 수정할 수도 있지만, 나중에 이 함수를 수정해야하는 경우 원래 코드와 복제한 코드를 중복으로 수정해야 하는 상황이 발생한다.
이럴 때는 함수 매개변수화하기 리팩터링을 적용하고, 함수에 필요한 매개변수를 지정해서 호출하기만 하면 된다.

이해를 위한 리팩터링: 코드를 이해하기 쉽게 만들기

워드 커닝햄 - 리팩터링하면 머리로 이해한 것을 코드에 옮겨 담을 수 있다.
어떤 역할을 하는지 이해된 변수는 적절한 이름으로 바꿔주고, 긴 함수를 잘게 나누기도 한다.

쓰레기 줍기 리팩터링

코드를 파악하던 중 비효율 적인 코드를 발견할 때가 있다. 로직이 쓸데없이 복잡하거나, 매개변수화한 함수 하나면 될 일을 거의 똑같은 함수 여러 개로 작성해뒀을 경우 간단히 수정할 수 있는 것은 즉시 고치고, 시간이 좀 걸리는 일은 짧은 주석을 추가해두고 하던 일을 끝내고 처리한다. 이 과정이 이해를 위한 리팩터링의 변형인 쓰레기 줍기 리팩터링이다.

코드 리뷰에 리팩터링 활용하기

코드 리뷰를 하면서 리팩터링하여 쉽게 구현해넣을 수 있는지 살펴보고, 쉽다면 실제로 리팩터링한다.
일반적인 풀리퀘스트에서는 그리 효과적이지 않고, 작성자가 참석한 상태에서 진행하는 코드리뷰에서 적용하는 것이 효과적이다. 작성자와 나란히 앉아서 코드를 훑어가며 리팩토링하는 페어프로그래밍 시에 도입하는 것을 추천한다.

관리자에게는 뭐라고 말해야 할까?

  1. 관리자가 기술에 정통하고 설계 지구력 가설을 잘 이해하고 있는 경우
    리팩터링 작업에 대해 관리자가 먼저 권유할 수도 있고, 리팩터링이 필요하다고 말했을 때 관리자가 쉽게 이해할 수 있다.
  2. 기술을 모르는 관리자에게 보고하는 경우
    리팩터링 한다고 말하지 말라! 소프트웨어 개발자는 프로다. 프로의 역할은 효과적인 소프트웨어를 빠르게 만드는 것으로, 저자의 경험상 리팩터링은 소프트웨어 개발 속도 향상에 효과적이었으므로 리팩터링 후 기능 추가 작업을 하는 방식을 도입하되, 구체적인 실행방안에 대해 세세하게 설명하지 않아도 된다.

리팩터링 하지 말아야 할 때

  • 굳이 수정할 필요가 없을때는 지저분한 코드를 발견하더라도 수정하지 않는다.
  • 리팩터링하는 것보다 처음부터 새로 작성하는게 쉬울 때도 리팩터링 하지 않는다.

2.5 리팩터링 시 고려할 문제

새 기능 개발 속도 저하

리팩터링의 궁극적인 목적은 개발 속도를 높여서, 더 적은 노력으로 더 많은 가치를 창출하는 것이다.

코드 소유권

브랜치

테스팅

레거시 코드

데이터 베이스

2.6 리팩터링, 아키텍처, 애그니(YAGNI)

2.7 리팩터링과 소프트웨어 개발 프로세스

2.8 리팩터링과 성능

리팩터링은 수정하기 쉬운 코드, 이해하기 쉬운 코드로 변환하는 작업이다보니 리팩터링 이후 성능이 오히려 저하될 수 있다.
이 경우에도 저자는 리팩터링을 우선순위로 하되, 리팩터링 된 코드에서 성능개선을 위한 튜닝을 하는 방식을 채택한다고 전한다.

2.9 리팩터링의 유래

2.10 리팩터링 자동화

profile
😤 Started in Sep. 2022 😎 I'm going to further!

0개의 댓글