티스토리 뷰

이번에 리뷰할 도서는 


리팩토링 : 코드 품질을 개선하는 객체지향 사고법


입니다.





들어가기에 앞서


 우리는 항상 추상적이고 복잡한 현실을 구조화된 무언가로 바꾸어 나가고 있습니다. 인간의 비전을 사명으로 구체화 시키고, 구체화된 사명은 연간 계획으로, 연간 계획은 월간 계획으로, 또 그 월간 계획은 주간 계획으로, 마지막으로 주간 계획은 일일 계획으로 나누고 있습니다. 그래야 측정이 가능하고, 군더더기가 있는 것들은 보완하고 다시 실행할 수 있는 여지가 생깁니다.

 그렇다면 고도로 추상화된 작업인 프로그래밍에서는 어떨까요? 부끄럽지만 저도 객체지향적인 언어를 절차지향적인 언어로 작성하여 처음의 설계에서는 벗어나지만 기능은 동작하는, 그렇기 때문에 확장을 하려면 점점 스파게티코드화 되어 엔트로피를 증가시키는 방향으로 작업을 하게 됩니다. 일정이나, 혹은 실력의 미달로 이런 저런 핑계를 대고 그저 그때만 넘기자 하는 마음이 가득한 때가 여러번입니다. 그런 제가 객체지향적 사고에 의한 리팩토링이라는 책을 읽게 되었을때 든 감정은, 부끄럽기 그지없는 것이었습니다. 저자들은 어떻게 하면 더 좋은 작업물을 만들까 고민하다 그 고민의 결과로 이런 책을 낸 것이죠. 책 자체가 그들의 열정이 만들어낸 결과물이었습니다. 아직 이해가 되는 부분이 많지는 않지만 수박 겉핧기 식의 리뷰나마 진행해보려고 합니다.


1. 구성

 이 책의 구성은 다음과 같습니다.

1) 맛보기예제

2) 리팩토링 개론

3) 코드의 구린내

4) 테스트 작성

5) 리팩토링 기법 카탈로그에 대해

6) 메서드 정리

7) 객체 간의 기능 이동

8) 데이터 체계화

9) 조건문 간결화

10) 메서드 호출 단순화

11) 일반화 처리

12) 복합 리팩토링

13) 리팩토링, 재사용, 현실성

14) 리팩토링 도구

15) 조각 맞추기


 리팩토링이라는 것을 설명함에 있어서 가장 좋은 방법은 실제 예제를 놓고 어떻게 리팩토링해 나가는지를 보여주는 것이 가장 좋은 방법이라고 생각합니다. 이 책의 경우 1장의 맛보기 예제에서 부터 시작해 각 단계의 기법들을 통해 간단한 예제들이 어떤 목적에 맞게끔 수정되어지고 있는지를 보여줍니다. 설명하는 언어는 JAVA 를 이용해 이야기를 전개하며, 버전이 1.1 대이긴 하지만, 기본적인 자바의 기법들을 이용해 객체지향설계가 어떤 형태를 지녀야 하는지 고민을 하게 합니다.


다만 좀 읽기 불편했던 점이 있었는데 위 목차를 내용별로 나누면 다음과 같습니다. 


1~4까지는 개론, 

5는 나머지 내용(카탈로그)들의 개요, 

6~12장은 리팩토링 기법들의 카달로그

13, 14, 15 장은 부록


 목차만 놓고 봐서는 하나하나가 개별적인 내용인 것 같지만, 각 챕터 내에서 주석화 되어있는 부분들, 예를들어

메서드 정리에 관련된 챕터의 설명 중 주석의 형태로 다른 챕터의 방법을 굉장히 많이 언급하고 있습니다. 따라서 단계별 진행이 되지 않기 때문에, 이 책에 나온 기법들에 익숙해지지 않는한 챕터를 진행하게 되면 다른 챕터를 매번 왔다갔다 하는 불편이 있었습니다. 그리고 리팩토링과 관련된 케이스를 CookBook 식으로 엮은 것도 아니기 때문에, 디자인 패턴책을 읽었을 때 만큼 깔끔한 느낌은 받지 못했습니다. 아마 그만큼 내공이 높지 않아서이기 때문일 겁니다.



2. 내용


 주로 카탈로그 부분에서 많은 내용을 할애하는데, 적어도 개별 내용들은 이해하는데 굉장히 도움이 되는 구성을 하고 있습니다.

