리팩토링
2019.09.02
Chapter 2. 리팩토링 개론
리팩토링은 무엇인가
-
명) 겉으로 드러나는 기능은 그대로 둔 채, 알아보기 쉽고 수정하기 간편하게 소프트웨어 내부를 수정하는 작업
- 동) 리팩토링 기법을 연달아 적용해서 겉으로 드러나는 기능은 그대로 둔 채 소프트웨어 구조를 변경한다.
리팩토링은 왜 해야 하나
-
소프트웨어 설계 개선
-
소프트웨어를 이해하기 더 쉬워짐
-
버그 발견이 쉬워짐
-
프로그래밍 속도가 빨라짐
리팩토링은 어떨 때 필요한가
-
같은 작업의 삼진 아웃 때
-
기능을 추가할 때
-
버그를 수정할 때
-
코드를 검수할 때
프로그램 수정이 어려울 때
-
코드를 알아보기 힘들 때
-
중복된 로직이 들어 있을 때
-
추가 기능을 넣어야 해서 실행 중인 코드를 변경해야 할 때
- 조건문 구조가 복잡할 때
인다이렉션
-
로직을 공유 : 두 위치에서 호출되는 하위 메서드나 모든 하위클래스가 공유하는 상위클래스의 메서드 등이 있다. 이런 식으로 하나의 로직을 여러 곳에서 공유할 수 있다.
- 의도와 구현부를 따로 나타냄 : 클래스명과 메서드명을 정해서 의도한 바를 드러낼 수 있고, 클래스나 메서드의 내부 코드를 통해 그 의도를 어떻게 구현했는지 보여줄 수 있다. 내보 코드를 다시 더 잘게 쪼개어 의도적인 측면에서 작성했다면 그 코드의 구조에 대한 대부분의 주요 정보를 잘 드러내는 코드를 작성할 수 있다.
인다이렉션
-
수정을 분리 : 한 객체를 두 위치에 사용했는데 두 경우 중 한 상황에 대해 동작을 수정해야 할 때 그 객체를 수정하면 두 상황이 모두 변경될 위험이 있다. 따라서 우선 하위클래스를 만들고 변하는 경우에 참조하게 만들자. 그러면 다른 경우로 예기치 못하게 변할 위험을 감수하지 않고 클래스를 수정할 수 있다.
- 조건문을 코드화 : 객체에는 재정의 메시지라는 우수한 메커니즘이 존재해서 조건문을 유연하면서도 분명하게 표현할 수 있다. 조건문을 메시지로 바꾸면 중복 코드가 줄어들어 명료해지며 동시에 유연성도 높아진다.
리팩토링 관련 문제들
데이터베이스
비즈니스 애플리케이션이 데이터베이스 스키마와 강력히 결합되어 데이터베이스 수정이 어려워진다
데이터베이스 스키마 수정에 따른 데이터 이전은 오래걸리고 위험성도 높음
인터페이스 변경
인터페이스를 건드리지 않고 내부의 구현 코드를 수정할 수 있다
리팩토링 관련 문제들
리팩토링을 어렵게 하는 설계를 수정하는 일
설계가 바뀌어도 리팩토링으로 해결 가능
리팩토링하면 안 되는 상황
코드를 새로 작성해야 할 때
코드가 돌아가지 않을 때
납기가 임박했을 때
리팩토링과 설계
설계를 하면 생각이 아주 빨라지지만 그 생각엔 빈틈이 많다
- 앨리스테어 칵번
사전 설계에 적당한 솔루션 생각 후 리팩토링
리팩토링과 성능
빠른 소프트웨어를 작성할 수 있는 방법
- 실시간 시스템에 주로 사용되는 시간 분배, 설계를 분해하면서 각 구성 요소에 시간이나 메모리 사용량 같은 자원별 예산을 할당
- 성능에 꾸준한 관심, 성능을 높게 유지하기 위해 수단과 방법을 가리지 않음. 직관적이나 효과는 없음
- 개발 절차 중 후기 단계에 있는 성능 최적화 전까지는 성능에 신경쓰지 않고 프로그램을 잘 쪼개진 방식으로 제작
리팩토링과 성능
프로그램을 잘 쪼개면 두 가지 측면에서 최적화에 도움이 된다
- 성능 튜닝에 할애할 시간이 생기고, 기능 추가도 더 신속히 이뤄진다.
따라서 더 많은 시간을 성능에만 집중할 수 있다.
- 성능을 분석할 떄 더 정밀한 분석이 가능해진다. 프로파일러가 더 작은 코드 부분을 찾아주기 때문에 튜닝이 더 쉬워진다.
리팩토링과 성능
리팩토링이 소프트웨어 개발 기간을 단축하는 데 도움
리팩토링하는 동안에는 단기적으로 소프트웨어가 느려지지만, 최적화를 거치면서 튜닝하기가 훨씬 쉬워져서 결과적으로는 소프트웨어 개발이 더 빨라진다.
리팩토링 2019.09.02 Chapter 2. 리팩토링 개론
리팩토링
By Sungbin, Song
리팩토링
- 109