•
매우 불명확한 코드를 가지고 작업하는 프로젝트에서 다수의 변경을 수행하기 위해선 오랜 시간이 걸린다.
◦
코드를 자세히 살피고 모든 분기를 이해하지 않으면 올바르게 변경 작업을 수행할 수 없고 재작업해야 하는 일이 생기거나 지연되기 때문이다.
•
코드 중 명확한 부분은 빠르게 변경이 가능하지만 복잡하게 얽혀있는 부분은 오랜 시간이 걸릴 것이다.
•
이런 개발 팀에게는 작은 변경도 오랜 시간이 걸린다. 추가될 기능을 이해하고 변경이 발생할 지점을 감지한 후, 기존 코드를 자세히 검토 후 변경하는 작업까지 빠르게 끝내더라도 릴리스를 망설일 것이다.
•
왜 이런 일이 일어나는 것일까?
코드 이해하기
•
프로젝트의 코드가 늘어날수록 점차 인지능력의 한계를 느끼기 시작한다. 즉, 무엇을 변경해야 할지 이해하는 데 걸리는 시간이 계속 증가한다.
•
이는 어느 정도 불가피한 현상이다. 시스템에 코드를 추가할 때는 기존의 코드에 추가할 수도 아예 새로운 코드가 추가될 수도 있으며 어느 경우든, 상황을 제대로 이해하고 있지 않으면 변경 방법을 파악하는 데 오랜 시간이 걸린다.
•
하지만 꾸준히 관리되는 시스템은 여기서 차이점을 만들어 낸다. 물론 이것도 변경 방법을 파악하는 데 오랜 시간이 걸릴 수 있으나 파악되고 나면 변경 자체는 간단하다.
◦
레거시의 경우, 파악을 하더라도 얽히고 설켜 어디서부터 건드려야할지 파악하기 어렵다.
•
적절한 크기의, 좋은 이름을 가진, 적절히 추상화된 시스템이라면 코드 변경 작업을 신속하게 수행할 수 있다.
지연 시간
•
지연 시간이란 변경을 수행한 시점과 그 변경에 대한 실질적인 피드백을 받기까지의 시간을 의미한다.
•
우리의 평소 작업은 지연 시간이 잦다. 코드를 변경하고 빌드를 시작하며, 결과를 확인한다.
•
변경할 클래스를 별도의 테스트 하네스에서 컴파일 할 수 있다면 매우 빠르게 결과를 확인할 수 있으며 이를 기반으로 개발 속도가 향상될 것이다.
의존 관계 제거
•
객체 지향에서 가장 먼저 해야할 일은 테스트 하네스 내에서 클래스의 인스턴스를 생성하는 것이다.
•
일반적으로 변경 대상 클래스를 테스트 하네스에서 인스턴스화할 수 있다면 편집 → 컴파일 → 링크 → 테스트에 걸리는 시간을 크게 단축할 수 있다.
•
많은 경우, 이와 같이 간단하게 변경 작업을 할 수 있지만, 레거시 코드의 경우, 클래스를 테스트에 넣는 것부터 힘들 수 있다.
◦
이런 경우, 이런 대규모 클래스의 일부를 덜어내서 테스트 루틴 안으로 넣을 수 있는지 조사할 필요가 있다.
▪
이는 12장에서 테스트를 간단히 기술할 수 있는 위치를 의미하는 조임 지점을 찾는 데 유용한 기법들이 소개되어 있다.
빌드 의존 관계
•
객체 지향 시스템에서 신속히 빌드하고 싶은 클래스 집합이 있을 경우, 이를 위해 가장 먼저 할 일은 어떤 종류의 의존 관계가 걸림돌인지를 알아내는 것이다.
•
이는 그다지 어렵지 않은데, 단순히 테스트 하네스 내에서 이 클래스들을 사용해보면 된다. 문제가 드러난다면 틀림없이 의존 관계 때문인 것이다.
•
인터페이스 추출 기법을 사용하여 의존 관계를 제거할 수 있다. 인터페이스에 의존하게 되면서 기존의 구체 클래스에 의존하지 않게 되면서 기존 클래스의 변경이 발생해도 재컴파일이 필요 없어지는데, 이를 컴파일 방화벽을 설치한 것이라고 말할 수 있다.
◦
의존 관계를 제거하고, 클래스를 다수의 패키지로 분산시킴으로써 빌드 시간을 줄이는 행위는 빠른 피드백을 가능케하으로써 더 적은 오류와 장애를 발생시킨다.
◦
그러나 인터페이스가 늘어나므로 개념적으로 부담이 는다는 단점이 존재한다. 즉, 코드를 조사하는 시간이 늘어날 것이다.
•
평균 빌드 시간의 최적화는 작업하기 쉬운 코드의 증가로 이어진다. 단순히 클래스 집합을 테스트 하네스 내에서 자주 빌드하기만 해도 의존성을 제거할 수 있도록 고민할 수 있게 된다.
요약
•
이번 장의 인터페이스 추출, 구현체 추출 기법들은 소규모 클래스 집합의 빌드 시간을 줄여, 지연 시간을 줄이는 데 초점이 맞춰져있다.
•
그러나 이번 장에서 살펴본 이점들은 인터페이스를 사용해 의존 관계를 관리함으로써 얻을 수 있는 장점의 일부에 지나지 않는다.
◦
로버트 마틴의 Agile Software Development: Principles, Patterns, and Practices(2002)는 이와 관련된 더 많은 기법들을 설명하며, 모든 소프트웨어 개발자들이 알아야 할 내용을 담고 있다.