public class User {
private String email;
public Result changeEmail(String newEmail){
if(Company.isEmailCorporate(newEmail) == false)
return Result.Failure("Incorrect email domain");
email = newEmail;
return Result.Success();
}
}
public class Company {
public boolean isEmailCorporate(String email){
...
}
}
public class UserController {
public String changeEmail(int userId, String newEmail){
User user = userRepository.getById(userId);
Result result = user.changeEmail(newEmail);
if(result.isFailure) return "fail";
return "ok";
}
}
위와 같이 도메인에 애플리케이션의 비즈니스 로직이 모두 포함되는 것을 풍부한 도메인(Rich Domain) , 완전한 도메인이라 부른다.
위와 같은 도메인의 특징은, 도메인 로직 단편화(Domain Logic Fragmentation) 가 일어나지 않는다.
도메인 로직 단편화란? - 도메인 계층이 아닌 다른 계층에 도메인 로직이 있는 경우
위 예에서 UserController에 로직을 포함하지 않고 조합하는 역할만 한다.
public class UserController {
public String changeEmail(int userId, String newEmail){
User existingUser = userRepository.getByEmail(newEmail);
if(existingUser != null && existingUser.id != userId){
return "email is already taken";
}
User user = userRepository.getById(userId);
Result result = user.changeEmail(newEmail);
if(result.isFailure) return "fail";
return "ok";
}
}
public class User {
private String email;
public Result changeEmail(String newEmail, UserRepository repository){
if(Company.isEmailCorporate(newEmail) == false)
return Result.Failure("Incorrect email domain");
User existingUser = repository.getByEmail(newEmail);
if(existingUser != null && existingUser.id != userId){
return "email is already taken";
}
email = newEmail;
return Result.Success();
}
}
public class User {
private String email;
public Result changeEmail(String newEmail, List<User> allUsers){
if(Company.isEmailCorporate(newEmail) == false)
return Result.Failure("Incorrect email domain");
boolean existingUser = allUsers.any(x -> x.email == newEmail);
if(existingUser != null && existingUser.id != userId){
return "email is already taken";
}
email = newEmail;
return Result.Success();
}
}
모든 검증이 도메인 계층에 있고, 순수하며 완벽하다
여기서 트릴레마가 작용한다. 다음 세 가지 속성을 모두 가질 수는 없다
3가지 옵션 , 각각 2가지 속성만 충족
도메인 완전성보단 순수성을 선택 권장 → 도메인 로직 단편화가 덜하다.
컨트롤러와 도메인에 비즈니스 로직을 분할해야하는 이유
출처 : https://enterprisecraftsmanship.com/posts/domain-model-purity-completeness/