지난 20년간 전 세계 프로그래머에게 리팩터링의 교본이었던 이 책의 1판은, 기존 코드의 디자인을 개선하고 소프트웨어 유지 관리 능력을 향상시켰으며 기존 코드를 이해하기 쉽게 만드는 데 도움을 주었습니다. 간절히 기다려온 이번 개정판에는 프로그래밍 환경의 중요한 변화가 대거 반영되었습니다.
새로운 리팩터링 카탈로그를 자바스크립트 코드로 제시합니다. 리팩터링 원칙부터 클래스 없이 리팩터링하는 방법과 데이터 조직화, 조건부 로직 간소화 방법을 다룹니다. 또한 언어에 상관없이 리팩터링을 성공적으로 수행하는 실질적인 방법을 알려줍니다.
주요 내용
리팩터링 프로세스와 일반 원칙 이해하기
프로그램을 더 쉽게 이해하고 변경하는 유용한 리팩터링 빠르게 적용하기
리팩터링 가능성이 있는 코드에서 풍기는 악취 인식하기
각 리팩터링 기법의 개념, 동기부여, 역학 및 간단한 사례 살펴보기
리팩터링을 수행하는 견고한 테스트 구축하기
리팩터링의 장단점과 장애물 인식하기
저자소개
저자
마틴 파울러
ThoughtWorks 수석 과학자. 엔터프라이즈 소프트웨어 설계에 주력한다. 특히 좋은 설계와 설계 개선에 관심이 많다. 소프트웨어 개발 관련 다수의 책을 집필했고, 제어 역전(Inversion of Control)과 의존성 주입(Dependency Injection) 용어를 대중화시킨 장본인이다.
역자
개앞맵시(이복연)
고려대학교 컴퓨터학과를 졸업하고 삼성전자에서 자바 가상 머신, 스마트폰 플랫폼, 메신저 서비스 등을 개발했다. 주 업무 외에 분산 빌드, 지속적 통합, 앱 수명주기 관리 도구, 애자일 등 동료 개발자들에게 실질적인 도움을 주는 일에 관심이 많았다. 그 후 창업전선에 발을 들여 좌충우돌하다가 개발자 커뮤니티에 기여하는 더 나은 방법을 찾아 출판 시장에 뛰어들었다.
『밑바닥부터 시작하는 딥러닝』 시리즈, 『구글 엔지니어는 이렇게 일한다』, 『리팩터링 2판』, 『JVM 밑바닥까지 파헤치기』, 『이펙티브 자바 3판』 등을 번역했다.
- 페이스북: facebook.com/dev.loadmap
- 브런치: brunch.co.kr/@wegra
역자
남기혁
고려대학교 컴퓨터학과에서 학부와 석사 과정을 마친 후 한국전자통신연구원에서 책임 연구원으로 재직하고 있다. 한빛미디어에서 『Make: 센서』(2015), 『메이커 매뉴얼』(2016), 『이펙티브 디버깅』(2017), 『리팩터링 2판』(2020), 『전문가를 위한 C++(개정 5판)』(2023)을, 길벗에서 『핵심 C++ 표준 라이브러리(2판)』(2021), 『모던 C』(2022), 『Go 100가지 실수 패턴과 솔루션』(2023)을, 에이콘출판사에서 『Go 마스터하기』(2018), 『자율주행 자동차 만들기』(2019, 2022), 『스콧 애론슨의 양자 컴퓨팅 강의』(2021) 등을 번역했다.
리팩터링 1판은 1999년 출간되었으며, 한국어판은 2002년 한국에 소개되었다. 수많은 독자에게 사랑을 받았으며 리팩터링이란 용어가 프로그래밍 세계에 터를 잡는 계기가 되었다.
1판 출간된 후 18년이 흐른 지금 리팩터링은 무엇이 바뀌었을까? 이번 2판은 거의 모든 페이지가 새로 쓰였지만, 리팩터링의 핵심은 변하지 않았고, 주요 리팩터링 기법들도 여전히 유효하다. 2판이 리팩터링을 효과적으로 수행하는 법을 더 많은 사람이 익힐 수 있는 촉매가 되어줄 것이다.
리팩터링이란?
리팩터링은 겉으로 드러나는 코드의 기능은 바꾸지 않으면서 내부 구조를 개선하는 방식으로 소프트웨어 시스템을 수정하는 과정이다. 요컨대, 리팩터링한다는 것은 코드를 작성하고 난 뒤에 설계를 개선하는 일이다.
다루는 내용
이 책은 전문 프로그래머를 대상으로 쓴 리팩터링 지침서다. 절제되고 효율적인 방식으로 리팩터링하는 법을 알려주는 것이 목표다. 코드에 버그가 생기지 않게 하면서 구조를 더 체계적으로 바꾸는 방법을 설명한다.
누가 읽어야 하나
이 책은 소프트웨어 개발을 직업으로 하는 전문 프로그래머를 위해 쓰였다. 예시와 본문에는 읽고 이해해야 할 코드가 꽤 많다. 예시 코드는 모두 자바스크립트로 작성했지만, 대부분의 언어에 적용할 수 있을 것이다. 이 책의 내용을 쫓아오려면 프로그래밍 경험이 어느 정도 있으면 좋지만 고수가 아니라도 읽을 수 있다.
코딩 스타일이 바뀐다
객체지향 언어의 문법을 익혔다고 저절로 객체지향 프로그래밍을 할 수 있는 게 아니다. 리팩터링 카탈로그를 통해 어떤 코드를 고쳐야 하는지, 왜 고쳐야 하는지, 고친 코드가 왜 좋은지 이해할 수 있다. 이런 과정을 통해 객체지향에 어울리는 코드 디자인을 배우게 되고, 자신의 코딩 스타일도 바뀌게 된다. 이 책을 읽기 전과 후는 코드의 품질에 결정적인 차이가 생길 것이다
2판이 나왔다기에 보는데, 자바 코드로 되어있던 1판과 다르게 2판은 예제 코드가 자바스크립트로 되어있다.
'들어가며'에 저자가 이런 말을 한다.
"프로그래밍 책에게 있어 18살은 너무 늙은 것이기에 새로 쓸 시기가 되었다고 느꼈다. 그래서 이번 2판은 거의 모든 페이지를 새로 썼지만, 핵심은 거의 변하지 않았다. 리팩터링의 핵심은 똑같고 주요 리팩터링 기법들도 여전히 유효하다. 하지만 2판이 리팩터링을 효과적으로 수행하는 법을 더 많은 사람이 익힐 수 있는 촉매가 되어줄 것이다."
1판이 벌써 18살이나 되었다니.
한창 리액트에 빠져있어서 최근에는 자바스크립트를 자바보다 많이 사용하고 있고, 거의 모든 페이지를 새로 썼다기에 선택.
1, 2장은 리팩터링이 무엇인지, 왜 필요한지에 대해 설명한다.
내가 관심을 가진 것은 3장부터인데 코드 악취가 나는 곳을 찾아내는 요령에 대해 알려준다.
4장은 테스트, 5장은 카탈로그 보는 법에 대해 이야기하고 6장부터 본격적인 기법이 나온다.
뒷부분은 진짜 리팩토링을 하려고 할 때 적절한 케이스를 찾아 적용하는 방법으로 책을 활용하면 좋을 듯하다.
코드가 자바스크립트로 되어있어서 프론트 개발자들도 1판보다 더 쉽게 접근할 수 있을 듯.
리팩터링과 관련하여 너무 유명한 책이고 정석 같은 책이고 이미 오랜 시간 검증된 책이라 더 덧붙일 말도 없다.
저는 한국 사람입니다. 그래서 우리말을 유창하게 잘합니다(?). 의사소통도 그럭저럭 잘하는 편이구요. 그런데 글은 썩 잘 못쓰는 편이라고 생각합니다. 내가 하고 싶은 이야기를 어찌저찌 말로는 표현하겠는데 체계적인 글로 표현하는 것은 참 어렵습니다.
저는 코딩 공부를 좋아합니다. 전문 개발자는 아니구요, 취미로, 재미로 프로그래밍 언어를 공부해보고 있습니다. 책도 따라하고 인터넷을 검색하고 유튜브 영상들도 보면서 만들어보고 싶은 프로그램들을 만들다보면 어려운 점들이 많습니다. 그 중에 하나는 제가 만든 코드는 다른 사람들이 만든 코드처럼 깔끔하고 알아보기 쉽지가 않습니다. 주석은 덕지덕지 달아놓지만 뭔가 정리되지 않은 방 같은 느낌을 받는달까요? 그러다보니 코드가 어찌저찌 결과는 나오는데 버그도 많고 나중에 유지보수도 매우 어렵더라구요. 몇줄 되지 않는 코드인데도 말이지요...
리팩터링?
"리팩터링은 겉으로 드러나는 코드의 기능(겉보기 동작)은 바꾸지 않으면서 내부 구조를 개선하는 방식으로 소프트웨어 시스템을 수정하는 과정이다."
요컨데 리팩터링은 코드를 작성하고 난 뒤에 설계를 개선하는 일이라고 할 수 있습니다. 글을 쓰고나서 탈고를 하는 것처럼 글의 의미는 바꾸지 않은 채 전달하기 효과적인 글로 다듬는 일이라고 할 수 있지 않을 까요?
다루는 내용
이 책은 전문 프로그래머를 대상으로 쓴 리팩터링 지침서입니다(저자의 말). 코드에 버그가 생기지 않게 하면서 구조를 더 체계적으로 바꾸는 식으로 리팩터링을 하는 방법을 설명하고 있습니다.
책의 전반부(1장~4장)에는 리팩터링의 개념은 무엇이며 왜 필요한지, 리팩터링이 필요한 곳을 어떻게 찾는지, 테스트는 어떻게 구축하는 지 등을 다루고 있습니다. 이어 후반부(5장~12장)에서는 리팩터링 카탈로그(목록)이 펼쳐져 있습니다.
함수 추출하기 / 함수 인라인하기
변수 추출하기 / 변수 인라인하기
함수 선언 바꾸기 / 함수 캡슐화하기
변수 캡슐화하기 / 변수 이름 바꾸기
매개변수 객체 만들기 / 여러 함수를 클래스로 묶기 / 여러 함수를 변환 함수로 묶기
단계 쪼개기
이처럼 코드 리팩터링을 위한 기본적인 개념을 6장에서 다루고 7장부터는 보다 다양한 리팩터링 전략들을 소개하고 있습니다.
대상 독자
이 책은 소프트웨어 개발을 직업으로 하는 전문 프로그래머들을 위해 쓰여졌다고 저자는 말합니다. 기본적으로 자바스크립트로 작성된 코드를 가지고 리팩터링을 진행합니다. 자바스크립트 언어를 아시는 분들은 어렵지 않게 책을 읽으실 수 있고 그렇지 않더라도 기본적인 프로그래밍 경험이 있다면 문제 없이 읽으실 수 있습니다. 저자는 사용하는 언어에 상관없이 모든 프로그래머들을 위해 이 책을 썼다고 합니다. 프로그램의 기본은 다 비슷비슷하니까요.
이 책은 프로그래밍 언어를 처음 다루는 분들을 위한 책은 분명 아닙니다. 코드 구조를 더 나은 구조로 만들고 싶은 열망을 가지고 계신분들은 필히 읽어보셔도 좋을 것 같습니다. 이 책을 카탈로그라고 설명합니다. 책장에 꽂아두고 있다가 어떤 단계의 리팩터링이 필요하다면 언제든 꺼내어 참고할 수 있는 책입니다.
소감
개인적으로 이 책을 읽으면서 과장을 조금 더한다면.... "감동받았습니다!" 내가 작성한 코드들이 어떤 문제들이 있고... 아니 사실 문제가 있다기 보다는 이 코드들을 이렇게 바꾸면 훨씬 깔끔한 모습으로 바꿀 수 있을지가 느껴지니 가슴이 두근거렸습니다.
물론 이 책을 한 번 읽었다고 저의 코딩 스타일이 바뀌지는 않겠죠. 하지만 코드를 보는 시각, 수정하는 기술이 무엇인지를 조금은 새롭게 보게 된 것 같습니다. 초보 취미 코더에서 조금 더 수준 높아진 코더, 개발자스러운 개발자로 한 층 성장하기 위해서 반드시 참고할 책이라고 감히 추천합니다.
그중 <코딩 잘하는 법>이란 영상이 있다. 그 영상에서 소개된 책이 한빛미디어에서 나온 <리팩터링 2판>이다.
우연히 기회가 되어서 이 책을 받아 보았다. 무슨 내용일지 궁금하다.
리팩토링의 개정판. 저자가 독자의 편의를 위한 수정이 들어갔다. 1판과 비교해 새로 썼다고 하셨지만 그래도 핵심은 변하지 않는다고 한다. 친절한 설명과 한국어 독자를 위한 안내 덕분에 책을 읽기 수월했다. 2판의 코드는 자바스크립트로 되어있고 마침 내가 요즘 자바스크립트를 공부하고 있다. 후후
일반적인 개발서를 읽으면 이론부터 설명하고 실습으로 넘어가는데, 리팩터링 2판은 예시로 시작한다.
리팩터링 2판을 잘 읽는 방법은 [들어가며]에 설명되어 있다.★
- 리팩터링을 잘 모른다면 1장 정독
- 리팩터링의 이유를 모르겠다면 1장과 2장 정독
- 리팩터링을 할 곳을 찾고 싶다면 3장 정독
저자님과 엘리님도 1장부터 4장까지 꼼꼼하게 읽는 것을 추천했다.
5장부터는 기법들이 나오기 때문에 찾아보는 부분이다.
1장을 1회독 해보았는데, 반복해서 읽으면 감이 생길 것 같았다. (정말로) 그래서 재밌게 읽었다. New World
1장은 50페이지 정도인데 1회독 하는데 오래 걸리지 않았다. 리팩토링 지식은 대학이나 학원에서 알려주지 않는다고 들었다. 나도 멘토링을 통해서 맛만 본 것 같았는데 이걸 책으로 볼 수 있다니....
누가 읽어야 하나
- 코딩을 잘하고 싶은 사람
- 코드 리뷰를 받고 싶은 사람
- 독학으로 공부하는데 잘 하고 있는지 궁금한 사람
- 주니어에서 미드 주니어 사이
책 속의 문장
리팩터링하기 전에 제대로 된 테스트부터 마련한다. 테스트는 반드시 자가 진단하도록 만든다. 28p
컴퓨터가 이해하는 코드는 바보도 작성할 수 있다. 사람이 이해하도록 작성하는 프로그래머가 진정한 실력자이다. 35p
1.코드를 작성한 후 어떤 방식으로 해야 읽기 편하고 재사용이 용이한지 도움을 주어 유지 보수할작업이 줄어들며 여러 사람들과 공동 작업할 때 도움이 됨
2.코드 구조를 개선하는 과정에서 코드를 효율적으로 짜는 방법을 터득하여 설계하는 안목을 기르게됨
추천
1.프로그래밍 문법을 마치고 효율적으로 코딩하는 방법을 원하는 프로그래머
2.작성한 코드가 비슷한 유형으로 반복하거나 작성한 코드를 오래 사용하는 경우
후기
1.이 책을 읽으면서 학교에서 캡스톤 프로젝트를 진행할 때 여러 사람들과 같이 작업하다 보니코딩 스타일이나 변수 명 등 사용자마다 차이점이 존재하기 때문에 코드 해독 과정 및 보수 과정에서 상호간에 불편한 경우가 존재하는데 이 책을 통해과거에 내가 작성한 코드에 대한 반성 및 효율적으로 짜는 안목을 기르게 됨
어떻게 하면 조금 더 가독성이 좋고 간결한 코드를 짤 수 있을까? 어떻게 짜면 버그를 쉽게 찾을 수 있는 코드를 짤 수 있을까? 라고 하면 이 책을 사서 공부하는 것이 좋은 방법 중에 하나입니다.
기존 프로그램의 기능을 변경하지 않고 내부의 코드를 수정하는 것을 간략하게 리팩토링이라 합니다. 간단하게 말해 코드를 깔끔하게 정리하는 비법이라 할 수도 있겠습니다.
이 책은 리팩터링을 배우고 싶어하는 개발자를 위해 쓰여졌습니다.배우는 입장에서 이해할 수 있도록 작가의 리팩터링 기법 등이 예시와 함께 제공됩니다. 이미 리팩터링에 대해서 알고있는 개발자들도 다시 한번 보고 그 내용을 곱씹으면 또 다른 경험이나 생각이 들 수도 있습니다.
리팩터링? 코드를 그냥 깔끔하게만 짜는 방법만 있는 책인건가? 할 수도 있지만 책 속에 있는 저자의 팁과 테크닉등은 조금더 깔끔하고 유지보수성이 높고 확장이 쉽게 되는 코드를 짤 수 있습니다.
초판은 자바 언어로 쓰여졌습니다. 2판은 자바스크립트로 쓰여졌습니다. 자바스크립트가 조금더 대중적으로 쓰여져 그런듯 합니다. 하지만 책의 내용은 자바나 자바스크립트에 국한되지 않습니다.
프로그래밍을 배우고 익힌 다음 어떤 프로젝트나 자신만의 프로그램을 만듭니다. 그 다음 조금 프로그래밍에 자신이 생긴 다음에 해야할 것들 중에 하나가 리팩터링이 아닌가 싶습니다.
이 책을 통해 리팩터링에 대해 생각해보고 적용해 본다면 더 좋은 프로그래머로 한단계 나아갈 수 있는 기회가 될 것입니다.
해당 포스팅은 한빛미디어 ‘나는 리뷰어다` 서평단 자격으로 책을 무료로 제공받아 작성된 서평임을 밝힙니다.
리팩터링 2판 - Martin Fowler 저
책의 구성 및 평가
개발을 할 때, 기능 추가 및 수정을 쉽게 할 수 있도록 코드를 적는 방법론에 대해 서술된 책입니다.
책의 시작 부터 앞으로 책에서 계속해서 제시할 리팩터링 기법들을 사용하여 기능 추가 / 수정이 쉽고 누가 보더라도 읽기 편하도록 코드를 리팩터링 하는 것을 보여주고 있으며, 그 뒷장부터는 소개하고자 하는 리팩터링 기법에 대한 상세 내용 등에 대한 본문이 서술되어 있습니다.
아직 다 읽지 못한 채로 책의 서평을 써야 하는것이 아쉬운 점이긴 하나, 필자가 말하고자 하는 리팩터링 원칙, 기법에 대해 누가 보더라도 이해 할만한 다양한 예시가 적혀 있어 책을 읽는데 어려움이 없어 책의 구성은 매우 만족스러웠습니다.
책 초반에 리팩터링은 지금 당장 할 수 있는 작업이 아니며, 비생산적이라 생각하는 개발자들에게 리팩터링을 적용하는 것에 대한 잘못된 생각들을 말하며 현실적인 조언을 해주는 부분도 좋았습니다.
유지보수가 쉬운 코드에 대해 계속 고민하던 저에게, 이 책은 저에게 좋은 지침서가 될 것 같습니다. 책에 적혀 있는 내용들을 계속해서 현업에서 적용하며 천천히 내 것으로 만들어 가야 할 것 같습니다.
서론부터 시작해서 굉장히 흥미롭게 본 책이다. 프로그래밍을 시작하면서 가장 많이 들었던 말 중 하나는 '프로그래밍은 책으로 공부하는게 아니다' 라는 것이다. 개인적으로 반은 맞고 반은 틀리다고 생각한다. 확실히 프로그래밍은 직접 코드를 작성하면서 의도대로 잘 작동하는지, 오류가 있으면 어떤 부분이 문제인지를 지속적으로 파악해가면서 공부하는 것이다. 그러나 이미 선대 프로그래머분들이 직접 겪어본 삽질을 내가 다시 수십년간 반복할 필요가 있을까?! 이런 부분은 책을 통해서 충분히 공부가 가능하다고 본다.
훌륭한 프로그래머분들이 작성한 이 리팩터링 책은 여러 프로젝트를 통해 발견된 오류와 삽질을 정리해서 알려준다. 나같은 초보 프로그래머들은 수백만줄이나 되는 프로젝트를 경험해볼 일이 없기 때문에 문제가 생기면 처음부터 다 살펴보면 해결된다. 그러나 수백명이 같이 진행하는 프로젝트에서는 이런 것이 불가능하다. 오죽하면 코드가 너무 복잡해서 처음부터 다시 만드는 것이 더 빠르다는 말이 나올 정도니... 예전에는 이 말이 이해가 되지 않았지만 일본인분이 트위치에 올려주셨던 짤을 보고 단번에 이해가 되었다.
위의 자전거 짤만 봐도 리팩토링의 중요성을 알 수가 있다. 좋아하는 만화 '미생'에서도 재밌는 말이 나온다.
사업하면서 가장 위험한게 뭔지 알아? 경주마가 되는 거야. 앞만 보고 달리는. 그러다 박살난다고. 넓게 보고 체크할 거 체크하고 가야지.
- 미생1 44수 中 -
단순히 1회성 프로그램을 만드는거면 상관이 없지만, 그게 아니라면 문득문득 멈춰서서 정리를 해야한다. 미생에서 말하는 체크할 것들, 즉, 계약서 등에 적힌 용어들과 숫자들이 올바르게 적혀있는지 확인하는 것처럼 프로그래밍에서도 함수/변수명, 알고리즘 로직, 클래스 구조 등이 코딩 스탠다드에 맞게 제대로 짜여져 있는지 확인해야 한다고 본다.
책에서 저자는 TDD(Test-Driven Development)- 테스트 주도 개발을 추천한다고 한다. 그러나 김포프에 의하면 반은 맞고 반은 틀리다고 한다. 일단 테스트는 뭐든 간에 하면 좋다. 그러나 TDD를 하기 위한 테스트 코드를 작성하고 검사하는 시간이 필요 이상으로 많이 든다는 것이다. 게다가 TDD를 통해 나오는 버그들은 A급 버그가 아닌 경우가 많으며 이런 버그들은 차라리 정적 분석(Static Analysis)를 통해 빠르게 검출이 가능하다고 한다. 무엇보다 TDD 통해 나올 수 있는 버그들은 QA 과정에서 충분히 검출이 가능하며, 정적분석은 프로그램 전체에서 예상치 못한 오류나 빼먹은 코드도 검출이 가능하다는 것이다. 물론 책의 저자도 테스트를 너무 많이 만들다가 오히려 필요한 테스트를 놓치기 쉽기 때문에 가장 걱정되는 영역을 집중적으로 테스트하고 적은 수의 테스트만으로 큰 효과를 보는 것이 중요하다고 설명한다.
어떤 방법이 옳다 그르다를 논하기 보다는 어쨌든 좋은 프로그램을 만들기 위한 방법들이니 목적은 같다는 점이 중요하다. 혼자서 프로그램을 만드는 것에는 한계가 있다. 혼자서 연구를 하는 것이 아니라 여러 사람들과 협업을 통해 제품을 만드는 것이 목적이라면 모두가 효율적으로 일할 수 있게끔 코드를 작성해야 한다. 이 자리를 빌어 프로그래머들이 아무리 단순한 프로그램이라 할지라도 변수명을 a,b,c로 작성하고 넘겨주는 짓 좀 안했으면 좋겠다.(듣고 있나 홍**)
이 책은 자바스크립트로 된 실제 코드 예제들을 보여주면서 구체적인 리팩터링 방법에 대해 알려 줍니다. 큰 프로젝트의 코드를 유지, 보수하기 위해 어떻게 하면 효율적으로 리팩터링 할 수 있는지를 제시해 주고 있습니다. 단순히 동작하기만 하는 코드가 아니라 왜 설계가 잘 된 코드가 필요한지, 단계별로 코드의 변경사항들을 보여주면서 설명해 주며 개발자로 성장하기 위해 한번쯤은 읽어보면 좋은 내용들이 많은 책입니다.
깃헙에 널린 소스들만 찾아봐도 읽기 쉬운 코드와 읽기 어려운 코드는 쉽게 구분될 수 있을 것이다. 프로젝트 구조가 복잡하다는 것이 아니라 그냥 쉬운 코드도 어렵게 짜놓은 코드가 너무 많다는 얘기다. 물론 나도 내가 쓴 코드를 나중에 다시 보면 읽기 힘들어한다. 그래서 잘 쓰고 싶었다. 나도 읽기 쉽고 동료도 읽기 쉬운 코드. 리팩터링은 글쓰기의 퇴고와 비슷하다. (코딩에 탈고가 있는지는 모르겠다) 지금 완벽하다고 생각되는 코드도 10년 뒤에 갑자기 버그가 발생할지 모르고 특히 요즘 같이 클라우드 생태계가 커지고 MSA가 만연하는 세상에 더욱 더 불확실성이 증가했지 않을까 싶다. 그래서 테스트 코드 작성과 리팩터링은 필수 작업이다. 리팩터링과 테스트 코드가 모든 것을 해결할 수 없지만 적어도 프로그래머가 제공하는 최고의 안정성인 것 같다.
개발력이 급상승하는 필수 기술
책은 크게 세 부분으로 나눌 수 있다. 1장에서 예시를 통해 리팩터링을 빠르게 훑는다. 2장, 3장에서 원칙과 안티 패턴을 보면서 리팩터링 기준을 세운다. 나머지 부분에서 리팩터링 기법을 보며 실제로 적용해본다.
4장은 리팩터링과 더불어 테스트가 필요하다고 말한다. 테스트 주도 개발(TDD)은 RED-GREEN-REFACTOR, 즉 리팩터링이 포함되어 있는 방법론이다.
마지막 부록에서는 악취마다 어떤 리팩터링 기법을 사용할지 표 형식으로 분류를 해놓았다.
참고로 1판은 자바(Java)로 예시가 쓰인 반면 2판은 자바스크립트(Javascript)로 작성되었다.
대상 독자
1년 이상의 개발 경험을 가진 분들에게 적당하지 않을까 싶다. 아예 개발을 모르는 분이라면 무슨 말인지 이해하지 못할 수 있다.
더 읽을 거리
마틴 파울러(Martin Fowler)와 더불어 켄트 벡(Kent Beck), 스티브 맥코넬(Steve McConnell)의 책들은 중급 개발자로 나아가기 위한 필독서들이다.
- 1장 : 설계가 아쉬운 작은 프로그램을 리팩터링해서 더 나은 객체 지향 프로그램으로 만드는 과정
- 2장 : 리팩터링의 일반 원칙, 정의, 당위성 설명 및 리팩터링할 때 생기는 문제점
- 3장 : 켄트 벡이 도움을 준 내용으로 코드에서 나는 악취를 찾아내는 방법 및 리펙터링을 통해 문제의 부분을 말끔히 제거하는 방법 설명
- 4장 : 리팩터링에는 테스트가 아주 중요하여 테스트를 작성하는 방법 수록
- 5장 ~ 마지막장 : 리팩터링목록 - 대부분의개발자가익혀야할필수리팩터링
예시는 자바스크림트로 이루어져있다. 하지만 이 책은 사용하는 언어에 상관없이, 모든 프로그래머를 위해 쓰였다고 한다. 예시코드는 자바스크립트로 구성되어있지민 대부분의 언어에 적용 가능하다. 책이 알차게 구성되어있어 꽤 두께가 있는 편이라서 전부를 읽지않고도 내용 대부분을 습득할 수 있도록 독자의 상황에 따라 추천하는 부분을 넣어놓은 점이 필요한 부분만 딱 골라서 읽을 수 있어 좋았다.
개발자라면 이름만 들으면 누구나 아는 "마틴 파울러", 그가 쓴 책 리팩터링이 제 2판으로 돌아왔다. 비싼 돈 주고 원서 산지가 얼마 안 된 것 같은데 벌써 번역서가 나오다니 참으로 반갑기 그지없다.
## 리팩터링 2판으로 돌아오다.
아마 1판은 인사이트에서 하드커버로 출간하고, 한빛미디어에서 페이퍼백으로 재출간했었는데 개인적으로 후자가 번역 품질이 좋았던 기억이 있다. 이번 2판도 한빛미디어에서 출간하였고, 번역 품질도 좋고 술술 읽히는 수준이라 이해에 크게 문제가 없다.
그리고 사실 언어야 상관 있겠냐마는 1판에서는 자바로 예제를 설명했다면, 2판에서는 자바스크립트로 예제를 설명하고 있다. 원서는 종이책은 물론 웹 버전으로도 발간하여 중간중간 업데이트를 해주고 있는데, 이 번역서에도 웹판의 일부 추가된 부분이 함께 번역되어 더욱 좋았다. 다만 살짝 아쉬운 점은 리팩터링에 대한 전반적인 설명을 하는 1~5장에서 사용한 리팩터링 기법들의 인덱스가 원서에서는 해당 페이지로 표시되어 찾아가기 쉬웠던 반면, 번역서에는 장/절로 표시되어 있어 다소 찾아가기 힘들었다.
## 내용을 살펴보면,
1장은 실제 예제 코드를 가지고 리팩터링이 무엇인지 전반적인 과정을 보여준다. 2장은 리팩터링을 왜 해야 하는지, 그리고 언제 해야 하는지 이야기하고 있다. 3장에서는 어떤 코드를 리팩터링해야 하는지 판단하기 위해 코드의 나쁜 냄새에 대해 설명한다. 4장에서는 짧은 스텝으로 진행해야 하는 리팩터링에서 테스트 코드의 중요성을 강조하며 테스트 방법에 대해 다룬다. 5장부터 12장까지는 리팩터링 카타로그와 실제 리팩터링 기법들을 예제와 함께 자세히 설명하고 있다.
## 이 책은 어떻게 읽어야할까?
1판을 보신 분들이라면 아시겠지만 2판도 리팩터링의 핵심 기법은 비슷하다. 다만 예제들을 자바스크립트로 새롭게 작성하면서 관련 예제와 설명들도 한층 업그레이드되었다.
책에서는 리팩터링 과정을 한 번에 정말 작은 단계로 조심스럽게 진행하는 과정을 지나칠 정도로 보여주는데 이러한 한 단계 한 단계 점진적인 개선은 테스트를 수반한 안전한 방법임을 상기해야 한다. 또 그러한 단계가 왜 필요한지 고민해 본다면 리팩터링 세계에 한 걸음 더 다가갈 수 있지 않을까 싶다.
디자인 패턴을 공부하던 시절 프로덕션 코드에 어설프게 적용하며 어깨를 들썩이던 경험이 있었다. 하지만 그다지 필요도 없는 곳에 적용하여 코드의 복잡도만 올라가고 가독성은 떨어지는 부작용만 낳았다. 리팩터링도 기법만 달달 외운다고 저절로 코드의 개선이 이루어질거라는 환상은 갖지 말자. 리팩터링을 언제 해야 하는지 아는 것, 즉 코드의 나쁜 냄새를 감지하는 능력을 키우고 리팩터링을 적절하게 적용해야 함을 잊지 말아야 한다. 그러기 위해선 책의 코드들을 그대로 따라 쳐보는 것보다는 책을 덮고 예제 코드의 나쁜 냄새를 맡고 조금씩 리팩터링 해보는 게 중요하지 않을까 싶다. 물론 테스트 코드는 선택이 아닌 필수겠다. 이렇게 한 단계씩 리팩터링을 진행해 보면서 그 리듬을 느껴보고, 그것이 습관이 되어 그 행위가 내 코드에 녹여 들기를 기대해 본다.
## 마지막으로,
마틴 파울러가 이야기했던 말이 원서 표지에는 아래와 같이 적혀있다.
"Any fool can write code that a computer can undestand. Good Programmers write code that humans can understand."
좋은 개발자는 사람이 이해하기 쉬운 코드를 작성해야 한다. 이해하기 쉬운 코드란 단지 이해라는 범주를 넘어 버그를 쉽게 찾을 수 있음은 물론 개발 속도를 높여주고 결국 존재하는 코드의 설계를 향상시켜준다. 자, 이제 이 책을 읽고 좋은 개발자가 되어볼 차례이다.
리팩터링 2판은 전반적으로 점진적 개선에 초점을 두고 있다. 그 중 나는 1, 2장을 자세히 읽고 나머지 부분은 키워드 위주로 빠르게 읽고 리뷰를 작성한다.
먼저 책에 대해 설명을 하자면, 이 책의 예시 코드는 모두 자바스크립트로 이루어져 있다. 하지만 자바스크립트 언어의 특성인 함수가 일급 객체인 부분이나 고차함수, ES6의 문법은 사용되고 있지 않다. 주언어가 다른 개발자여도 이 책을 보기에 거부감이 들지 않을 것이다. 자바스크립트를 배우고 있는 나로써는 오히려 자바스크립트의 언어적 특성을 살린 리팩토링 책이 있으면 더 좋았을 것 같다는 생각도 들었다.
나는 현재 짧은 프로젝트를 연속해서 하고 있다. 코드 리뷰도 받으면서 진행하고 있는데, 리팩토링을 해야 하는 코드라는 것은 알고 있지만 한 번 작성한 코드 구조를 수정하기가 쉽지 않다. 이런 상황에서 리팩토링에 대한 글을 보면 좋을 것 같아서 읽게 되었다.
그럼 책에 대해 살펴 보자.
1장은 간단한 연극 매표소 프로그렘 코드를 점진적으로 개선해 나가면서, 리팩토링을 쉽게 설명한다. 작은 프로그램이지만 리팩토링 기법을 사용하면서 알기 쉽게 설명했다.
2장은 리팩터링 원칙인데 본격적으로 정의와 이유, 법칙을 설명한다. 리팩토링하지 말아야 할 때도 설명하는데, 이런 판단력을 기르려면 코드를 많이 보고 느껴야 한다는 생각이 든다.
3장에서는 리팩토링 기법에 대해 키워드 별로 간단하게 설명한다. 3장부터는 필요에 따라 골라서 읽을 수 있을 것 같다.
리팩터링 2판은 한번에 모두 읽고 끝나는 책이 아니라 프로그래밍을 하면서 계속해서 찾아 볼 교과서 같은 책이다.
프로그래밍을 하며 아직 리팩터링을 접하지 못했다면 머지않아 만나게 되고, 만나야 할 내용입니다.
읽어가면서 세 가지 상황을 만날 수 있습니다.
첫째, 프로그램을 만들면서 이래야 할 것 같아 사용하는 자신만의 방식을 리팩터링 기법 가운데 만나면 반가울 것입니다. 내 생각이 틀리지 않았다는, 나와 비슷하게 생각하는 사람이 있다는 사실에 마음 한구석에 남아있던 불안을 떨쳐버리고 미소 지을 수 있습니다. 그러고 보면 사람은 소속을 갈구하는 존재인가 봅니다. 자신은 아니라고 부인할지 모르지만 미지의 세계로 걸어 들어갈 때 누군가 앞서간 발자취를, 하다못해 동물이 지나간 흔적이라도 발견하면 안도의 한숨이 저절로 나오니까요.
둘째, 몇몇 기법에서는 눈 앞에 안개가 걷히는 듯한 경험을 할 수 있습니다. '아하~' 하는 깨달음의 순간을 만납니다.
셋째, 읽으면서 이해는 가지만 '왜 굳이 이렇게까지?' 라는 의문을 던지는 기법도 있을 것입니다.
자신에게 잘 맞는 기법도 있을 것이고, 별로 손이 가지 않는 기법도 있을 것입니다.
경험이 쌓이고 시각이 다양해질수록 펼쳐볼 때마다 보이는 내용이 늘어나리라 생각합니다.
내가 성장하는 만큼 새로운 세계를 만나는 것처럼.
1장부터 5장까지는 쭉 읽은 뒤 6장부터 나오는 카탈로그는 취향대로 읽으셔도 될 듯합니다.
코드가 장황해진다고 느껴지면 펼쳐서 도움을 찾을 수도 있고, 쉴 때 머리 식힐 겸 뒤적거리다 한두 개씩 골라 읽어도 괜찮을 듯합니다. 그러려면 늘 곁에 두어야겠죠.
각 기법은 이름, 개요(개념도 + 코드 예시), 배경, 절차, 예시, 다섯 항목으로 구성됩니다. 이름, 개요, 배경만 훑어도 핵심 개념을 잡을 수 있어 좋습니다.
리팩터링을 얘기하며 테스트가 없는 리팩터링은 있을 수 없습니다. 책에서도 한 장을 테스트에 할애합니다. 리팩터링을 잘하고 싶다면 테스트를 쉽게 할 수 있는 환경을 만들어야 한다고 말합니다.
리팩터링을 하려다 테스트, 특히 단위 테스트로 빠져도 나쁘지 않다고 생각합니다. 단위 테스트를 알아가다 보면 자연스럽게 리팩터링을 만나게 되니까요.
마치 새에게 좌우 날개가 있어야 하는 것처럼, 프로그래머에게 좌우 날개는 리팩터링과 단위 테스트가 아닐까요.
읽는 시간이 많아질수록, 정확히는 읽고 생각하는 시간이 쌓일수록 빛을 발할 책이라 생각합니다.
리펙토링, 학부 시절이나 대학원 시절 그리고 회사에 입사하고 어떤 프로젝트를 하건 듣게 되는소리가 바로 '리펙토링!!'이다. 그만큼 CS분야에 몸담고 있는 사람이라면 한번쯤 들어봤을 굉장히친숙하면서 거리가 있는 용어 또한 '리펙토링'이다. 왜 그럴까? 왜 우리는 그토록 리펙토링에 대한 중요성에 대해서 나름알고 있음에도 이것을 언제 어떻게 적용해야하는지, 그리고 어떤식으로 적용한 내용을 최적화 해야 좋은지이러한 내용에 대해서는 거의 전무한 상태이다. 왜냐하면 아무도 우리에게 리펙토링에 대한 이론적 배경과대략적인 모양은 그려줬지만 실재로 언제 어떤 느낌으로 이를 대해야할지는 가르쳐주지 않았기 때문이다. (물론가르쳐 준다고해서 바로 적용할 수 있는 그런 분야의 학문도 아니긴 하지만.) 하지만 이번에 운이 좋게리뷰한 이 책은 앞서 언급한 언제 어떤 느낌으로 이를 대해야할지에 대한 대략적인 느낌을 알려주고 있다. 그렇다면이번에 리뷰한 책은 과연 어떤 책인지 이제부터 살펴보도록 하자.
【어떤 독자를 위한 책인가】
'리팩터링 2판'은 CS를 하는 모든 사람이라면 읽어야한다. 아니 그냥 무조건 필독서다. 하지만 여기서 의미하는 필독이라는 의미는무조건 읽어야만한다는 의미는 아니다. 반드시 많은 코드를 분석하고 직접 실습하면서 책에서 배운 내용을몸으로 익힐 때까지 반복해서 공부하라는 의미이다. 이 책은 굉장히 친절하지만 코드 경험이 많이 업는막 입문한 사람들이 읽기에는 약간 내용이 심오하다. 무엇보다 갓 입문하는 사람들이 리펙토링이라는 분야에손을 대기에는 너무 이르므로, 좀 더 실무적 경험 (프로젝트경험)이 어느정도 쌓인 다음에 이 책과 함께 CS의 세계를다시금 여행하길 권한다.
이 책을 각 독자층별로 간략히 정리하자면, 초심자에게는아직 신경이 이어지지 않는 머리 속에 기억된 지식으로써 남을 것이며, 중급자에겐 코드를 보며 순간 순간뇌리 속에 번뜩할 아이디어와 인사이트를 줄 그런 책이 될것이다. 그리고 숙련자에게는 이미 몸으로 채득되어자연스레 코드에 녹아내는 그런 아름답고 철학적인 코딩이 가능하게 해줄 것이다.
【책의 구성】 '리펙터링 2판'책의 구성은 어떠한가.
이 책은 자바 코드를 비롯한스크립트 코드를 예를 들어가며 각각 리펙토링 과정을 설명하고 있다. 단순 글로만 정리한 것이 아니라, 어느 상황에서 어떤 기법으로 어떤식으로 접근해야하는지를 잘 설명하고 있다. 물론시중에도 리펙토링과 코드 추상화에 관련된 좋은 책들이 많이 있지만 필자가 이제껏 읽어보았던 책들 중에 과히 으뜸으로 손꼽힐 그런 내용들로 구성되어있었다.(솔직히 책을 읽으며 그동안 필자가 짠 코드들을 생각하면, 정말 반성을많이해야겠구나..란 성차을 꽤나 했다.) 책의 쳅터 구성은전반부는 전체적인 리펙터링이 무엇이며 언제 어떻게 해야하며 이와 관련된 지식들을 통합적으로 설명하고 있다. 또한후반부는 각각의 케이스에 따른 리펙토링을 챕터별로 잘 구분하여 설명하고 있기 때문에 전반부를 차례로 읽고 후반부는 필요에 따라 각 쳅터를 선정하여읽어도 크게 무리가 없겠다는 생각이 들었다. 그만큼 후반부의 각 쳅터는 각 쳅터의 구성이 독립적으로잘 구성되어 있었고 또한 전 장에 크게 연관되어 있지 않기 때문에 앞장에 관한 지식이 많이 없더라도 어느정도 편하게 읽을 수 있게 구성되어 있다.(물론 간혹 뒷장의 기술이 앞장에서 언급되는데, 그런 경우에는 어느장의내용인지 충분히 언급하고 있기 때문에 잘 기억해 두었다가 나중에 해당 쳅터의 내용을 공부할때 참고하면 되는 구조이다.)
【리팩터링 2판을 읽으며…….】
리펙토링은 어찌보면 굉장히주관적인 기술이다. 왜냐하면 누군가에게는 괜찮아 보이는 구조인 것이 누군가에게는 굉장히 어설프고 불편해보이는 구조로 보일 수 있기 때문이다. 그렇기 때문에 이게 답이야! 라고확실히 단언하고 접근하기에는 한계가 있는 학문이다.(간단히 말해 획일화 된 답은 없다.) 하지만 이번에 리뷰한책은 리펙토링의 지식 중에서도 골자가 되는 내용만을 다루고 있기 때문에 이 부분에 대해서는 아마도 대부분의 프로그래머들이 수궁할 수 있는 수준이라고생각된다. 특히 실무에 있다보면 다양한 사람들이 구성한 수많은 코드들을 접하게 되는데 몇개의 코드들은정말 눈씻고 처다봐도 형편 없는 그런 코드가 있는가하면 정말 몇몇 코드는 그 흐름이 분명하고 자연스러워 프로젝트 구성을 한눈에 파악하기 좋은 코드가있다. 이런 후자의 코드들의 공통점은 리펙토링을 수시로 했다는 점과 책에서 언급하고 있는 기본 리펙토링적지식이 튼튼한 사람이라는 점 그리고 무엇보다 누군가에 본인의 코드가 한눈에 잘 파악되고 잘 이해할 수 있는 구조이길 바라는 만든이의 간절한 마음이녹아있다는 점이 공통점이었다. 그렇기에 이 책을 통해 수많은 독자분들이 자신의 코드가 나만의 코드가아닌 우리 모두의 코드가 될 수 있는 그런 창작물을 만들 수 있는 프로그래머가 되길 바래본다.
블라인드 앱의 IT 엔지니어 게시판에는 코드의 품질을 탓하는 글들이 자주 올라온다. 전임자가 남긴 코드를 유지보수 해야하는 상황에서 어디서부터 손대야할지 모르겠다거나, 협업을 해야하는 개발자의 코드가 마음에 안든다거나 하는 글들이다. 나 역시 비슷한 경험이 있다. 지난 프로젝트에서 경험이 많은 개발자와 협업을 해야하는 상황이었는데 그 분에게 많은걸 배웠지만 코드 작성 방법에 있어서 서로 다른 방법을 추구했다.
// 변수 선언과 할당의 분리는 어떤 상황에선 개발자의 의도와 다른 동작을 초래한다.
Stringfoo;foo="mypath";
정답이 있는 건 아니지만 최선은 추구해야 할 것이다. 내가 신경 쓰이는 부분은 위와 같이 변수의 선언과 할당을 분리하는 것이다. 과거 학교에서 C 언어를 처음 배울 땐 함수에서 쓸 변수를 최상단에 선언하고 나중에 할당을 했지만 최근에는 변수의 이력을 선언까지 왔다 갔다 하며 이력을 살펴봐야 하고, 중간에 변수의 값이 어떻게 변경될지 알 수 없기 때문에 변수를 할당할 때 초기화(할당)를 하고 최소 선언과 할당을 나누더라도 최대한 가까운 곳에 코드를 배치하게 권장하고 있다. 하지만 이는 스택오버플로에서도 질문이 올라올 만큼 현재도 여러 스타일이 혼재해있는 게 현실이다.
남의 코드를 수정하는 건 민감한 문제이다. 어떤 개발자들은 코드에 자신을 투사해서 다른 사람이 자신이 작성한 코드를 수정하면 자존심이 상하는 것은 물론 고성이 오가기도 한다. (SI 프로젝트에서 자주 봤다..) 그렇다고 수정할 수 있을 때 수정하지 않으면 나중에 소스코드를 인계받을 때 아래와 같은 마음이 된다. 위의 선언과 할당 분리는 최초 작성한 코드에선 문제가 없어도 기능이 추가되고 유지 보수하면서 코드를 수정할수록 코드가 오동작할 가능성이 커지게 된다. 코드를 읽기 힘든 건 덤이다.
이런 상황에서 코드를 넘겨받으면 어떻게 해야 할까? 설계 문서가 있으니 괜찮다고 생각하면 안 된다. 설계 문서와 이를 구현한 코드가 다를 땐 더 큰 혼란이 온다. 넘겨받은 코드가 깔끔하면 좋겠지만 대부분은 그렇지 않다. 특히나 SI 프로젝트에선 기한에 쫓겨 개발하기 때문에 경험상 코드의 품질을 기대할 수 없는 경우가 대부분이었다. 운영팀으로 4년 정도 일하면서 비슷한 고민을 많이 했다. 코드를 넘겨준 개발자를 원망할 때도 있었고, 차마 건들 수 없어서 새로 만든 코드도 있었다. 그렇게 소스코드는 거대한 스파게티가 된다.
그러던 중 리팩터링과 TDD에 관한 세미나를 참여할 기회가 있었다. 기존에 존재하는 복잡도 높은 코드를 어떻게 유지 보수하기 쉬운 코드로 수정할 수 있을까. 몇 시간 동안에 리팩터링에 대한 간단한 기법을 배우고 어떻게 해나가야 할지 배웠다. 유용했지만 ‘과연 실무에서 리팩터링을 해나갈 수 있을까?’라는 질문은 여전히 떨칠 수 없었다. 그러던 중 마틴 파울러가 쓴 리팩터링의 2판이 나왔다는 소식을 접했다. 2판을 쓰면서 예제 언어를 자바스크립트로 바꿨지만, 이 책에서 말하는 기법들과 리팩터링의 원칙은 모든 언어에서 적용할 수 있는 지식이다. 예제를 따라가며 리팩터링을 학습할 수도 있고, 필요할 때마다 리팩터링 기법을 여기저기 찾아다니며 적용할 수도 있다.
동일한 코드가 주어졌더라도 개발자마다 생각하는 리팩터링 방향은 다를 수 있다. 그럴 수밖에 없는 게 코드에 정답이란 건 없으니까, 우린 우리가 옳다고 생각하는 방향으로 최선을 다할 뿐이다. 하지만 절대 원칙은 있다. ‘코드가 전과 같이 동작해야 한다’는 것. 마틴 파울러는 테스트를 통해 동작의 일관성을 유지해야 한다고 말한다. 테스트 코드 작성을 통해 어떤 단위 기능의 동작에 대한 명세(specification)를 대신할 수도 있다. 어떤 사람들은 테스트 코드를 작성하면 개발 생산성이 떨어진다고 주장한다. 당연히 코드 작성량이 배가 되지만, 이를 통해 우리는 안정감을 얻을 수 있다. 세상에 변하지 않는 건 없다. 코드도 그렇다. 실시간으로 변하는 요구사항에 맞춰 코드를 작성하다 보면 망망대해에 방향 잃은 배에 탄 것처럼 혼란스럽고 외로울 때가 있다. 이때 테스트 코드는 목적지를 가리키는 나침반이 돼줄 것이다.
복잡한 코드, 알 수 없는 코드를 작성한 사람을 원망하는 건 그만하자. 이제 앞으로 나아가야 할 때이다. 조금씩 리팩터링을 해보자. 내가 수정하는 파일만이라도 보이스카웃 규 칙을 생각하며 리팩터링 해보자. 물론 쉬운 일이 아닐 것이다. 하지만 누군가는 해야 하는 일이니까 지금부터라도 해보는 건 어떨까?
마틴 파울러가 이미 기존에 출간했던 리팩터링이란 책은 워낙 유명한 개발자 바이블이라서 모르는 분들이 없을 것이다. 허나 그 책은 18살이라는 많은 나이를 먹었다. 하지만 리팩토링이라는 근간은 시간이 지나도 달라지지 않았다. 2판은 거의 모든 페이지를 새로 썼지만, 핵심은 거의 변한지 않았다. 리팩터링의 핵심은 똑같고 주요 리팩터링 기법들도 여전히 유효하다. 하지만 2판이 리팩터링을 효과적으로 수행하는 법을 더 많은 사람들이 익힐 수 있는 촉매가 되어 줄 것이다.
리팩터링이란, 코드의 기능은 바꾸지 않으면서 내부 구조를 개선하는 방식으로 소프트웨어 시스템을 수정하는 과정이다. 버그가 생길 가능성을 최소로 줄이면서 코드를 정리하는 정제된 방법이다. 즉, 코드를 작성하고 난 뒤에 설계를 개선하는 일이다.
하지만 우리는 애초에 설계를 잘 해야한다고 배워왔고 그렇게 하려고 많은 시간을 투자하고 있다. 하지만 비즈니스는 멈춰있지 않고 계속 흐르고 변한다. 코드는 점차 수정되고 시스템의 무결성, 즉 설계에 맞춘 구조는 점차 뒤죽박죽이 되어간다. 공학에 가깝던 코딩 작업은 서서히 해키 솔루션으로 도배가 된다. 이렇게 소프트웨어는 점차 부식되어가는데 이 고치는 과정을 리팩터링이라고 한다.
리팩터링을 제대로 알고 싶다면 가장 중요한 1장을 반드시 읽고 이해해야 한다.
- 2장은 리팩터링의 일반 원칙, 정의, 당위성
- 3장은 코드에서 나는 악취를 찾아내는 방법과 리팩터링을 통해 문제의 부분을 말끔히 제거하는 방법
- 4장은 테스트를 작성하는 방법
- 5장 부터는 리팩터링 방법론을 제시하여 사전 처럼 찾아볼 수 있다.
이 책은 예시로 자바스크립트를 선택했지만 사용하는 언어에 상관없이 모든 프로그래머를 위해 쓰여졌다.
자바스크립트의 아주 복잡한 언어 특성은 되도록 사용하지 않고, 자바스크립트를 깊이 알지 못해도 무리 없이 이해할 수 있도록 작성되어 있다.
책을 전부 읽지 않고도 내용 대부분을 습득하려면 아래와 같은 방법을 추천한다.
- 리팩터링이 뭔지 모른다? 1장을 읽자
- 리팩터링해야 하는 이유를 모르겠다? 1장과 2장을 읽자
- 리팩터링해야 할 곳을 찾고 싶다? 3장을 읽자
- 리팩터링을 실습하고 싶다면 1장부터 4장까지는 꼼꼼히 읽고, 나머지를 빠르게 훑자
우리가 리팩터링이 두렵고 쉽사리 도전하지 못하는 이유는 기능에 버그가 생기거나 장애로 이어질까봐하는 두려움일 것 이다. 그래서 리팩터링의 첫 단계는 반드시 리팩터링할 코드 영역을 꼼꼼하게 검사해줄 테스트 코드들 부터 작성해야 한다. 테스트 역할은 굉장히 중요하다. 리팩터링 기법들이 버그 발생 여지를 최소화하도록 구성됐다고는 하나 실제 작업은 사람이 수행하기 때문에 언제든 실수할 수 있다.
그렇기에 리팩터링하기 전에 제대로 된 테스트부터 마련한다. 테스트는 반드시 자가진단하도록 만들어야 한다.
특히 객체 지향 프로그래밍의 상징인 상속은 계륵과 같은 존재라서 설계부터도 고민해야 하지만 이미 너덜너덜 해진 코드를 잘 재조립하는 것이 포인트다. 메서드 올리기/내리기, 필드 올리기/내리기, 슈퍼클래스 추출하기, 서브클래스 제거하기 등에 대한 방법론을 다루고 있다.
이 책은 개발자된 지 얼마 되지 않았을 무렵, 책을 좋아하던 지라 이런저런 책을 다양하게 접하던 시절에 1판을 읽었던 기억이 있다. 그 당시에는 리팩터링의 개념을 제대로 알지도 못했을 뿐 아니라, 그 책을 읽어도 이것을 할 일이 있을까 싶은 생각에 크게 와 닿지는 못했지만, 그래도 개발의 실재적인 측면에서 다룬 책이었기에 꽤나 관심이 있었던 책이었다. 그러던 중 올해 들어 베타리딩이라는 것을 통해 리팩터링2판 출시에 대해 접하게 되었고, 세부적인 내용에 대해서 교정할 기회가 있었다. 그리고 그 이후 이 책이 출간되었고, 다행히 출간된 이후 한빛미디어에서 제공하는 기회로 다시 제대로 책을 읽을 수 있게 되었다.
리팩터링이라는 주제는 이제 개발자라고 이야기 할 수 있을 정도의 해가 지난 나에게는 필수와 같은 주제이며, 이것을 항상 어떻게 하는게 좋을 것인지를 고민하는 나에게 주는 사막의 오아시스와 같은 책이라고 생각이 든다. 이 책이 어떻게 나에게 있던 기존 지식을 잘 정리해 줄 것이며, 몰랐던 나의 지식을 어떻게 채워줄 것인지 기대하며 이 책을 읽었던 경험에 대해 나누고자 한다.
> 책에 대한 간단한 정보
이 책은 마틴 파울러가 지은 리팩터링의 2판이다. 당시에는 켄트 백과 마틴 파울러가 공동저자로 되어있었는데, 이번에는 마틴 파울러 혼자 저자로 되어있다. 그래도 베이스는 갖춰져 있어서 아무래도 나았을까. 현재 시점에 맞추어 나온 책이라는 기대를 갖게 만드는 제목이었다. 개발 기술은 1판이 나온 2002년과 18년이 흘렀으므로 강산이 두 번이나 바뀔만큼 대단히 많이 바뀌었으며, 그것을 기존 1판으로 소화하기 힘들다고 판단될만한 시점에서 이렇게 책이 나온것이라 기대를 품을만 하다고 생각하였다. 책 자체가 갖는 무게감 만큼, 책 표지디자인은 그에 맞게 되어있었다고 생각이 된다.
책 정보를 보면 초판1쇄발행일이 2012년 11월 9일로 되어있는데, 이 것은 어떤 날짜를 의미하는 것인지 정확하게는 모르겠다. 1판에는 자바를 대상 언어로 하여 책이 구성되어 있었는데, 2판에서는 (대세라 그런지) 자바스크립트를 대상으로 책을 작성하였다. 내 개인적인 입장에서는 살짝 아쉽지만, 언어가 그리 중요한건 아니니 큰 문제는 아니다.
> 첫 느낌 및 목차
목차에서는 정말 다양한 케이스에 대해서 담아서 정리했다는 느낌이 들었다. 특히 사전과 같은 느낌을 받았다. 필요할 때 찾아서 보아야 하는 사전과 같은 발췌독이 어울리는 책이다. 그렇다고 또 마냥 필요할 때만 접할수는 없는것이 한번은 꼭 읽은 뒤에야 내 머릿속에 어느정도 인덱싱이 이루어지기 때문에 필요할 때 생각이 날 수 있기 때문일 것이다.
챕터 안 세부 목록을 나열하는게 실제적으로 도움되는 목록이겠지만, 너무나 많아 챕터만 나열하면 다음과 같다.
CHAPTER 01. 리팩터링: 첫 번째 예시
CHAPTER 02. 리팩터링 원칙
CHAPTER 03. 코드에서 나는 악취
CHAPTER 04. 테스트 구축하기
CHAPTER 05. 리팩터링 카탈로그 보는 법
CHAPTER 06. 기본적인 리팩터링
CHAPTER 07. 캡슐화
CHAPTER 08. 기능 이동
CHAPTER 09. 데이터 조직화
CHAPTER 10. 조건부 로직 간소화
CHAPTER 11. API 리팩터링
CHAPTER 12. 상속 다루기
> 인상깊은 부분들
첫번째, 이 책을 시작하는 단계에서는 연극 공연료를 출력하는 메소드인 statement() 라는 하나의 메소드를 중심으로 리팩토링 해 나가는 절차를 예시로 보여준다. 겉보기에 별 문제가 없어보이는 코드이지만 이 코드를 더욱 변경이 용이하게 만들고, 이해가 쉽도록 만드는 절차가 되어간다. 전제조건으로는 테스트 코드를 만드는게 필수라고 이야기 하고 있다. 일단 하나를 맛보고 시작하는 데에서는 괜찮다고 여겨지기 때문에 직관적이었다.
두번 째, 예시가 지나간 뒤에는 바로 간단하지만 중요한 리팩터링 원칙에 대해 다룬다. 이론적인 부분이다. 응용이 아무리 중요하다지만, 이 중요한 응용 뒤에는 흔들리지 않는 원칙이 존재하는 것이다. 그러기 때문에 원칙을 언급할만한 타이밍에 원칙을 세움으로써 지금 가는 방향이 헷갈리지 않도록 돕고 있다고 생각한다.
세번째, 우리가 백화점에서 물건을 고를 때 카탈로그로 고르는 것처럼, 이 것도 마찬가지로 카탈로그라는 개념을 도입하였다. 우리가 해야할 리팩터링의 단계를 카탈로그로 나열했는데, 이 카탈로그를 보는 방법부터 차근히 알려준다. 사실 우리가 궁금했던 부분은 바로 이 부분일 것이다. '나에게 이미 많은 Legacy code가 존재하는데 이것을 어떻게 하란 말인가'에 대한 답이 된다고 생각한다.
덤으로 이것은 죽은 코드를 제거하는 것도 나와있어서 흥미롭다고 생각했다. 사실 10년전만 해도 죽은 코드는 잘 관리하는게 히스토리 관리상으로도 중요했다. 하지만, 현재는 VCS가 너무나도 잘 되어있고, 그래서 사실 죽은코드는 잘 쳐내는 것이 중요하다는 것을 알려주고 있다. 시대의 흐름에 따른 부분이라고도 할 수 있을 것이다. 좀 더 깔끔한 코드가 후에 유지보수를 잘 하도록 돕는다고 알려주고 있다.
> 괜찮은 부분
- 어려운 주제 책 구성이지만, 자연스러운 흐름을 담아서 보기가 쉬운 편이다.
- 현대에 필요한 프로그래밍 기법에 맞추어 리팩터링 방법을 소개하였다.
- 고급개발자로서 필요한 소양을 갖출 수 있도록 돕는 내용들이 사이사이에 많이 들어있다.
- 스테디한 책으로써 두고두고 보기 좋도록 되어있다.(단, 미리 한 번 읽고 인덱싱이 되어야 한다.)
- 발췌하여 찾아봐야 하는 책인만큼 옆에서 보았을 때 챕터의 변화가 눈에 보이도록 인쇄되어있다.(배려라 생각된다.)
> 아쉬운 부분
- 자바에서 자바스크립트로 된 부분이 이해는 되지만, 개발자에 따라 단점이 될 수도 있을 듯 하다.(순전히 개인적)
- 책이 중간중간 따라가서 다른 곳을 참고하도록 된 부분이 많은데(주석으로 된 표현) 그것을 따라가기가 쉽지 않다.
- 책이 굵은 글씨와 도표로 Hightlighting되어 있는 부분이 있으나, 시대의 흐름에 맞춰 적절한 컬러가 들어있었다면 좀 더 보기가 편했을 것 같다.
리팩터링이라... 참 오랜만에 들어본다... 1판이 대한민국이 월드컵으로 가장 뜨거웠던 한해로 기억되는 2002년에 나왔으니까 얼마만에 접해보는 단어였던가?
얼마 지나지 않아 내게도 이 책을 리뷰해볼 기회가 있어 재미나게 읽어봤다.
IT 현업 개발자로 이제 곧 20여년이 되어가는데, 오랜만에 이쪽 업계에 몸을 담을 시점에 나를 뜨겁게 했던 추억을 소환하게 된다.
이후 의도하진 않지만 막연하게 나도 모르게 몸에 체화되어 있는 방법...
1판을 재미있게 읽었다, 그리고 그 책이 아직 내 책장에 있다.
1판 대비 바뀐점?
일단 출판사가 바뀌었다... 그리고 책 표지가 1판은 양장이었는데... 이 부분이 살짝 아쉽네... 이 책은 한번 사서 보고 마는 책이 아니라 개념서, 지침서 같은 성격이라 틈틈히 두고두고 보는 책이라 이번에도 표지를 양장으로 했으면 어떨까 하는 살짝 아쉬운 마음 피력해본다.
그리고... 설명하는 개발 언어가 자바에서 자바스크립트로 바뀌었다.
두 언어가 엄밀히 말해서 다른 언어긴 하지만 이름에서 알 수 있듯 유사성이 0인 언어는 아니라서, 그리고 이 책을 볼 만한 현업 개발자라면 이정도 이해하고 접근하는데 꺼리낌이 없을꺼라서 크게 문제될 것 같지는 않다.
내용은 말해 뭐하리, 검증된 책이고 번역하신 분들도 쟁쟁하신 분들이라 내용에 대해서는 두말하면 입아프다.
1장에서 4장까지는 정독을 하는게 좋다, 리팩터링에 대한 정의, 하는 이유, 어디서부터 시작해야 하는지 등 개념적인 내용을 짚어주기 때문에 반드시 정독을 하고 내용을 이해한 다음 나머지 부분들은 그때그때 찾아보는게 유용하다.
각 리팩터링 기법들에 대해서는 도식이나 간단 코드로 어떤 내용인지 보여주고 배경부터 설명하는 구조로 되어 있다.
1판에서의 항목과 연결정보가 제시되고 있기 때문에 나 처럼 1판을 읽어 본 사람은 해당 내용이 어떻게 바뀌었는지 살펴 볼 수 있어 내용이해가 훨씬 빠르게 다가온다.
중급, 고급 개발자 또는 리더급 개발자로 올라서기 위해서는 개발할때 소프트웨어 공학적인 접근이 필요하다 그러한 지식을 쌓기에 좋은 지침서라 생각한다.
IT업계 20년 세월이면 고전에 속하는데 2판이 그 세월을 지나 다시 소환된다는 것은 이 시대에도 여전히 통용되고 필요한, 단순한 지식이 아닌 진리라 감히 단언에 본다.
오랜만에 좋은 책을 다시 봐서 좋고, 막 대학 졸업에서 혈기왕성할 때 열정을 가졌던 추억을 떠올릴 수 있어 행복한 시간이었다.
※ 본 리뷰는 IT 현업개발자로서 한빛미디어 리뷰어로 출판사로부터 제공받아 읽고 작성한 글입니다.
리뷰에 앞서 본 리뷰는 한빛 출판 네트워크에서 진행한 ‘나는 리뷰어다’ 이벤트에서 제공받은 책으로 진행한 것을 밝힙니다.
경험상, 프로그램을 작성할 때, 느긋하게 충분한 일정을 가지고, 여러가지 고려해야 할 것들을 다 고려하면서 프로그램을 작성하는 경우는 사실 많지 않았다. 개발 일정을 영업과 기획 부서에서 사업자에 맞는 상품에 맞는 제품 기획 및 일정을 수립하게 되고, 여기에 개발 부서에서 여러 가지 논의를 통해, 언제까지 설계를 하고 코딩을 하며, 블럭테스트, 통합 테스트 및 검증 테스트 그리고 사업자와의 테스트 등등 일정이 세워지고 나면 그 일정에 맞춰 개발을 하게 된다. 하지만 사업자는 이런 저런 이유로 추가적인 기능 요구를 하게 되고, 최대한 사업자 요청 기능을 현재 개발 일정 안에 추가해야 하며, 사업자는 또 사업 일정상 전체 일정에서 1~2개월을 당겨달라는 요구를 하는 경우가 심심하게 발생한다.
프로그램 작성하는 사람은 한정되어 있고, 일정안에 이런 기능 저런 기능을 다 구현하다 보면, 처음에는 코드를 잘 설계해서 중복 코드도 없고, 클래스, 메쏘드, 함수 이름도 보고 이해하기 쉽게 작성을 하려고 꼼꼼히 챙기려 노력하지만, 일정 마감이 가까워지면 그게 마음대로 잘 되지 않는다. 특히 일정에 쫓겨 기능 시험을 하면서 디버깅으로 넣는 코드의 경우는 더욱 더 그러하다.
물론 사람마다의 차이가 있겠지만, 짧은 일정안에 프로그램을 개발해 본 사람들은 공감하는 이야기일 것이라 생각된다. 개인적인 생각일 수는 있겠지만, 그러한 상황에 자주 놓이는 프로그래머에게 이 책은 더욱 더 필요한 책이 아닐까 하는 생각이 든다. 책에서 제시하는 여러가지 패턴을 어떻게 사용할 지 반복해 고민하고 체득함으로써, 빠른 시간 안에 코드를 설계/작성해야할 때 좀 더 좋은 코드를 작성할 수 있도록 말이다.
보통 어떠한 방법론과 같은 책이나, 어떤 이론을 설명해야 하는 책의 경우, 아무래도 좀 따분하고 지루한 면이 있다. 하지만 이 책은 리팩터링 과정을 하나 하나 단계별로 어떻게 리팩터링을 해 나가는 지 예제를 가지고 설명을 하고, 어떤 부분을 어떻게 바꾸는 것이 좋은 지, 상세하게 설명을 하고 있어 전혀 지루한 감이 없다. 처음 저자가 리팩터링을 하는 과정을 따라가다보면, 어느새 이해하기 쉽고, 수정하기 쉬운 코드로 바뀌어 있는 것을 볼 수 있다. 마치 나도 이렇게만 하면 금방 리팩터링을 잘 할 수 있을 것 같은 생각이 들 정도로 말이다.
이 책은 처음부터 끝까지 기능을 하나씩 하나씩 나누어가며 이건 이렇고 저건 이렇고 저건 이렇고 하며 상세하게 설명하는 방식으로 설명하고 있지는 않다. 어떤 방식으로 리팩터링을 하는 지 설명하는 부분과 저자의 경험상 많이 사용하게 되는 패턴을 모아 둔 카탈로그 부분으로 구성이 되어있다. 독자가 내용을 읽어나가며, 이럴 때는 이런 패턴을 적용하고, 이럴 때는 저런 패턴을 적용하여 리팩터링을 해 나가면, 이러한 결과가 나올 수 있다는 것을 약 160페이지(챕터1~4)에 걸쳐 설명을 하고, 각 패턴들은 카탈로그 형태로 찾아볼 수 있도록 나머지에 주제별로 묶어 두었다. 물론 이런 구성이 매번 일일이 패턴을 찾아보는 것이 불편할 수도 있지만, 익숙한 부분은 그냥 넘어가고 필요한 부분만 이해가 안될 때 반복적으로 찾아볼 수 있도록 배려한 것이라는 생각이 들었다. 또 패턴들에 대해 왜 해야하는 지 이유와 어떤 식으로 하면 된다는 간단한 예를 모아둘 수도 있으나, 저자는 각 패턴을 적용할 때, 어떤 절차를 거쳐서 어떻게 적용하면 되는지 설명을 하며, 예제에서 절차별로 어떻게 코드가 바뀌는 지 상세히 설명을 해 두었다. 이러한 구성 덕에, 이 책은 단순히 책을 한 두번 읽고 마는 것이 아닌, 코드를 작성하면서 reference로 언제든 찾아볼 때 유용하게 사용될 수 있다.
저자가 영미권 사람이라 예제 코드나 설명에서 국내 독자들에게 익숙치 않은 표현을 써 둔 부분들이 있는 데, 역자분들이 이 부분에 대해 추가적인 설명 및 유튜브 등에서 찾아 볼 수 있는 링크도 함께 역주로 설명해 주고 있는 부분도 이 책의 장점이라 생각된다.
혹여 이 책에 사용된 예제가 javascript라서 이 책을 이해하는데 어려움이 있지 않을까 생각하는 사람도 있을 수 있다. 하지만, 요즘 자주 사용되는 언어 중 하나라도 익숙한 사람이라면 누구나 이해하는데 문제가 없을 것이라 생각한다.
이 책에 나오는 내용은 한번 보고 이해하는 것으로도 도움이 되기는 하지만, 어떤 패턴을 어떻게 적용할 지 이 책을 참고하면서 많이 고민해가면서 패턴들을 체득해야 더 큰 도움이 될 것이라 생각이 된다. 만약 단계별로 하나씩 따라하는 형태의 책을 원한다면 이 책은 그런 독자가 원하는 책이 아닐 수 있다.
원래 리팩터링 1판을 읽고 싶어서 회사에 책을 요청한 적이 있었다. 그런데 책이 절판되어 더 이상 읽을 수 없었는데 드디어 2판이 출간되면서 얼른 이 책을 읽어보게 되었다.
저자인 마틴 파울러 의 경우 클린코드, 클린아키텍처 등 프로그래밍 지식에 대한 여러 책을 출간했고 그 책들 하나하나가 정말 주옥같은 책들이기 때문에 이 책도 많은 기대를 했었다. 역시 그 기대에 맞게 책 내용이 정말 마음에 들었다.
개인적으로 가장 인상깊었던 부분은 리펙터링에 대한 정의에 대해서 설명해줄 때였다. “코드 베이스를 정리하거나 구조를 바꾼느 모든 작업은 재구성이라 의미하며, 리팩터링은 재구성 중 특수한 한 형태다” 라는 말과 함께 리펙터링을 함에 있어서는 테스트코드가 깨지지 않게 하라는 것이다. 이 부분을 보았을때 내가 하던 작업은 사실 리펙터링이 아니라 재구성 작업이었다는 사실을 깨닫게 되었다.
이 책은 1판과는 다르게 자바스크립트 를 이용해서 리팩터링을 진행한다고 한다. 자바 개발자에게는 조금 아쉬운 부분일 수도 있겠지만 개인적으로 자바스크립트를 더 많이 쓰는 작성자의 경우 더 마음에 들었던 부분이었다. 물론, 어려운 자바스크립트 문법을 사용하지는 않으니 책을 읽는 데 있어 문제는 없을 것으로 생각한다.
즉, 책에서는 재구성이 아니라 리펙터링 하는 방법에 대해서 알려주고 있다. 하나의 함수를 바꾸더라도 그냥 바꾸는 것이 아니라 단계별로 어떻게 해야 프로그램이 안깨지는지를 설명하면서 바꿔준다. 다시 말하자면, 리펙터링 중간에 프로그램을 실행시켜도 에러가 발생하지 않고 프로그램이 실행되는 방법에 대해서 알려준다.
물론, 이런 방식으로 계속 리팩터리을 하게 되면 이전에 했던 단순히 재구성을 하는 방법보다 시간이 더 오래 걸릴 수도 있다. 예를 들어, 함수 이름을 변경하는데 하나하나 프로세스를 밟아야 한다는 것은 조금 번거로울 수 있는 작업일 수 있기 때문이다. 그렇지만 리팩터링 절차를 거치지 않고 재구성을 하게 된다면 나중에 에러가 발생할 확률이 더 늘어날 테니 어떻게 보면 나중을 위해서는 필수적인 절차가 아닐까 싶기도 하다.
책은 위 사진에서 보듯이 리팩터링 기법에 대해서 설명해준다. 그러면서 각각의 배경과 절차에 대해서 알려주고 간단한 기법은 예시 없이 넘어가기도 한다. 하지만 조금 어렵거나 복잡한 기법들은 아래 사진처럼 여러 예시들을 들어가며 단계 단계별로 리팩터링 하는 방식에 대해서 설명해준다.
1장에서는 전체적으로 어떻게 리팩터링을 해야 하는지 알려준다. 그 후 2장에서는 리팩터링이 무엇인지에 대한 개념에 대해서 설명한다. 3장에서는 왜 리팩터링을 해야 하는지 이유에 대해서 알려주며 4장에서는 리팩터링하는데 필수적인 테스트 코드를 만드는 방법에 대해서 설명해준다. 5장은 리팩터링 기법에 대해서 설명하기 전에 어떻게 앞으로 읽어야 하는지 알려준다.
그 후 6장 부터 리팩터링 기법에 대한 설명이 시작된다. 처음 기본적인 리팩터링 기법에 대한 설명으로 시작해서 캡슐화, 기능 이동, API 리팩터링 방법 등 정말 많은 리팩터링 기법에 대해서 설명하고 있다.
물론 이론 책의 특성상 따라 치면서 보기는 애매한 부분들이 많다. 그보다는 실제로 자신이 리팩터링 할 때의 레퍼런스로 참고해서 보면 어떻까 싶다.
작성자의 경우 최근에 서비스를 오픈했기 때문에 이제 개발했던 코드의 악취를 리팩터링을 해서 개선해야 하는 시기가 왔다. 그래서 그런지 이 책이 더 와닿았던 건 사실이다. 물론 그렇지 않은 개발자들도 이 책을 보게 되면 앞으로 어떻게 리팩터링 해야 겠구나 하는 생각이 들 것 같다.
알고 안쓰는 것과 모르고 안쓰는 것은 다르기 때문에 개인적으로는 이 책을 전국에 있는 모든 개발자가 한번쯤 읽어야 하는 필독서 중 하나가 아닐까 싶다.
마틴파울러 리팩토링의 20년(!) 만의 개정판이다. 그동안 프로그래머에게 필독서중 한가지로 꼽혀온 베스트셀러이다보니, 나의 평가가 필요한가 싶다… 그래도, 기존 1판과 상당히 다른 느낌이어서 이를 위주로 살펴 보려고한다.
가장 먼저 눈에 띄는 것은 제목이 “리팩토링”에서 “리팩터링”으로 변경되었다는 것이다. ㅎㅎ 신판으로 개정되면서 바뀐 가장 큰 점은 코드가 자바스크립트로 되어있다는 점이다. 원낙 오랫동안 C 스타일에 길들여저 있다보니 괄호 중첩이 난무하는 자바스크립트 형식을 선호하진 않는다. 하지만, 읽다 보니 자바스크립트의 단순한 문법이 오히려 핵심적인 내용을 더 잘 보이게 하는 것 같다. 저자의 말처럼 이 책은 언어에 상관없이, 모든 프로그래머를 위한 책이였다.
저자는 큰 틀에서의 변경은 없고 사소한 변경(정말?)과 17가지 새로운 리팩토링 기법을 추가했다고 한다…
Changes in the Second Edition The changes are both very minor and all-encompassing. They are minor because the basic structure of the book hasn’t changed. I begin with an opening example, a chapter of principles, a survey of “code smells”, and an introduction to testing. The bulk of the book is a catalog of refactorings and of those 68 refactorings, all but 10 are still present, and I’ve added 17 new ones. The Second Edition of “Refactoring”
한빛미디어의 구판과 비교해보면 번역이 좀 자연스럽게 느껴졌다. 유명한 역자분이 어서 일수도 있고, 국내에서 일반화 된 단어들이 많아져서 일수도 있겠다.
원문
1판
2판
Pull Up Field
필드 상향
필드 올리기
Pull Up Method
메서드 상향
메서드 올리기
Pull Up Constructor Body
생성자 내용 상향
생성자 본문 올리기
Push Down Method
메서드 하향
메서드 내리기
Push Down Field
필드 하향
필드 내리기
용어 변경 확인 위해 3장의 목차를 비교해 보았다.
그리고 기존에는 UML로 표시한 리팩토링의 개념을 아이콘처러 표시한것이 뭔가 훨씬 보기 좋았다.
이미 많이 회자 된 내용이고 넓리 전파된 책이지만 신판을 구매해서 다시 볼 가치가 있다고 생각한다.
다만… 아쉬운 점은…
어쩌다보디 3가지 버전의 “리팩터링”을 가지게 되었다. 1판의 경우 지금은 사라진 것으로 보이는 “대청미디어”의 버전과 “한빛미디어”의 버전이 있는데 개인적으로 구판(대청미디어판)을 선호 했다. 몇 가지 이유가 있는데, 대청판은 양장이다…ㅎㅎ… 프로그래머 생활을 하면서 듣게 되는 몇 개의 책들이 있다. 흔히 이야기하는 “필독”, “소장용”책인데, 이 리팩터링 역시 그 중 하나이다. 개발자로 살아가야 한다면 꼭 가지고 있어야 한다고 생각하는데, 이런 소장가치가 있는 책들은 기왕이면 양장본이었으면 한다. 우리나라 개발자의 대부분(!)은 지하철을 애용하리라 생각한다. 책을 계속 집의 책상에서만 본다면 상관없을수도 있으나, 가방에 넣고 출퇴근 등 이동 시간동안 보는 경우도 많을 텐데 그러면 책이 상한다…
양장을 하게 되면 더 무거워지고, 그러면 더 들고 다니기 힘들지 않나… 하지만, 이책은 원래 무겁다… 사실 별거 아닐수도 있지만, 개정판의 원서도 양장인것을 생각하면 더더욱 아쉽다…
한빛미디어 출판사의 "리팩터링 2판(마틴 파울러 저/개앞맵시, 남기혁 역)"을 읽고 작성한 리뷰입니다.
개정판을 소개하기 앞서 약 20년전의 초판에 대해 잠깐 설명하려 한다. 2000년 초반 학부시절 어렵사리 초판을 원서로 구했다. 미학과는 거리가 멀어보이는 딱딱해보이는 S/W 아키텍처 설계에 예술같은 개념이 숨어있다는 것에 적잖이 놀랐고, 그동안 등한시 했던 철학에 대한 새로운 시각이 정립된 것은 신선한 충격이었다.
되지도 않는 영어와 씨름하며 열심히 읽었던 덕분에 당시 국내에는 생소했던 OOP의 다형성 및 상속구조에 대한 개념을 동년배들에 비해 빠르게 다질 수 있어 이후의 프로그래밍 실무가 정말 편했다.
세월이 흘러 Spring 프레임워크가 등장했을 때에도 저자 마틴 파울러의 철학이 이미 녹아있었던 덕분인지 DI 및 IoC와 같은 커다란 변화도 쉽게 이해할 수 있었다.
뿐만이랴. 리팩토링 자체에 대한 실무는 물론 테스트 코드 작성, 디자인 패턴 등 대부분의 OOP 프로그래밍에 있어 개념적으로 헤매인 기억은 없는 듯 하다.
이렇게 초판을 구구절절 칭찬하는 이유는 이제 중견의 나이에 접어든 한 독자가 20년에 걸친 산 증인으로 본 도서가 개발에 얼마나 많은 도움을 주었는지 언급하는 것이 후배 프로그래머들에게 제일 도움이 되리라는 판단에서다.
초판의 장점은 2판에 있어서도 역시 유효하다. 초판을 읽고 나름 실무의 내공이 쌓인 덕인지 2판은 정말 쉽게 술술 읽혔다. 대부분의 프로그래머라면 자질구레한 이론보다는 먼저 코드로 설명하길 원할 것이다.
마틴 파울러는 1장부터 이론적 설명 보다는 아래 그림과 같은 예제 코드를 제시하고 직접 리팩토링이 무엇인지 느낄 수 있도록 바로 실습부터 진행한다.
본 리뷰도 이를 본받아 실무에서 이 책을 읽는 사용하는 방법부터 설명하고자 한다.
먼저 <부록B>부터 보자. 내가 맡은 프로그램에 이런 유형의 악취가 풍기면 해당절을 읽으면 된다.
첫번째 제시된 해결기법인(빨간색 네모 안)의 변수 캡슐화하기를 보면 6.6절을 참고하라고 안내되어있다. 해당절로 이동하면 직관적인 그림 하나가 눈에 들어온다.
해당 유형의 리팩토링을 한 3번 정도 해보면 나중엔 그림만 봐도 실무에서 어떤 기법으로 리팩토링할지 바로 감이 잡힌다. 잘 기억이 안나면 그 밑의 아주 간단한 코드의 변화를 보면 거의 99% 바로 이해된다.
만약 악취의 유형 자체가 이해가 가지 않는다면 3장(코드에서 나는 악취)로 넘어가 가변데이터 부분을 읽으면 이해가 된다.
다시 돌아와 책을 읽는 방법을 설명하고자 한다.
1장은 제일 먼저 반드시 읽어야 하는 부분이고 아마 경력 1년정도 제대로 프로그래밍을 경험하신 분이라면 재미있게 2시간 정도면 읽을 수 있을거라 본다. 실무에서 가장 자주 사용하는 리팩토링 기법들로 구성되어 있는데 간단히 설명하면 다음과 같다.
반복문쪼개기 + 문장슬라이드 + 함수추출 + 변수인라인
중첩함수 난무 제거 : 중간데이터 클래스 활용
다형성 적용 : .js 특성을 고려해 factory 패턴 활용
2장에는 리팩토링을 적용 시 실무에서 고려할 사항 등 관련된 이론 전부가 짧은 페이지안에 다 녹아있다. 이론이 이렇게 짧은 책은 정말 처음본다. 그런데 필요한 내용은 다 들어있다.
예를 들면 아래 그림은 브랜치에 관한 설명이다. 개인적으로 GitHub 사용하며 봉착했던 문제와 해결책이 이 반쪽에 전반적으로 다 들어있다. 이를 통해 결론적으로 리팩토링을 효율적으로 사용하기 위해 CI + TDD 개발방식을 추천한다는 내용이다.
3장은 위에서 언급했다. 악취의 유형과 맡는 방법에 대한 설명인데 이게 무슨 말이냐? 리팩토링은 언제해야 하는지에 대한 가이드라고 보면 된다.
4장은 솔직히 감동이었다. 테스트 코드 작성의 중요성은 굳이 강조하지 않겠다. 2장에서 중요성을 언급했던 것에 대한 책임감인지 테스트 구축 방법을 안내한다.
5장은 겨우 2페이지이므로 가볍게 읽으시면 된다.
6장 ~ 12장이 본 게임인데 양이 많다고 기죽지 마시길. 괜히 처음부터 읽느라 기운뺄 필요는 없다. 실무에서 필요성이 감지되면 위에서 안내한 이 책을 읽는 사용하는 방법대로 진행하시면 된다.
굳이 너무 읽고싶어 못참겠다면 먼저 그림과 코드 정도만 빠르게 읽어 머리속에 메타지도를 완성하시면 실무에 도움이 될 수 있을듯 하다.
책의 장점은 20년동안 필자를 비롯한 산증인(?)들에 의해 검증이 되었다고 요약하며 끝내고 싶지만, 읽지 않았던 분들을 위해 개인적으로 인상깊었던 부분을 간단히 짚고 넘어가겠다.
리팩토링 기법도 중요하지만 사실 제일 좋은 방법은 리팩토링이 생길 여지를 주지 않는 것이다. 즉, 설계적 안목이 굉장히 중요한데 그 어떤 서적보다 빠르게 정립할 수 있다.
(예 75p 中) “서브클래스를 언제 사용하면 좋은지 감이 잡힐 것이다.”
프로그램 개발 시 완성 속도는 빠를지 몰라도 거지같이 만들어서 유지보수를 힘겹게 만드는 현상을 두고 흔히들 기술적 부채(Technical debt)라고 한다.
특히, 한국의 거지같은 SI 문화가 이를 지향하는데 쉽게 말해 10명이 개발해야 하는 것을 1명이 개발하는 오너의 마법이다. 파는 사람 입장에서야 단가 후려치기에 있어 최고 스킬이겠지만, 사는 사람 입장에서는 1명이 유지보수 할 수 있는 것 10명 인건비 주며 유지보수 해야하는 셈이다.
이 책을 읽으면 이 기술적 부채(Technical debt)가 거의 쌓이지 않는다.
속도에 대한 개념이 하나 추가된다.
(컴퓨터의) 연산속도 + (사람의) 개발 속도
1분만에 돌아가는 100시간동안 만든 프로그램 vs 10분만에 돌아가는 10시간만에 만든 프로그램
철학에 대한 개념 재정립.
멀리있지 않다는 것, 정말 중요하다는 것을 일깨워 준다. (본 도서에 철학이라는 단어는 거의 등장하지 않음에도)
기타의견
번역의 품질이 아주 우수하다.
20년만의 개정판은 많은 의미를 내포한다.
20년 동안 쓸만했다는 것과, 20년 동안 많은 이들이 읽었다는 것(유용했다는 것), 그리고 개정판을 원하는 이가 많았다는 것 등..
실습예제가 .java에서 .js로 변경되었다.
async 및 await, promise 등의 js에 특화된 내용은 다루지 않는다. (프로그램 일반화에 초점을 맞추고 js에 초점을 맞추진 않는다.)
단, 구현 특성 상 덕타이핑, 최상위 클래스 제약 등은 사전에 알면 도움이 된다.
마치며 구구절절한 말은 필요없다. 프로그래머라면, 예비 프로그래머라면, 프로그램 만들고 싶다면, 관심있다면 반드시 읽어라.
개발자라면 누구나 레거시 코드를 마주할 수 밖에 없고 누구나 리팩터링을 한다고는 하지만, 정말로 ‘리팩터링을 잘하는 개발자’는 흔치 않습니다. 그 이유는 보통 두가지 인데, 1. 리팩토링으로 인한 버그, 2. 주관적인 관점에서의 코드 개선 라고 볼 수 있습니다. 레거시 코드에 대해서 개발자들 사이에서는 흔히들 “원래 남이 짠 코드는 나빠 보이는 법이야”, 라던가 “괜히 긁어 부스럼 만들지 말고 레거시 코드는 나둬”와 같은 이야기를 하곤 합니다. 저자 마틴 파울러는 이렇게 검증되지 않고 주관적인 의미에서의 리팩토링이 아닌 “취향을 넘어서는 관점이 분명한 리팩토링” 을 이야기 합니다. “코드를 ‘수정하기 쉬운 정도’야 말로 좋은 코드를 가늠하는 확실한 방법”이라는 확실한 기준을 가지고 검증된 코드로 리팩토링 하는 과정과 기법들을 스텝 바이 스텝으로 배울 수 있습니다.
한빛 미디어의 나는 리뷰어다에서 4월달 미션으로 나온 책 중에 하나인 리팩토링 2판을 받게 됐고, 이번 달에 읽어보게 됐다. 이 글은 이 책에 대한 간단한 리뷰이다.
이 책은 자바스크립트로 작성된 리팩터링에 관한 책이다. 1판은 읽어보진 않았지만, JS, TS로 개발을 주로 하는 입장에서 이런 컴퓨터 공학적 서적을 JS 코드로 작성된 예시로 접할 수 있다는 건 정말 흔치 않은 기회이기도 해서 정말 재밌고 좋았다. 책도 더 잘 읽혔고 적용도 쉽게 떠올릴 수 있었다. 모든 장을 읽어보지는 않았지만, 좋은 전개와 예시를 들어주고 있다. 처음부터 5장까지는 책의 서문과 같은 역할을 하고 앞으로 리팩터링이 어떻게 진행될 것인지, 어떤 내용들이 나오는지, 어떻게 이후 본문을 읽어야 하는지 등에 대해서 알려주는 장이다. (1 - 6장 정도 분량이 서문이니까, 조금 긴 편이다.) 서문은 예시로 이루어져있어서 흥미를 끌만 하고 재밌게 읽었다. 이후 내용들은 리팩터링의 기법에 대해서 자세하게 나오게 되는데 정말 흔하게 쓰이는 기법부터 아하 모먼트가 있는 부분도 존재한다. 책의 난이도는 어렵지 않고, 코드를 어느 정도 작성해본 적이 있다면, 자신도 모르게 자주 사용하던 기법을 이름과 체계적인 방법으로 기술해준 내용을 많이 볼 수 있다.
전체적으로 흥미로운 리팩터링에 대해 공부할 수 있었다. 이전 달의 책보다 훨씬 만족스러운 책.