큰 문제라고 생각지 않은 것들이 일관적이 못한 의미를 갖지 못해서  문제가 생기는 경우가 있다.

처음에 문제가 발생을 한 것을 가지고, 변경을 가하는 것은 나의 생각한 것보다 많은 비용이 들수 있기때문에 큰 문제가 없으면 피해가거나 그 문제를 위해서 몇 가지를 추가적으로 작업을 한다.

주의할 것은 꼭 코드가 적다고 변경할 부분을 적게 가져간다고 좋은 해결 방법은 아니라는 것이다. 원칙만 따져서 무리하게 하는 것도 문제지만, 의도를 무시한채 변경시 수정만 적게 하려고 하고, 코드량만 적게 하다가 보면, 다른 문제들이 생겨서 생각지 못한 비용이 더 발생을 할수가 있다.

우리는 이것을 속된 말로 꽁수 또는 일시적인 땜빵이라고 한다. 이런 것들은 시간이 지나면 자신도 의도를 잊어 버릴뿐만 아니라, 타인이 보면 이해할수 없는 것들을 만들어 낸다.

"계속해, 지름길로 가라구, 네 시간을 절약해 줄거야, 정말이야. 아무도 모를 거구, 넌 이 일을 끝내고 빨리 다음으로 옮겨갈 수 있어, 그게 전부야" - 애자일 프랙티스 P.27


땜빵으로 구현한 코드의 장소에서 2번,3번 발생하면 그 시점에서는 올바르게 변경을 가할때가 온것이다.코드를 이해하는 비용이 많이 들고, 오해의 소지가 있는 부분은 발생을 할때 수정(refactoring)을 하자.

만약에 만약에 정말 꽁수를 쓸수 밖에 없는 상황이면 다른 곳에 제약을 만들지 말아야 하며, 문서화 및 주석을 잘 달아두자.

모델1의 구조를 가지고 있는 코드를 모델2의 구조로 변경을 하면서 리팩토링을 하는 것은 지루하면서 힘든 일이다.

그리고, 테스트를 하기 어려운 SP는 로직이 들어가 있는 부분을 자바코드로 끄집어 내는 것은 노가다성 일이 강하다.

하나씩 지워가면서 의미를 코드로 옮기는 것이다.

이 부분은 테스트를 만들기가 너무 어렵거나 불가능하다.

나는 지금 일단 테스트가 가능한 구조로 변경을 하고 있다. 거의 재개발에 가까운 작업이다. 이 과정에서는 기계적인 도움을 받기가 어렵기때문에 주의를 기울일 수 밖에 없다. 그래서 더 피곤한 작업이 된다.

지금 내가 하는 작업은 refactoring일까? 재개발일까?

<2007년 11월 23일 오전에 추가>

"성글다"의 사전적인 의미
http://krdic.naver.com/search.nhn?query_euckr=%BC%BA%B1%DB%B4%D9

EP님의 의견으로 성글은 테스트가 있다면 refactoring이 맞다는 이야기를 했습니다.

좋은 이야기라고 생각이 들어서 사족을 달아서 업데이트를 합니다.
하나의 테스트만 있어도 refactoring이 되는 것이겠죠. 반드시 코드가 아니더라도 대략 바꿀려는 코드의 기능을 실행할 수 있는 방법이 존재를 한다면 refactoring이 되겠습니다.

물론, 성글은 테스트보다는 커버리지가 높은 테스트들이 버그가 생길 확률을 줄여줄수 있겠죠 
꽤 오랫동안 이 책에 대해서 블로그에 글을 다수 올린거 같다.
뜻모를 이야기들도 올린 경우도 많았고, 좀더 보기 좋게 정리해서 올린 경우도 있었다.

Working Effectively with LEGACY CODE도 간단하게 정리를 해보자.

- depedency가 많은 코드는 유지보수가 어렵고, 테스트를 하기가 힘들다. 그것을 break해주자.

- 테스트가 되지 않은 코드를 좋지 않은 코드이다. 테스트를 할수 있게 코드를 변경을 하자.

- 극단적인 캡슐화로 인해서 테스트가 되지 않는다면, 조금 expose를 하고 테스트가 가능하게 만들자. 테스트로 사용하는 code와 production code는 같아야 한다.

- 전역으로 사용하는 것은 가능한 없애고, 만약 사용해서 한다면, 협소하게(?) 이용하자. 사용하는 클래스에다가 setter를 만들어주자

- 코드상에서 new를 가능한 제거를 하면, 테스트와 유지보수하기가 편해진다.

