[ 코드 작성 중 소소했던 고민 ] #1. 검증 조건 사용처 통일하기

toto9602·4일 전
1

소소한 고민

목록 보기
1/1

작업 중 맞닥뜨린 소소한 고민들을 기록합니다.
예시로 작성한 로직은 실제 코드를 간단히 요약하거나, 필요에 따라 변형한 내용임을 밝힙니다!

필요했던 기능

  1. 기존 로직은 Post 라는 데이터를 조회 시, 해당 Post 가 모든 검증 조건을 통과했는지를 함께 반환
    PostValidator

  2. Post 데이터의 일부 내용을 수정 시, 검증 조건에 맞지 않는 경우 에러를 내는 로직을 추가해야 함.

맞닥뜨린 문제

  • Post 조회시, 검증 조건 통과 확인을 담당하는 PostValidator를 새로 추가한 UpdatePostMetaDataValidator에서 재사용 불가
    • 생성자로 Post의 모든 정보를 받아, 일부 내용만을 수정하는 로직에서 초기화할 수 없음

[ PostValidator.java ]

import lombok.RequiredArgsConstructor 

@RequiredArgsConstructor 
public class PostValidator {
  private final String title;
  private final String description;
  private final List<String> tags; 
  private final List<String> categories;
  
  public boolean validateTitle() {
  	return title.length() >= 20;
  }
  
  public boolean validateDescription() {
  	return description.length() >= 100;
  }
  
  public boolean validateTags() {
  	return !tags.isEmpty()
  }
  
  public boolean validateCategories() {
    return categories.size() >= 2
  }
}

[ UpdatePostMetaDataValidator.java ]

public class UpdatePostMetaDataValidator {
	public boolean validateUpdateRequest(
      List<String> tags, 
      List<String> categories
    ) {
    
     if (tags.isEmpty()) {
       throw new IllegalArgumentException();
     }
     
     if (categories.size() < 2) {
       throw new IllegalArgumentException();
     }
   }
}

1차 수정

→ 검증 조건을 PostMetaDataPolicy로 분리하기

[ PostMetaDataPolicy.java ]

public record PostMetaDataPolicy(
  List<String> tags, 
  List<String> categories) {
  
  public boolean isValidTags() {
    return !tags.isEmpty();
  }
  
  public boolean isValidCategories() {
    return categories.size() >= MIN_CATEGORIES_LENGTH;
  }
  
  private static final int MIN_CATEGORIES_LENGTH = 2;
}

[ UpdatePostMetaDataValidator.java 수정 ]

public class UpdatePostMetaDataValidator {
	public boolean validateUpdateRequest(
      List<String> tags, 
      List<String> categories
    ) {
    PostMetaDataPolicy policy = new PostMetaDataPolicy(
                                         tags, 
                                         categories
                                 );
    
     if (!policy.isValidTags()) {
       throw new IllegalArgumentException();
     }
     
     if (!policy.isValidCategories()) {
       throw new IllegalArgumentException();
     }
   }
}

2번째 고민

  1. PostValidator 생성시 PostMetaDataPolicy 주입
    • PostValidator를 생성하는 외부 로직을 모두 바꾸어야 함
  2. PostValidator 생성자 변경 없이, 내부에서 PostMetaDataPolicy 생성
    • RequiredArgsConstructor를 사용할 수 없어, 반복적인 코드 추가 필요

결론

PostValidator 생성자 변경 없이, 내부에서 PostMetaDataPolicy 생성

  • 입력값이 달라지지 않은 상황으로, PostValidator의 validation 로직 변경은 내부로 한정
    • 외부 로직은 변경하지 않기
    • Lombok 사용 여부도 내부 변경으로만 해결이 가능

[ PostValidator.java 수정 ]

public class PostValidator {
  private final String title;
  private final String description;
  private final PostMetaDataPolicy policy;
  
  public PostValidator(
    String title, 
    String description,
    List<String> tags, 
    List<String> categories
  ) {
     this.title = title;
     this.description = description;
     this.policy = new PostMetaDataPolicy(tags, categories);
  }
  
  public boolean validateTitle() {
  	return title.length() >= 20;
  }
  
  public boolean validateDescription() {
  	return description.length() >= 100;
  }
  
  public boolean validateTags() {
  	return policy.isValidTags();
  }
  
  public boolean validateCategories() {
    return policy.isValidCategories();
  }
}
profile
주니어 백엔드 개발자입니다! 조용한 시간에 읽고 쓰는 것을 좋아합니다 :)

0개의 댓글