본문 바로가기
Test Code

[Java] JUnit을 이용한 테스트 및 리팩토링

by bkuk 2023. 3. 2.

리팩토링(Refactoring)?

현재까지 대부분의 애플리케이션 구현과정을 돌이켜보면 요구사항을 만족하는 코드를 구현하면 개발을 완료했었다. 하지만 요구사항을 만족하는 코드를 구현했다고 개발이 완료된 것이 아니다. 소스코드를 구현했으면 반드시 뒤따라야 하는 과정이 중복을 제거하고, 읽기 좋은 코드를 구현하기 위해 구조를 변경하는 리팩토링이다.

리팩토링이란 소스코드의 가독성을 높이고 유지보수를 편하게 하기 위해 소스코드의 구조를 변경하는 것을 의미한다. 따라서, 아래와 같은 요구사항에 맞춰서 리팩토링을 진행해보자.

  • 메서드가 한가지 책임만 가지도록 구현하자.
  • 인덱트(indent, 들여쓰기) 깊이를 1단계로 유지하자. 인덴트는 while 문과 if문을 사용할 경우 인덴트 깊이가 1씩 증가한다. 예를 들면, 아래 코드의 인덴트 깊이는 2이다.
void someMethod() {
	while(true) {
    	if(true) {
        }
    }
}
  • else를 사용하지 말자. 프로그래밍을 구현할 때 else를 사용하지 않고 프로그래밍 하는 것은 가능하다.

리팩토링을 위한 예제

  • 문자를 구분자로 분리한 후 각 숫자의 합을 구해 반환
    1. 쉼표(,) 또는 클론(:)을 구분자로 가지는 문자열을 전달하는 경우 구분자를 기준으로 분리한 후 숫자의 합 반환
    2. 문자열 계산기에 음수를 전달하는 경우 RuntimeException으로 예외 처리

요구사항만 보면 그리 복잡하지 않다. 아래와 같은 코드를 작성했다.

public class StringCalculator {
	int add( String str ) {
		String[] array = null;
		int result = 0;
		if( str == null || str.equals(" ")) {
			return 0;
		}
		array = str.split(",|:");
		for( String i : array ) {
			if( Integer.parseInt(i) < 0 ) {
				throw new RuntimeException();
			}
			result += Integer.parseInt(i);
		}
		return result;
	}
}

 

위 코드를 아래와 같이 리팩토링 했다.

극단적으로 리팩토링을 했지만, 개인적으로 깔끔하고, 읽기 좋은 코드로 구현되었다. 

public class StringCalculator_2 {
	
	int add( String str ) {
		if( isBlank(str) ) {
			return 0;
		}
		return sum(toInts(split(str)));
	}

	private boolean isBlank(String str) {
		return str == null || str.equals(" ");
	}

	private String[] split(String str) {
		String[] array  = str.split(",|:");
		return array;
	}
	
	private int[] toInts( String[] values ) {
		int[] numbers = new int[values.length];
		for (int i = 0; i < values.length; i++) {
			int number = toPositive(values[i]);
			numbers[i] = number;
		}
		return numbers;
	}

	private int toPositive(String value ) {
		int number = Integer.parseInt(value);
		if( number < 0 ) {
			throw new RuntimeException();
		}
		return number;
	}

	private int sum(int[] numbers) {
		int result = 0;
		for( int number : numbers ) {
			result += number;
		}
		return result;
	}

}

댓글