0. 개요

한 프로젝트의 취약점을 분석하고 Hotfix를 해야하는 상황이 있었습니다. 그 프로젝트의 코드의 복잡도가 너무 심하다고 느껴 잘못 건드렸다가 더 큰 오류를 낼 것 같을 정도로 고칠 엄두가 나지 않았는데요. 여러 부분에서 리팩토링이 필요했습니다. 본 글에서는 여러 리팩토링 방식 중 검증 방식을 분리하여 단순화하는 내용을 다룹니다. 개선점을 도출하고 이를 해결하는 방안으로서 시도한 과정 및 결과를 소개합니다.

1. 목차

  1. 개요
  2. 목차
  3. 배경
    1. 기존 코드
    2. 개선점 도출
  4. 해결 아이디어
  5. 1차 변경 → 애노테이션 방식
  6. 2차 변경 → Optional을 이용한 방식
  7. 결론

2. 배경

데이터 처리 서비스의 DataHandler 클래스에서 데이터 처리 로직이 구현되어 있습니다. 이 클래스는 다양한 검증 로직을 포함하고 있습니다. 검증 로직을 보다 효율적으로 수행하기 위해 고려해볼 점들이 있었습니다.

1. 기존 코드

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 &gt; 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());
        }
    }

2. 개선점 도출