////
Search
Duplicate
🎈

Chapter 22. ‘괴물 메소드’를 변경해야 하는데 테스트 코드를 작성하지 못하겠다

발아 메소드, 클래스 기법을 이용해 대규모 메소드를 리팩토링하는 일을 피할 수 있지만 이는 근본적으로 문제를 해결하는 방법은 아니다.
대규모 메소드가 다루기 힘든 수준이라면 괴물 메소드는 재앙이라고 할 수 있다. 이는 너무나 길고 복잡해서 손대고 싶지 않은 메소드를 의미한다.
테스트 코드를 잘 작성하여 리팩토링을 수행한다면 문제는 발생하지 않을 것이다.

괴물 메소드의 다양한 종류

괴물 메소드는 몇 가지 변형이 존재하지만 명확한 구분이 존재하지는 않는다. 실제로 현업에서 마주치게 될 괴물 메소드는 변형의 혼합일 때가 많다.

불릿 메소드

불릿 메소드는 들여쓰기가 거의 되어있지 않은 메소드를 말한다.

혼잡 메소드

혼잡 메소드란 들여쓰기가 된 한 개의 대규모 단락으로 구성된 메소드를 말한다.
가장 단순한 예가 한 개의 대규모 중첩 조건문을 갖는 메소드다.
중첩되어 있기 때문에 동작 확인을 위한 테스트 루틴 작성이 어렵다.

리팩토링 자동화 도구를 사용해 괴물 메소드 공략하기

추출을 수행하는 주요 목적은 다음과 같이 두 가지다.
1.
이상한 의존 관계로부터 로직을 분리한다.
2.
이후의 리팩토링을 위해 테스트 루틴을 작성하기 쉽도록 봉합부를 작성한다.
자동화 도구를 사용한 메소드 추출 시 잊으면 안 되는 것은 다수의 조잡한 작업들을 안전하게 수행할 수 있다는 점과 세부 처리를 테스트 코드 작성 후로 미룰 수 있다는 점이다.
클래스에 맞지 않아 보이는 메소드에 너무 신경 쓸 필요가 없다. 이런 경우 신규 클래스로 추출해내면 그만이다.

수동 리팩토링

리팩토링 자동화 도구에 의존할 수 없는 경우, 우리는 무엇들을 주의하며 분할 작업을 시도해야할까?
정확성을 직접 검증해야 한다. 이때 도움을 줄 수 있는 것이 테스트 루틴이다.
자주하게 되는 실수 목록은 다음과 같다.
1.
추출한 메소드에 변수를 전달하는 것을 잊는다.
2.
추출된 메소드에 붙인 이름이 기존의 메소드의 이름과 유사하거나 재정의할 가능성이 있다.
3.
매개변수를 전달하거나 반환 값을 대입할 때 실수를 저즈리그 쉽다. 잘못된 값을 반환하는 등 정확성에 문제가 생길 요지가 있다.

감지 변수 도입

임시 변수를 도입하여 리팩토링이 성공적으로 이뤄지고 있는지를 판단하는 테스트 루틴을 작성하기에 용이하게 하라는 느낌이다.
⇒ 즉 메소드 추출을 위해, 테스트 루틴을 작성하기 위해 임시 변수를 도입해! 이런 느낌이었다.

아는 부분 추출하기

차근차근 작은 부분들을 추출해나가면서 괴물 메소드의 사이즈를 줄이는 작업이다.

의존 관계 이삭줍기

의존 관계 수집 기법이라고도 한다.
중요 로직들에 대해 테스트 루틴을 먼저 작성한 후, 중요하지 않은 부분들을 추출한다.

메소드 객체 추출

메소드를 클래스로 추출하는 방법이다..!
음.. 난 좀 별로, 정확하게 파악되지 않은 사항에 대해서 추출해버리는 건 최후의 방법같다.

전략

괴물 메소드를 분할하는 과정에서 코드 구조상에 나타나는 장점과 단점들이다.
조건문을 포함하는 코드에서 추출할 부분을 찾는 경우, 두 방법 중 하나를 선택할 수 있다.
하나는 조건 부분과 처리 부분을 별도로 추출하는 방법과 함께 추출하는 방법이다.

뼈대 메소드

이는 조건 부분과 처리 부분을 별도로 추출하는 방법이다.
이를 통해 추출에 성공하면 기존 메소드에 남는 것이 뼈대, 즉 제어 구조 및 다른 메소드로의 위임 뿐이기 때문에 저자는 뼈대 메소드라고 부른다.
이렇게 하면 나중에 메소드의 로직을 쉽게 재구성할 수 있다.

처리 시퀀스 발견

이는 함께 추출하는 방법이다.
조건 부분과 처리 부분을 묶어서 하나로 취급해버리면 공통의 처리 시퀀스로 취급되어 처리 순서가 더 명확해진다.
저자는 들여쓰기가 불분명한 불릿 메소드에서는 처리 순서를 확인하기 위해 처리 시퀀스를, 조건문이 많아 진입, 진출 지점이 불분명한 혼잡 메소드에는 뼈대 메소드 사용을 검토한다.

우선 현재 클래스 내에서 추출

메소드 추출을 해낼 때, 그 책임이 다른 클래스에게 더 적합해보일때가 있다.
그럴때 참고 일단 현재 클래스 내에서 추출하라는 뜻이다.
⇒ 괜히 다른 거 같이 건들였다가 더 머리가 아파질 것 같긴 하다.

작은 조각 추출

작은 조각부터 먼저 추출하는 것이 좋다고 다시 한 번 강조한다.
티끌모아 태산이듯 작은 코드를 추출하다보면 괴물 메소드를 성공적으로 분해할 수 있다.
인내심을 가지고 하나의 범위에 집중하여 메소드 추출을 수행해내자. 첫 술에 배부를 수 없고 무리하면 되려 더 많은 양의 작업을 해야 되는 법이다.

추출을 다시 할 각오

내가 처음 결정한 전략이 틀렸을 수도 있다. 그렇다고 해서 그 과정이 불필요했던 것은 아니다.
기존 설계에 대한 통찰력, 정보와 앞으로의 방향성이라는 매우 중요한 것을 배울 수 있기 때문이다.