진도를 마쳤습니다. 시험봐야죠. 다른 말로 테스트.
생활 속에서 이러한 이유로 테스트라는 단어는 항상 실체의 뒤에 위치합니다.

TDD, Test Driven Development. 흔히 테스트 주도 개발이라고 얘기하는 것입니다.
학원 안 다니고 주행에 도전했다가 몇 번 씩 탈락한 뒤에 합격해서 받은 운전 면허가 TDD로 받은 운전면허증일까요. ㅋㅋ. 이 경우는 테스트가 학습을 유발했다고도 볼 수 있죠. 영어로 Heuristic 이라고 얘기하는 학습법이요.

이와는 반대로 건드리기 전에 테스트를 해야하는 경우도 있습니다.

사용자 삽입 이미지

image from: http://www.esfi.org/workplace/test-before-you-touch.html 

전기 회로를 손대기 전에 전류가 흐르는지 아닌지 확인을 하는 경우처럼 말이죠.

리팩토링의 관점에서는 테스트 코드의 존재가 이와 같다고 생각합니다. 레거시 코드를 고치기 전에 소스의 특성을 알아내는 것이죠. 그 다음 테스트 코드가 신뢰할 만큼 누적되면 좀 더 안전하게 코드를 수정할 수 있겠지요. 변경으로 인한 사이드 이펙트를 금방 인지할 수 있으니까요.
어려운 단어 등장했습니다. 직교성. Orthogonality. 공업수학시간에 잠깐 배운 기억이 스쳐지나갑니다. 갑자기 이 단어가 요즘 제 뇌를 후벼팝니다. Working Effectively With Legacy Code 책의 후반부에 나오는 단어인데, 코드 리팩토링의 결정판은 궁극의 직교성이라고 얘기합니다.

말을 좀 쉽게 풀죠.
3차원 그래프라고 생각하시면 됩니다. x축, y축, z축이 있습니다. 왼쪽 그래프에서 보면 성별, 생일, 출생지가 있습니다. 세 기준이 각자의 영역에서 사람의 특성을 설명해주고 있죠. 각 기준은 독립적입니다. 다른 기준에 종속적이지 않습니다.
사용자 삽입 이미지
image from: http://www.itcon.org/1997/2/paper.htm

이것을 소스코드에 빗대어 설명하면 이렇습니다.
웹 페이지에는 HTML, CSS, Javascript가 있습니다. 각기 역할이 있죠. HTML은 컨텐츠 데이터, CSS는 렌더링 스타일, Javascript는 Behavior 즉 동작입니다. 각기 독특한 영역이 있는데, 이 코드를 분리해서 관리하는 것이 직교성이 있다고 얘기할 수 있습니다. 세 가지가 만나는 접점은 id 입니다.

이해가 좀 가시나요?

이럴 필요가 있는 것은 직교성이 무너졌을 때, 세 가지 코드는 뒤죽박죽 됩니다. 스타일 고치는데 Javascript 고쳐야하고, 동작을 고치는데, HTML과 CSS코드가 헤집어진다면 코드가 뒤섞여 있다는 뜻입니다.

휴~

어렵죠.

프로그래밍 코드의 영역에서도 마찬가지입니다. 비단 세 가지 축(3차원)만 있는 것이 아니라 다차원(Multi-demension)의 코드를 짤 때도 이런 컨셉으로 분리해서 짠다면 코드의 관리포인트를 분리해서 생각할 수 있습니다. 리팩토링이 바라보는 관점과 일견 같다고 할 수 있습니다.

관련 : Open/Closed Principle

참고: Working Effectively With Legacy Code, 285~286p
Working Effectively With Legacy Code 책을 다시 보기 시작했습니다.
이제 1/3 정도 읽었는데, 아주 벅찬 책입니다.

124페이지를 보면 다음과 같은 표현이 있습니다.

