[리팩터링 2판] CHAPTER 02. 리팩터링 원칙 (1)

2.1 리팩터링 정의

  • 리팩터링: [명사] 소프트웨어의 겉보기 동작은 그대로 유지한 채, 코드를 이해하고 수정하기 쉽도록 내부 구조를 변경하는 기법
  • 리팩터링(하다): [동사] 소프트웨어의 겉보기 동작은 그대로 유지한 채, 여러 가지 리팩터링 기법을 적용해서 소프트웨어를 재구성하다.
  • 누군가 “리팩터링하다가 코드가 깨져서 며칠이나 고생했다” 라고 한다면, 십중팔구 리팩터링한 것이 아니다.

2.2 두 개의 모자

  • 나는 소프트웨어를 개발할 때 목적이 ‘기능 추가’ 냐, 아니면 ‘리팩터링’ 이냐를 명확히 구분해 작업한다.
  1. 작성자는 리팩터링과 해당 기능 개발을 분리할 수 없다고 주장

2.3 리팩터링하는 이유

  • 리팩터링하면 소프트웨어 설계가 좋아진다: 규칙적인 리팩터링은 코드의 구조를 지탱해줄 것이다.
  • 리팩터링하면 소프트웨어를 이해하기 쉬워진다: 내 소스 코드를 컴퓨터만 사용하는게 아니다. 예컨대 몇 달이 지나 누군가 내 코드를 수정하고자 읽게 될 수 있다. 사실 프로그래밍에서는 사람이 가장 중요하지만 소홀하기 쉽다.
  • 리팩터링하면 버그를 쉽게 찾을 수 있다: 프로그램의 구조를 명확하게 다듬으면 그냥 ‘이럴 것이다’ 라고 가정하던 점들이 분명히 드러나는데, 버그를 지나치려야 지나칠 수 없을 정도까지 명확해진다.
  • 리팩터링하면 프로그래밍 속도를 높일 수 있다: 내부 설계가 잘 된 소프트웨어는 새로운 기능을 추가할 지점과 어떻게 고칠지를 쉽게 찾을 수 있다.

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

  • 준비를 위한 리팩터링 ‘기능을 쉽게 추가하게 만들기’: 리팩터링하기 가장 좋은 시점은 코드베이스에 기능을 새로 추가하기 직전이다. 구조를 살짝 바꾸면 다른 작업을 하기가 훨씬 쉬워질 만한 부분을 찾는다.
  • 이해를 위한 리팩터링 ‘코드를 이해하기 쉽게 만들기’: 코드를 분석할 때 리팩터링을 해보면, 그렇지 않았더라면 도달하지 못했을 더 깊은 수준까지 이해하게 된다.
  • 쓰레기 줍기 리팩터링: 코드를 파악하던 중에 일을 비효율적으로 처리하는 모습을 발견할 때가 있다.
  • 계획된 리팩터링과 수시로 하는 리팩터링: 개발에 들어가기 전에 리팩터링 일정을 따로 잡아두지 않고, 기능을 추가하거나 버그를 잡는 동안 리팩터링도 함께 한다. 프로그래밍 과정에 자연스럽게 녹인 것이다.
  • 오래걸리는 리팩터링: 주어진 문제를 작게 조금씩 해결해갈 수 있는 리팩터링 기법을 활용한다. 리팩터링이 코드를 깨트리지 않는다는 장점을 활용하는 것이다.
  • 코드 리뷰에 리팩터링 활용하기: 코드 작성자가 참석해야 맥락을 설명해줄 수 있고 작성자도 리뷰어의 변경 의도를 제대로 이해할 수 있으므로, 이왕이면 참석자가 참석하는 방식이 좋다.

2.5 리팩터링 시 고려할 문제

  • 리팩터링의 궁극적인 목적은 개발 속도를 높여서, 더 적은 노력으로 더 많은 가치를 창출하는 것이다.
  • 오로지 경제적인 이유로 하는 것이다. 리팩터링은 개발 기간을 단축하고자 하는 것이다.
  • 자가 테스트 코드는 리팩터링을 할 수 있게 해줄 뿐만 아니라, 새 기능 추가도 훨씬 안전하게 진행할 수 있도록 도와준다.
  • 레거시 시스템을 파악할 때 리팩터링이 굉장히 도움된다. … 대규모 레거시 시스템을 테스트 코드 없이 명료하게 리팩터링하기는 어렵다. 이 문제의 정답은 당연히 테스트 보강이다.

--

--

programming x writing

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store