도메인 검증은 유틸성 validator가 따로 필요한가?

Hyunta·2022년 2월 21일
2

자동차 경주 미션

목록 보기
5/7

util 패키지/클래스/메서드의 역할과 갖춰야 할 요건들에 대해 고민해보시면 좋겠어요.

일반적으로 프로젝트 내의 여러 부분에서 공통적으로 필요로 하는 작업들을 주로 util이라는 패키지에 두는데요. 예를 들면 시간을 변환하는 작업(특정 타임존의 시간으로 변환하거나, Unix epoch를 LocalDateTime 등으로 변환하는 등)이 있습니다.

위 문장에서 알 수 있듯, util 클래스는 보통 프로젝트 내라면 어디서든지 호출될 수 있기 때문에 한 메서드를 수십군데에서 호출하는 경우도 생깁니다.

이러한 특징으로 인해 구현이 변경될 경우 미치는 파급력 또한 큰데요. 그렇기 때문에 구현은 최대한 단순하고, 변경 가능성이 매우 낮으면서도 도메인 로직과는 관계 없는 작업을 수행해야 합니다.

CarNameValidator는 이러한 요건에 부합할까요?

Car를 생성할 때 이름에 대한 제약사항들이 있었다.

  • 이름은 5자 이하여야한다.
  • 빈 이름은 들어올 수 없다.
  • 중복된 이름은 없어야한다.
  • 이름이 하나만 있으면 안된다.

해당 요구사항들을 맞추기 위해서 CarNameValidator 라는 정적 클래스를 생성했었는데 과연 static 으로 처리해야하는 과정인지에 대한 의문이 생겼다.

  1. 자동차 이름을 검증하는 기능은 Car에서 밖에 쓰일 수 없다. 따라서 util 패키지안에 위치하는 것은 바람직하지 않다.
  2. Car객체를 생성할 때 검증해야 하는 유효성은 밀접한 로직 아닌가? 클래스로 분리하는 것은 오히려 응집성을 떨어뜨리는 것 아닌가?
public class CarNameValidator{
  public static void validateCarNames(String[] splitCarNames) {
          checkOnlyName(splitCarNames);
          checkDuplicateName(splitCarNames);
          ...
      }

      private static void checkOnlyName(String[] names) {
          if (names.length == 1) {
              throw new IllegalArgumentException(ERROR_ONLY_NAME);
          }
      }

      private static void checkDuplicateName(String[] names) {
          Set<String> hashNames = new HashSet<>(Arrays.asList(names));
          if (hashNames.size() != names.length) {
              throw new IllegalArgumentException(ERROR_DUPLICATE_NAME);
          }

          ...
      }
}
  1. util 패키지의 역할
    피드백을 요약하자면 util 패키지의 클래스는 어디서든 사용될 수 있기 때문에 최대한 보편성을 갖고 있어야하며, 도메인 로직과 결합도가 낮아야 한다.
    하지만 CarNameValidator는 이름부터 도메인의 생성 로직과 연관성이 높고, 보편성이 없으므로 util 패키지에는 어울리지 않는다.

  2. CarCarNameValidator는 분리되어 있어야 하는가?
    처음에는 코드가 같이 있으면 위험할거라 생각했다. 코드의 길이가 길어지고 검증하는 과정을 수정할 때 도메인 내부의 로직을 신경써야될 것 처럼 보였기 때문이다.
    하지만 오히려 분리되어있다보니 CarCarNameValidator를 의존하게되고 응집도를 떨어뜨리게됐다. 반대로 검증하는 과정과 생성하는 과정이 같이 위치하는 것이 응집도를 높이다 생각하여 CarNameValidator를 삭제하고 해당 기능을 도메인 내부로 옮겼다.

profile
세상을 아름답게!

1개의 댓글

comment-user-thumbnail
2023년 3월 12일

안녕하세요! 우테코 5기 폴로입니다.
utils 패키지 관련해서 검색을 해보다가 우연히 들어오게 되었네요.
현재 utils 패키지 관련 포스팅을 하고 있는데 괜찮으시다면 제 포스팅에 해당 글의 링크를 사용해도 될까요?

답글 달기