동기 - 방법 - 예제의 형태로 진행을 하는데, 이런 방식은 각각의 기능을 학습하는데 있어 스토리를 만들기 때문에 실무에서 떠올려서 적용하기에 용이합니다. 실제 현재 진행중인 안드로이드 프로젝트에서도 자연스럽게 모호한 지역변수는 없애고, 동일한 전역변수를 빼내고, 절차지향적으로 짜여진 거대한 함수들을 개별 기능만을 담고 있는 함수들로 분리하는데 굉장히 도움이 많이 되었습니다.


 또한 각 챕터의 마지막엔, 해당 챕터에서 목적을 두는 상황 이외의 것들이 벌어질 때 어떤 챕터의 어떤 기법을 사용해야 하는지 알려줍니다. 앞서 구성 부분에서 불편하다고 생각했던 점이, 해당 챕터를 실제 리펙토링에 적용할 때 여러가지 기준이 될 수 있다는 점이 쉽게 읽을 수 있는 책은 아니겠다는 생각을 하게 됩니다.


 특히 마지막 카달로그 부분의 12장인 복합 리펙토링의 경우 많은 것을 느끼게 해줍니다. 단순히 지엽적인 소스 정리가 아닌 설계와 관련된 리펙토링 사례를 4가지 정도로 설명하고 있습니다. 읽으면서 그 4가지 중 4가지 모두에 해당하는 잘못을 범하고 있다는 것이 부끄러우면서도, 앞으로는 이 기법들을 잘 숙지해서 좀 더 효율적인 소스를 만들어야겠다는 생각을 하게 됩니다. 오히려 이런 것들을 빨리 발견할 수 있었다는 점에서 이 책은 굉장히 많은 것들을 제게 알려줬습니다.


 아직 내용을 완벽하게 숙지한 것은 아니지만, [디자인 패턴][리팩토링]은 목적은 동일하되 접근하는 관점은 정 반대라는 생각이 들었습니다. 전자는 모델하우스 같이 특정 구조로 접근을 하는 것이고, 후자는 리모델링의 느낌을 받았습니다. 그래서 경험있는 개발자들은 프로그램을 설계할때 어울리는 디자인 패턴을 대략적으로 정하고, 그 뒤에 프로그램이 완성되면 비효율적으로 구현된 소스들을 리팩토링하는 노하우가 있을 것이라는 기대를 하게 됩니다. 물론 책에서도 언급했듯이 현실은 그대로 동작하는 코드들은 건들지 말라 라던가, 아니면 마감에 쫓겨 그런 것 따위는 해도 그만 안해도 그만 이라는 생각을 하게도 합니다.


 그렇지만 진정 좋은 프로그래밍을 하려면 어떤 행동을 해야 할까요? 귀찮아서 운동하지 않아 비만이 되고 수많은 성인병에 걸리는 것보다는, 귀찮더라도 꾸준한 운동을 통해 건강한 몸을 만드는 것이 당연히 좋습니다. 프로그램도 마찬가지이지 않을까요?  좋은 프로그램을 만들려면 기회가 있는한 하는 편이 추후 확장성의 확보측면에서도, 속도측면에서도, 버그 디버깅의 측면에서도 낫다고 말하는 것이 건강한 몸을 가꾸는 것과 다르지 않다는 것을 이해한다면, 리팩토링의 필요성은 말하지 않아도 알 것이라고 생각합니다.


3. 결론

 아쉽게도 리뷰어인 저의 실력이 미흡한 관계로 책의 내용들을 100% 이해하지 못한 채 리뷰를 진행하게 된 점이 안타깝습니다. 그만큼 쉬운 내용은 아니라는 의미도 되겠지요. 그리고 영어를 그대로 읽은 단어들은 안그래도 어려운 내용들을 더 어렵게 했습니다. 그냥 한국어로 읽지 않고, 영어단어 그대로 표기했으면 어떨까 합니다.


 그렇지만 책을 읽는동안 상당한 지적인 자극을 요하는 시간들이었습니다. 설계가 중요한데 항상 코드를 작성하는데에만 신경을 너무 쓰지 않았나 하는 반성을 해 봅니다. 리팩토링 뿐만이 아니라 이런저런 컴퓨터공학적인 기술들이 많이 나와있는데, 이를 익히는데 너무 두려워하지 않고 더 즐겁게 배울 수 있다는 점이, 더 많이 성장할 수 있다는 점이 프로그래머의 숙명이자 기쁨이 아닐까 생각합니다.