////
Search
Duplicate
🖱️

Chapter 11. 코드를 변경해야 한다. 어느 메소드를 테스트해야 할까?

코드를 변경하기에 앞서, 기존 동작의 명세를 확실히하고자 테스트를 작성해야 할 때, 어디에 작성해야 할까?
가장 간단한 답은 변경 대상 메소드마다 테스트 코드를 작성하는 것이다.
하지만 이렇게 간단하게 답을 낼 수 있는 문제가 아니다. 코드가 간단하다면 충분하지만 레거시는 그렇지 않은 경우가 더 많다.
테스트 루틴이 적절하지 않으면 어떤 영향을 미칠지 전혀 알 수 없기 때문에 우리는 테스트 코드의 위치를 결정하는 데 많은 시간을 보내야 한다.
리팩토링은 결과를 바꾸지 않으면서 동작을 변경하는 과정이다. 리팩토링 전 결과를 알고 있어야 한다.
이번 장은 이런 간극을 메우기 위한 기법들을 설명한다. 테스트 코드의 최적 위치를 찾기 위해서는 다양한 영향들에 대해 제대로 추론해야 할 때가 많다.

영향 추론

우리가 변경한 코드가 어디까지 영향을 미칠지 추론하는 기법에 관한 내용이다.
영향을 효과적으로 추론하기 위해 영향을 받는 변수와 반환 값이 바뀔 수 있는 메소드를 타원으로 그려 서로 화살표로 연관짓는 다이어그램을 활용해볼 수 있다.
값이 바뀔 변수를 타원으로 그린 후, 변수 값의 변경으로 인해 반환 값이 변경될 여지가 있는 메소드를 향해 화살표를 그린다.
이런 추론을 충실히 해내면 예상치 못한 오류가 발생했을 때, 어느 지점을 조사해야하는 지 빠르게 파악할 수 있다.
품질이 좋지 못한 프로그램은 결과 값을 도출하기까지의 과정을 파악하기 어려울 때가 많다. 당연히 디버깅도 어려워진다.
레거시 코드를 다룰 때는 수시로 다음 질문에 대답해야 한다. 어떤 변경을 수행하면, 그 변경이 프로그램의 나머지 부분에 어떤 영향을 미칠까?
이 질문에 답하려면 변경 지점을 기준으로 전방 추론을 해야 한다. 전방 추론을 잘하는 것은 테스트 루틴의 최적 위치를 찾는 기법의 기초를 닦는 것이다.

전방 추론

명세에 관한 테스트를 작성할 때는, 먼저 객체들을 조사하고 이 객체들이 제대로 동작하지 않을 경우, 어떤 영향을 미치는지 추론한다.
내가 변경하려는 코드의 변경 지점을 설정했을 때, 해당 변경 지점에 영향을 줄 수 있는 곳들을 파악하여 영향을 감지하는 테스트 루틴을 작성해 코드를 보호한다.
테스트 위치를 찾아야 할 때, 가장 먼저 할 일은 어디서 변경을 탐지할 수 있는지, 즉 변경의 영향이 무엇인지 파악하는 것이다.

영향 전파

일반적으로 영향이 전파되는 방법은 변경하려는 코드의 반환 지점이나 메소드가 대표적이었다.
이들은 공개적인 전파에 속하는데 은밀하게 전파되는 경우도 존재한다. 대표적으로 다른 객체를 매개변수로서 받아 속성을 변경시키거나 전역 변수, 정적 변수들이 해당한다.
관점 지향 언어를 사용하는 경우, 관점이라는 구조를 통해 전파되기도 한다.
다음은 저자가 경험적으로 변경 영향을 탐색할 때 사용하는 방법이다.
1.
변경 대상 메소드를 식별한다.
2.
메소드가 반환 값을 가진다면 이 메소드가 호출하는 코드를 살펴본다.
3.
메소드가 어떤 값을 변경한다면 그 값을 사용하는 메소드와 다시 이 메소드를 사용하는 메소드를 살펴본다.
4.
인스턴스 변수 및 메소드 사용자가 될 수 있는 슈퍼클래스와 서브클래스도 살펴본다.
5.
메소드에 전달되는 매개변수를 살펴본다. 변경하고자 하는 코드가 매개변수나 반환 값인 객체를 변경하지 않는지 살펴본다.
6.
식별된 메소드 중에서 전역 변수나 정적 변수를 변경하는 것이 있는지 살펴본다.
위 방법들을 사용하면 대부분의 영향 전파를 잡아낼 수 있다.

영향 추론을 위한 도구

프로그래밍 지식을 쌓는 것도 중요하다.
영향 전파를 효과적으로 막아주는 방화벽을 하는 const, private 등 키워드들이 많이 있다. 이들을 알아두고 영향 전파에 적절히 사용하자.
⇒ 영향 전파는 캡슐화와 연관이 굉장히 깊어보이는데, 추론을 위해 캡슐화를 잘 공부해두면 좋을 것 같다.

영향 분석을 통한 학습

좋은 코드에는 뭔가 새고 있는 구멍이 없다. 편의를 위해 잠깐 눈 딱 감고 오픈할 수 있으나 이는 곧 나중의 내가 힘들어질 뿐이다.
프로그램 내의 영향을 줄일수록 프로그래밍이 쉬워진다. 내가 지금 해결해야할 문제에만 집중할 수 있기 때문이다.

영향 스케치의 단순화

중복 부분을 제거하여 영향 스케치의 종점 수를 줄일 수 있다. 이는 즉, 테스트 구별이 좀 더 간단해짐을 의미한다.
영향을 약식으로 추론할 수도 있고 영향 스케치를 사용해 엄밀하게 추론할 수도 있다. 하지만 가급적 영향 스케치를 사용하면 좋을 것이다.
매우 복잡한 코드를 대상으로 작업할 때, 테스트 루틴의 위치를 발견하는 과정에서 우리가 의지할 몇 안되는 기법이기 때문이다.