- 편한 것보다 명시적인 것이 더 좋다.

- legacy code는 조심히 주의를 해서 건드려야 한다. 테스트 코드를 가능한 만들고, 툴을 잘 활용하자.


많은 이야기들이 나오지만 대부분 위의 것들을 지키기 위한 저자의 테크닉을 소개를 하는 책입니다. 개인적으로 이 책은 밀린 책들을 읽고나면 몇번 더 읽어야 할 책으로 선정이 되었다.

책에 나온 기술과 유사하지만, 나름대로 실무에 적용한 내용을 정리해서 차후에 블로그에 올리도록 하겠다.
이클립스 리팩토링 기능 중에 Change Method Signature라는 기능이 있다.
일반적으로 잘 안 쓰는 기능 중에 하나이지만, 이 기능의 효용성을 느끼면 좀더 자주 사용하게 될 것이다.

인터페이스를 정의를 하고 구현에 들어가면, signature가 가급적 변하지 않게 잘 만들어야겠지만, 사실 초창기 코드를 작성할 때 signature가 바뀌는 것은 다반사이다. 특히 다형성을 구현한 코드들은 하나의 인터페이스에 여러 구현체가 존재를 할때 더욱더 유용하다.

과거에 적은 코드량에서는 잘되는 것을 보고, 좀더 많은 코드에서 리팩터링을 해봤는데, 강추다!!

특히 인터페이스를 많이 생성을 하거나 키값을 변경해야 할 때 사용하면 큰 재미를 볼수가 있다.
signature를 변경하고 싶었는데, 망설였던 분들 과감하게(?) 시작해보자.

User inserted image



네이버 블로그가 많은 분들이 관심을 가지고 있는 서비스이고, 아래와 같이 친절하게 좋은 방법도 가르켜주는 분들이 있다.

혹시라도 N사 블로그 관련자가 볼지 몰라서..
http://blog.naver.com/ifsnow/130013168334


혹시라도 N사 블로그 관련자가 볼지 몰라서 2..
http://blog.naver.com/ifsnow/130013258864

내용을 보다가 보면 맞는 얘기도 있고, 틀린 이야기도 있다.  

누구나 개발자라면 그렇게 생각을 하겠지만, 아름다운 코드를 만들어 내고, 내가 지나간 자리는 좀 깔끔한 코드가 남아있으면 좋겠다는 생각을 다시 한번 해본다.

블로그 시즌2가 지난해부터 시작해서 여러가지 기능도 바뀌고 추가가 되는데, 진정한 시즌2의 코드를 위해서 좀더 노력을 해야겠다.

refactoring vs 블로그시즌2
두 마리의 토끼이거나, 또는 같은 맥락으로 보일수도 있다.

2007년을 시작하는 지금 올해가 가기전에는 많은 부분에서 결실을 이룰것이다.



A test is not a unit test
  • It talk to a database.
  • It communicates across a network.
  • It touches the file system.
  • You have to do special things to your environment.


Unit Test와 Higher-Level Tesing하고 구분을 하자.

refactoring의 시작은 Great한 TestCase를 만드는 것부터...

TestCase부터 refactoring을 해야겠다...-.-


Working Effectively With Legacy Code

Michael Feathers / Prentice Hall





팀전배후 새로 맡은 프로젝트중의 하나는 소스 refactoring을 하는 업무가 있었다.

집중도가 많이 필요한 일이었는데, 여러가지 사정과 많은 사람들과의 커뮤니케이션 문제로 내가 예상한것보다 집중도가 많이 떨어졌다.

새로 개발을 한 나의 자식같은 코드를 실서비스에 올리고 오픈한다는 것은 매우 자극적인 일중에 하나이다.

하지만, 남이 만들어둔 코드를 다시 refactoring을 해서 올린다는 것은 밑져야 본전이 장사중에 하나이다.

항상 바라는 것은 아무 문제없이 잘 돌아가길 바랄뿐이지만, 사람이 하는 일이 항상 그렇듯이 기계처럼 정확할 수는 없다. 그래서, 버그가 발생하기 마련인데 그 버그의 양이 최소한으로 하는 것이 아주 중요하다.

오픈후 일주일이 가장 중요한 시점중의 하나이다. 최소 일주일정도는 웬만한 문제점은 다 나오기때문이다.

이번 프로젝트 오픈후 하루하루 나오는 버그들을 보고, 해결을 해나가면서, 내가 너무 도메인 영역을 몰랐다는 생각을 하게 되었다.