If we want to avoid talking to the database, we can subclass PermitRepository like this:
public class TestingPermitRepository extends PermitRepository {
...

심각하게 고민해봐야겠습니다.

2008년 제9회 JCO 자바컨퍼런스에서 발표할 내용입니다.
대략의 줄거리는 다음과 같습니다.

레거시 코드 관리 전략
허광남
GS이숍

목차
레거시 코드란?
남이 짠 코드 빨리 알아보기
리팩토링 방법
테스트케이스라굽쇼?
인터페이스의 역할
복사할 것인가 상속할 것인가
기능 추가 방법
팀역량

수많은 방법론 중에
개발 방법론은 넘쳐나지만 유지보수에 관한 방법론은 어디에?
소프트웨어의 변경주기는 짧아지고 있다.
웹 비즈니스 애플리케이션은 기민하고 안정적으로 변경하는 것이 관리의 목표

레거시 코드
누군가 나에게 맡겨놓은 코드
자기가 직접 짜지 않은 누군가가 만들어 놓은 코드
많은 의문의 그림자와 중압감을 내포한 코드
얽히고 설킨, 아둔하게 짜놓은, 갈아엎고 싶지만   그럴 자신이 안 생기는 코드

레거시 코드
기능 하나 추가하려면 몇 일 밤 새게 만드는 코드
어느 누구도 선뜻 나서지 않는 코드
손을 대면 댈수록 나락으로 빠져버리는 코드
“차라리 날 죽여줘”라고 절규하게 만드는 코드
개선한다는 생각 자체가 몸서리처지는 코드

남이 짠 코드 빨리 알아보기
들여쓰기 (Indent)
Code Formatter
IDE 코드 네비게이션 기능
- F3
- ctrl+K
- 형광펜

남이 짠 코드 빨리 알아보기
팀원간 용어의 일관성
변수명, 함수명의 기능에 따른 변경
- buy() -> order()
남이 짠 코드 빨리 알아보기
프레임워크 사용시 명명규칙은 절대적
- /order/order.jsp
- /js/order/order.js
- /css/order/order.css
- OrderController.java
- OrderService.java
Open Resources(ctrl+shift+R)
Convention over Configuration

리팩토링 방법
Re + Factor + ing
- 소스(Factor)의 재(Re)구성(ing)
Martin Fowler
- Refactoring, 1999
- 외부 동작은 바꾸지 않으면서    내부 구조를 개선하는 방법

사연 많은 JSP 리팩토링
JSP 파일 하나에 11,000 라인의 코드
7년간 산전화수전화 다 겪은 전설의 코드
그와 결부된 사촌형제 코드들 각각 6,7천라인
1차 프로젝트 Java와 Javascript의 분리
자바스크립트의 분리
객체를 이용하기

자바스크립트의 분리
함수에 파라미터를 통해 전달

자바스크립트의 분리
JSP, Javascript 스파게티 분리
리팩토링 고려사항
소스의 증가
- 선별적 js로딩으로 효율화
보안이슈
- 권한 및 로직 유효성 체크는 이중화 또는 서버단으로 이동
JS캐쉬 이슈
- 자주 변경되는 내용은 jsp 안에서 처리
- js파일에 날짜별 버전
서버단과 클라이언트단 혼재된 로직
- 로직을 단순화하거나 jsp에서 처리하고 분리하지 않는다.

JSP,JS 분리 효과
서버단의 속도 개선효과
  1005.352223 -> 757.8979948

javascript를 잘 하는?전문가가??js 파일을 따로 최적화 작업할 수 있다. (관리 포인트의 전문성 확보)

js 변경시 기존 jsp를 수정하지 않아도 된다.

전체 소스의 가독성과 이해력 향상 (jsp, js)

인터페이스의 역할

복사할 것인가 상속할 것인가

테스트케이스라굽쇼?

Edit & Pray
        vs
Cover & Modify

Backup, Cover Fire!
Acrobatic Net

기능 추가 방법

팀역량
깨진 유리창 비유
코드리뷰, 짝 프로그래밍
- 버그의 최소화
- 코딩 공감대 확장
- 더 이상 겁나지 않는 휴일 전화
낳은 정보다는 기른 정

정리
레거시 코드는 비운의 코드입니다.
좋은 유모를 만나서 제대로 리팩토링하면 버그 없고, 건강하게 자랄 수 있습니다.
함께 키우려면 코드 리뷰, 짝 프로그래밍 등을 이용하면 됩니다.
잘 키운 레거시 코드 하나, 열 개발자 안 부럽다

참고자료
Working Effectively With Legacy Code, Michael C. Feathers, Prentice Hall, 2005
리팩토링, 마틴 파울러, 대청, 2002
소프트웨어 공학의 사실과 오해, Robert L. Glass, 인사이트, 2004
GS이숍 주문리팩토링 보고서, 김현,김현기, GS이숍, 2008

CCL


내용의 일부는 Working Effectively with Legacy Code 에서 발췌했습니다.

시스템 소스 코드의 변경은 자주 일어나는 일입니다. 개발자에 따라서 두 가지 형태로 일이 진행된다고 하는군요.
  1. Edit & Pray
  2. Cover & Modify

첫번째 항목을 보면서 많이 웃었습니다. 심하게 공감을 했기 때문이죠. 수정하고 기도하는 자세로 소스코드의 변경 작업을 하는 부류가 대부분이라고 생각이 됩니다. 적어도 80% 이상의 개발자들이 해당되지 않나 개인적으로 추산해봅니다.

설명에서 이어지는 것은 열심히 포크로 이리저리 찔러본다고 합니다. 열심히 찔러 보고 그 다음에 기도를 드리는 것이죠. 아니, 기도 드리는 마음으로 이리저리 찔러보는 것일 수도 있겠죠. 盡人事待顧客(사람이 할 일을 다 한 후 사용자를 기다린다)이라고 할까요.

두번째 방법의 스타일은 이상적인 방법입니다. 그리고 마땅히 해야될 방법이기도 합니다. 커버라는 말은 공중곡예의 안전망을 친다라는 뜻과도 같습니다. 엄호사격을 영어로하면 Cover fire 입니다. 이때의 커버도 마찬가지이죠. 암벽등반을 하는 사람들 얘기를 들어보면 두 손 두 발 중에서 세 지점이 안정하다는 것을 확인하면 나머지 하나를 움직여서 나아간다고 합니다. 변경에 따른 사이드 이펙트를 줄이자는 것이지요.

마치 무협 판타지에서 나오는 결계(結界)를 치고 싸우는 것과 같다고 할까요.

사용자 삽입 이미지

image from: http://fireblood.egloos.com/1252976 

회귀테스트(regression test)가 가능한 테스트코드들이 필요하겠지요.
레거시 코드, 또는 레거시 시스템이라고 합니다.
요즘 보기시작한 책이 WORKING EFFECTIVELY WITH LEGACY CODE 입니다.
http://kangcom.com/common/bookinfo/bookinfo.asp?sku=200410110002
 
자바지기 박재성님의 블로그를 보고 부쩍 읽고 싶은 마음이 생겨서 구입을 했습니다. 원서라 조금씩 책장을 넘기고 있는데, 표현이 예술입니다. ^^; 구구절절이 제 마음을 후벼파는군요.

  • 누군가 나에게 맡겨놓은 코드
  • 자기가 직접 짜지 않은 누군가가 만들어 놓은 코드
  • 많은 의문의 그림자와 중압감을 내포한 코드
  • 얽히고 설킨, 아둔하게 짜놓은, 갈아엎고 싶지만 그럴 자신이 안 생기는 코드
  • 기능이라도 하나 추가할라치면 몇일 밤을 새게 만드는 코드
  • 도저히 손댈 수 없어서 팀에서 누구라도 나서지 않는 코드
  • 손대면 손댈수록 나락으로 빠져버리는 코드
  • 차라리 날 죽여줘 라고 절규하게 만드는 코드
  • 개선한다는 생각 자체에 몸서리 치게 만드는 코드

레거시 코드를 잘 묘사하지 않았나요.
책을 읽어가면서 요약해서 글을 올려보고 싶군요.
사용자 삽입 이미지

늪 괴물과 레거시 코드의 공통점


image from: http://wow.allakhazam.com/db/mob.html?wmob=766

+ Recent posts