한 프로젝트의 취약점을 분석하고 Hotfix를 해야하는 상황이 있었습니다. 그 프로젝트의 코드의 복잡도가 너무 심하다고 느껴 잘못 건드렸다가 더 큰 오류를 낼 것 같을 정도로 고칠 엄두가 나지 않았는데요. 여러 부분에서 리팩토링이 필요했습니다. 본 글에서는 여러 리팩토링 방식 중 검증 방식을 분리하여 단순화하는 내용을 다룹니다. 개선점을 도출하고 이를 해결하는 방안으로서 시도한 과정 및 결과를 소개합니다.
데이터 처리 서비스의 DataHandler
클래스에서 데이터 처리 로직이 구현되어 있습니다. 이 클래스는 다양한 검증 로직을 포함하고 있습니다. 검증 로직을 보다 효율적으로 수행하기 위해 고려해볼 점들이 있었습니다.
GetPriceHandler
클래스는 충전 가격과 관련된 정보를 검증하고 처리하는 역할을 담당합니다. 클래스 내에서는 AssertUtil.isTrue()
나 AssertUtil.isNull()
과 같은 메서드를 통해 검증 로직을 수행하고 있습니다.
DataHandler
클래스는 데이터 처리와 관련된 검증 로직을 수행합니다. 클래스 내에서는 ValidationUtil.checkTrue()나 ValidationUtil.checkNull() 같은 메서드를 통해 검증을 수행합니다.
@Service
@Slf4j
public class DataHandler {
private final DataServiceClient dataServiceClient;
private final DataAnalysisClient dataAnalysisClient;
// 클래스 구현 ...public String processData(RequestPayload requestPayload) {
// 아주 길고 긴 데이터 처리 로직 ...ValidationUtil.checkTrue(validCondition, "Invalid condition");
// 로직 계속 ... 약 100 줄...
}
}
/**
* 조건이 참인지 검사하는 함수 조건이 거짓일 경우 예외 발생
* <pre class="code">Assert.isTrue(i > 0, "The value must be greater than zero");</pre>
*
* @param expression a boolean expression
* @param message the exception message to use if the assertion fails
* @throws Exception - ILLEGAL_ARGUMENT
*/
public class ValidationUtil {
try {
// 검증 메서드 구현 ...
}
public static void isTrue(boolean expression, String message) {
try {
Assert.isTrue(expression, message);
} catch (IllegalArgumentException e) {
raiseException(ResponseCode.ILLEGAL_ARGUMENT, e.getMessage());
}
}