일단, refactoring을 하는데 있어서 가장 중요한 것은 domain expert와 유기적인 커뮤니케이션이다. domain expert가 없다면, 내가 하는 시스템을 많이 써봐서 나 자신이 domain expert수준에 이른 다음에 개비를 시작해야 한다.

물론 domai expert없이 작업을 해야하는 후자가 더 risk가 클 것이다. 하지만, 남이 만든 코드를 가지고 다른 패러다임으로 새롭게 재구성을 하는 것 자체가 risk인데, 그 시스템을 정확하게 모르면 risk가 더 커질수밖에 없다.

난 domain expert도 없었고, 충분히 업무분석을 하지 못했고, 시스템을 잘 알지 못했다.
--> 정말 내가 다 잘못한 것들!! 최소한 시스템의 경우의 수만큼은 사용을 해봐야 했다.

정말 high risk를 가지고 작업을 한 것이다. 고통스러운 버그리포트들을 보면서 domain영역에 대해서 이해가 가기 시작했다. 조금 늦었지만, 이런 계기를 바탕으로 성숙할 수 있는게 아닐까 생각한다.

다시 처음 얘기했던 refactoring은 밑져야 본전이라는 얘기를 다시 한번 생각을 해보자.
지금 현재는 버그때문에 여러가지 손해(?)를 보지만, 이 손해에 대한 투자만큼 얻은 것도 많다고 생각이 든다. 물론, 버그들은 최단시간내에 해결이 되어야만 손해를 최소화할수가 있다.

난 refatoring과 QA, 오픈후 버그리포트를 통해서 좀더 빠르게 업무를 이해할수 있게되었다. 이 부분은 장기적으로 생각을 할때 큰 재산이 될것이다. 아마 다음번에 할때는 더 성숙하고 안정적으로 갈수 있는 터전을 마련한 셈이다. refactoring의 시작점인 만큼 앞으로 진행될 여러가지 부분에서 이번에 얻은 도메인 영역의 지식을 바탕으로 더 나은 어플리케이션을 만들수 있다면, 손해보다도 더 많은 이익을 얻을수 있게 될 것이다.

이 버그들을 통해서 내가 느끼는 수모(?)는 앞으로 좀더 정교한 업무를 가능하게 할 것이다.
여러모로 이번 refactoring프로젝트는 나에게 많은 깨달음과 영감, 그 밖의 여러 지식들을 일깨워주는 계기가 되었다. 이런 것이 경험이라는 소중한 배움이다.




 테스트 코드를 만들고, 파란불을 보면서 코드를 붙이기도 하고, 제거하기도 한다. 어떠한 시점이 지나면 그 속에서 중복이 발생하게 되고, 여러가지 hint나 패턴을 적용을 해서 중복을 제거해 나간다. 물론, 빠른 시간 안에 이것을 해내는 사람이 진정한 실력을 갖춘 개발자라고 할수 있다.

설계를 잘해서 모델링을 한후 코드로 옮기면, 바로 만족한 개발을 끝내는 사람이 있는가 하면, 설계를 대강의 윤곽만 잡고, 개발을 하면서 진화를 시키는 방법이 있다.

나같은 경우는 실력이 모잘라서 후자쪽을 자주 선택을 하는 편인데, 테스트를 만들고 개발을 하면서 계속 발전 및 진화를 시키는 모델이다.

개발완료라고 얘기를 해도 하루 아침에 전체적으로 소스가 변화하는 경우도 있다. 그러다 보니 언제쯤 끝을 내야 하는 가는 선택하기 힘든 일이다.

순수하게 function단위의 개발은 테스트 코드로 금방끝나기는 하지만, 그 뒤에 객체들 간의 관계를 만들어 갈때 고민과 어려운 점이 많기때문이다.

일련의 과정중 어느 시점에서 타협을 하는가?

이메일 뉴스레터를 보다가 링크를 통해서 이원영씨의 예전 인터뷰를 볼수가 있었다. 예전에 봤을때는 그냥 넘어간 답변이었는데, 오늘보니 마음에 와닿는다.

내가 짠 코드가 아름답게 보일때 비로서 개발이 완료된 것이다.

지금까지 지난날에 개발한 코드들을 보면, 창피할때가 많다. 트렌드의 변화도 그렇지만, 원칙을 지켰다면 피할수 있는 코드들도 많았지만, 단순한 function개발이 개발완료로 보고 서비스에 올려서 나중에는 내가 보기에도 역겨운 코드들을 남겨두지 않았나 싶다.

