////
Search
Duplicate
🎯

Chapter 7. 코드 하나 바꾸는 데 왜 이리 오래 걸리지?

매우 불명확한 코드를 가지고 작업하는 프로젝트에서 다수의 변경을 수행하기 위해선 오랜 시간이 걸린다.
코드를 자세히 살피고 모든 분기를 이해하지 않으면 올바르게 변경 작업을 수행할 수 없고 재작업해야 하는 일이 생기거나 지연되기 때문이다.
코드 중 명확한 부분은 빠르게 변경이 가능하지만 복잡하게 얽혀있는 부분은 오랜 시간이 걸릴 것이다.
이런 개발 팀에게는 작은 변경도 오랜 시간이 걸린다. 추가될 기능을 이해하고 변경이 발생할 지점을 감지한 후, 기존 코드를 자세히 검토 후 변경하는 작업까지 빠르게 끝내더라도 릴리스를 망설일 것이다.
왜 이런 일이 일어나는 것일까?

코드 이해하기

프로젝트의 코드가 늘어날수록 점차 인지능력의 한계를 느끼기 시작한다. 즉, 무엇을 변경해야 할지 이해하는 데 걸리는 시간이 계속 증가한다.
이는 어느 정도 불가피한 현상이다. 시스템에 코드를 추가할 때는 기존의 코드에 추가할 수도 아예 새로운 코드가 추가될 수도 있으며 어느 경우든, 상황을 제대로 이해하고 있지 않으면 변경 방법을 파악하는 데 오랜 시간이 걸린다.
하지만 꾸준히 관리되는 시스템은 여기서 차이점을 만들어 낸다. 물론 이것도 변경 방법을 파악하는 데 오랜 시간이 걸릴 수 있으나 파악되고 나면 변경 자체는 간단하다.
레거시의 경우, 파악을 하더라도 얽히고 설켜 어디서부터 건드려야할지 파악하기 어렵다.
적절한 크기의, 좋은 이름을 가진, 적절히 추상화된 시스템이라면 코드 변경 작업을 신속하게 수행할 수 있다.

지연 시간

지연 시간이란 변경을 수행한 시점과 그 변경에 대한 실질적인 피드백을 받기까지의 시간을 의미한다.
우리의 평소 작업은 지연 시간이 잦다. 코드를 변경하고 빌드를 시작하며, 결과를 확인한다.
변경할 클래스를 별도의 테스트 하네스에서 컴파일 할 수 있다면 매우 빠르게 결과를 확인할 수 있으며 이를 기반으로 개발 속도가 향상될 것이다.

의존 관계 제거

객체 지향에서 가장 먼저 해야할 일은 테스트 하네스 내에서 클래스의 인스턴스를 생성하는 것이다.
일반적으로 변경 대상 클래스를 테스트 하네스에서 인스턴스화할 수 있다면 편집 → 컴파일 → 링크 → 테스트에 걸리는 시간을 크게 단축할 수 있다.
많은 경우, 이와 같이 간단하게 변경 작업을 할 수 있지만, 레거시 코드의 경우, 클래스를 테스트에 넣는 것부터 힘들 수 있다.
이런 경우, 이런 대규모 클래스의 일부를 덜어내서 테스트 루틴 안으로 넣을 수 있는지 조사할 필요가 있다.
이는 12장에서 테스트를 간단히 기술할 수 있는 위치를 의미하는 조임 지점을 찾는 데 유용한 기법들이 소개되어 있다.

빌드 의존 관계

객체 지향 시스템에서 신속히 빌드하고 싶은 클래스 집합이 있을 경우, 이를 위해 가장 먼저 할 일은 어떤 종류의 의존 관계가 걸림돌인지를 알아내는 것이다.
이는 그다지 어렵지 않은데, 단순히 테스트 하네스 내에서 이 클래스들을 사용해보면 된다. 문제가 드러난다면 틀림없이 의존 관계 때문인 것이다.
인터페이스 추출 기법을 사용하여 의존 관계를 제거할 수 있다. 인터페이스에 의존하게 되면서 기존의 구체 클래스에 의존하지 않게 되면서 기존 클래스의 변경이 발생해도 재컴파일이 필요 없어지는데, 이를 컴파일 방화벽을 설치한 것이라고 말할 수 있다.
의존 관계를 제거하고, 클래스를 다수의 패키지로 분산시킴으로써 빌드 시간을 줄이는 행위는 빠른 피드백을 가능케하으로써 더 적은 오류와 장애를 발생시킨다.
그러나 인터페이스가 늘어나므로 개념적으로 부담이 는다는 단점이 존재한다. 즉, 코드를 조사하는 시간이 늘어날 것이다.
평균 빌드 시간의 최적화는 작업하기 쉬운 코드의 증가로 이어진다. 단순히 클래스 집합을 테스트 하네스 내에서 자주 빌드하기만 해도 의존성을 제거할 수 있도록 고민할 수 있게 된다.

요약

이번 장의 인터페이스 추출, 구현체 추출 기법들은 소규모 클래스 집합의 빌드 시간을 줄여, 지연 시간을 줄이는 데 초점이 맞춰져있다.
그러나 이번 장에서 살펴본 이점들은 인터페이스를 사용해 의존 관계를 관리함으로써 얻을 수 있는 장점의 일부에 지나지 않는다.
로버트 마틴의 Agile Software Development: Principles, Patterns, and Practices(2002)는 이와 관련된 더 많은 기법들을 설명하며, 모든 소프트웨어 개발자들이 알아야 할 내용을 담고 있다.