작업 중 맞닥뜨린 소소한 고민들을 기록합니다.
예시로 작성한 로직은 실제 코드를 간단히 요약하거나, 필요에 따라 변형한 내용임을 밝힙니다!
기존 로직은 Post
라는 데이터를 조회 시, 해당 Post
가 모든 검증 조건을 통과했는지를 함께 반환
→ PostValidator
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();
}
}
}
→ 검증 조건을 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();
}
}
}
PostValidator
생성시 PostMetaDataPolicy
주입PostValidator
를 생성하는 외부 로직을 모두 바꾸어야 함PostValidator
생성자 변경 없이, 내부에서 PostMetaDataPolicy
생성→ PostValidator
생성자 변경 없이, 내부에서 PostMetaDataPolicy
생성
PostValidator
의 validation 로직 변경은 내부로 한정[ 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();
}
}