역겨운 코드들이 보일때 과감하게 refactoring을 시작해서 아름다운 코드로 만들어 가자.
시간이 늦어질수록 더욱더 힘든 과정을 겪어야 할 것이다. 자신이 만든 코드를 버릴 것이 아니라면, 지금 바로 시작하는 것이 육체적으로나 정신적으로나 비용을 절약하는 방법이다.

만족스러운 개발을 하도록 합시다!!

문: 자신만의 개발 원칙이 있으신가요?

답: 제 원칙은 "하고 싶을때만 프로그램을 짠다"라는 것입니다. 시간에 쫓겨 프로그래밍을 하면 늘 결과가 좋지 않더군요. 꼭 그런 프로그램은 문제를 일으키곤 해요.
문제가 풀리지 않으면 기다려야죠. 그러다 보면, 어느 순간 아, 하고 생각날 때가 있거든요.
제가 짠 코드가 '아름답다'고 보일 때까지, 그래서 희열이 느껴질 때까지 보완합니다. 그러다보면 진정 만족스러운 프로그램이 나오더라고요.

자바서비스, 이원영님 인터뷰
http://www-128.ibm.com/developerworks/kr/interview/2006_03.html

Refactoring to Patterns - 패턴을 활용한 리팩터링

컴퓨터가 이해하는 코드는 어느 바보나 다 짤 수 있다. 훌륭한 프로그래머는 사람이 이해할 수 있는 코드를 짠다.[F,15]

자바개발자로서 생활을 하다가 보면, 신규 솔루션이나 새로운 도메인 영역을 개발을 해야 할때도 있지만, refactring역시 중요한 업무중의 하나이다.

국내 현실에 있는 대부분의 코드들은 OOP의 개념을 잡고 만든 코드들을 만나보기 힘들고, 양질의 코드보다는 단순 스크립트 코드들이 즐비한 상태이고, 중복 코드가 곳곳에 존재를 하며, 레이어간 분리가 잘 안된 경우도 허다하다.

이 코드들을 분석을 해서 refactoring을 하는 작업은 힘들고, 고통스러운 경우가 많다.
refactoring의 고통은 해본 사람들은 코드를 아예 재작성이 낫다고 얘기할 만큼 쉬운 것이 아니다.

refactoring을 하는 이유

  • 새로운 코드를 더 쉽게 추가할 수 있도록 하기 위해
  • 기존 코드의 설계를 개선하기 위해
  • 기존 코드를 더 잘 이해하기 위해
  • 덜 짜증나는 코드로 만들기 위해

refactoring을 하다가 보면, 더 자세히 코드를 보게 되고, refactoring을 통해서 나온 코드들은 자신이 읽기에 편하다. 그래서, 나는 기존 코드를 더 잘 이해하기 위해 refactoring을 선택을 자주 한다. 모르는 상태에서 버그를 일으키는 시스템보다는 좀더 공격적으로 코드개선을 통해서 risk를 관리해 나가는 것이 일정한 시점에 이르면 더 강건한 시스템을 만들 수 있기 때문이다.

리팩토링의 진정한 가치는 아래와 같은 그림, 링크에서 처럼 어느 순간에 급격하게 증가한다.
http://www.ologist.co.kr/376



refactoring하는 기준과 목적은 무엇일까? GOF의 디자인 패턴은 어떤 목적으로 쓰여진 얘기일까? marting fowler가 쓴 refactoring은 어떤 모습을 지향하는 것일까?

많은 사람들이 기존에 코드를 유지보수가 편하게 하기 위해서 refactoring을 하다가 보면, 자신도 모르는 사이에 어떤 패턴(GOF Patterns)의 모습으로 코드를 만들어 가고 있다는 것을 깨닫게 된다.

이 책을 보면, 그들 간의 유기적인 관계(디자인 패턴과 리팩터링의 상호관계)를 알수가 있게 된다.

패턴과 리팩터링 사이에는 자연스런 관계가 있다. 패턴을 도달하고 싶은 곳이고, 리팩토링은 그곳으로 가는 방법이다.[F,107]

막연했던 카탈로그들을 그 책을 본 동등한 필자(Joshua Kerievsky)가 그가 경험하고, 실전에 써먹었던 코드들을 바탕으로 책을 써내려간다. TDD 및 XP,애자일 사상이 곳곳에 보이는 이 책은 refactoring을 하고자 하는 이에게 나침반 같은 존재가 될것 이다.

refactoring의 방향성을 찾고 싶다면.
1. GOF 디자인 패턴
2. Refactorign - martin folwer
를 반드시 봐야 한다.

그리고, 이 책으로 좀더 실전적인 감을 익히고, 시작하면 더 양질의 코드를 만들수 있지 않을까 기대가 된다.

이 책의 목적

  • 리팩토링과 패턴을 어떻게 결합하는지 이해
  • 패턴을 고려한 리팩터링으로 기존 코드의 설계를 개선
  • 코드에서 패턴을 고려한 리팩터링이 필요한 영역을 식별
  • 새로운 설계의 초기부터 패턴을 사용하는 것보다 기존 코드를 개선하기 위해 패턴을 사용하는 것이 좋은 이유를 이해

Joshua Kerievsky
- XP전문기업 Industrial Logic(http://industriallogic.com)
- 전문 소프트웨어 개발자, 코치, 강사

패턴을 활용한 리팩터링

Joshua Kerievsky / Insight (인사이트)

ologist :
저는 최근들어서 패턴의 중요성을 더 느끼고 있습니다. 과거에는 패턴을 공부하고 프로젝트에 적용하려 애를 썼었습니다. 지금 거의 패턴을 잊어버렸다고 생각을 하고, 일단 프로젝트를 어느정도 구현을 하고, 중복코드를 없애는 작업을 했습니다. 그 다음 패턴책을 읽어보니 그 안에 중복코드를 없애려고 할때 생각했던 고민들이 있었습니다. 패턴을 위한 패턴이 아니라 중복코드를 줄이고, 유지보수 비용을 줄이기 위한 경험이라고 생각을 하면 반드시 필요하다고 얘기할수 있습니다

안영회님 :
넵.. 동감입니다. 그러나, 그러한 접근은 리팩토링에 가깝죠.
리팩토링을 하다 보면 패턴에 가까워진다는 설명이 자연스러울 수 있을 것 같습니다. 자주 코드를 개선하는 과정에서 결과를 만들어내는 것이 자연스러우니까요.
물론, 충분히 훈련된 분들에게는 바로 직관을 주는 패턴이 더 유용할 수 있겠죠.

디자인 패턴, 나에게도 유용한가?
http://blog.empas.com/ahnyounghoe/14674430

위에 있는 글은 안영회님의 글에서 내가 덧글을 단 내용과 그 답변을 가져왔다. 내 블로그에도 글을 남길만한 가치가 있는 듯해서 내용을 가지고 와서 아래와 같이 추가를해서 글을 적어본다. 조만간 안영회님의 블로그가 이사를 하면 덧글이 사라질 가능성이 많을 듯해서..^^;

나의 못다한 얘기 :
리팩토링에 가까운 접근이지만, 리팩토링이 필요한 소스를 만들어 내지 않는 것도 좋은 품질의 소스라고 생각을 합니다. 개발과 유지보수 중에 리팩토링이 반드시 필요하기는 하지만, 어느정도 수준에 올라섰다면 일부러 리팩토링되는 소스를 만들 필요는 없을 듯 합니다. 정형화되고 자주 리팩토링 되는 소스구조라면 디자인 패턴이 적용이 되어야 합니다.

숙련된 개발자들에게는 패턴은 정말 좋은 친구죠. 리팩토링의 리스크를 사전에 최소화 할수 있을테니까요.

PS.
1. 숙련된 개발자라는 표현에서 애매한 부분이 있지만, 초보 or 범상한 개발자들이 훌륭한 개발자들이나 숙련된 개발자들에 가깝게 가기 위한 자기계발을 충분히 해야 한다는 일반적인 가정을 하고 이야기를 적었습니다...^^

2. 안영회님 말씀처럼 시간이 갈수록 기초의 부족이 느껴지는 왜일까요? 2006년은 다시 기초부터 공부하는 해로 정했습니다. 오래만에 회사 사내강의로 자바 fundamental & sevlet,jsp 강의를 들었는데, 재밌더군요...ㅎㅎㅎ

다음과 같은 글이 있어서 추가로 적습니다. 위에 적은 글과 비슷한 내용의 article이 이미 있네요...^^;
Pre-Factoring
http://blog.naver.com/django44/40026544455
http://www.oreillynet.com/pub/a/network/2005/11/15/what-is-prefactoring.html

BLOG main image
OOP and Java by ologist

공지사항

카테고리

All (649)
private!! (106)
WEB & IT (140)
Developer (400)