작성
·
142
·
수정됨
1
해당 코드에서 자기 자신의 프로필 address와 비교하는 로직을 도메인에게 맡기는 건 어떨까요? 토비님! 이렇게 해도 되는건지 아니면 따로 빼신 이유가 있으신 지 궁금합니다.
private void checkDuplicateProfile(Member member, String profileAddress) {
if (profileAddress.isEmpty()) return;
Profile currentProfile = member.getDetail().getProfile();
if (currentProfile != null && currentProfile.address().equals(profileAddress)) return;
if (memberRepository.findByProfile(new Profile(profileAddress)).isPresent()) {
throw new DuplicateProfileException("이미 존재하는 프로필 주소입니다: " + profileAddress);
}
}
이런 식으로요!
private void checkDuplicateProfile(Member member, String profileAddress) {
if (profileAddress.isEmpty()) return;
if (!member.isProfileNull() && member.isProfileEquals(profileAddress)) return;
if (memberRepository.findByProfile(new Profile(profileAddress)).isPresent()) {
throw new DuplicateProfileException("이미 존재하는 프로필 주소입니다: " + profileAddress);
}
}
답변 1
1
작성하면서 살짝 고민했던 부분이네요.
강의에서 만든 코드는 사실 애그리거트 내부의 정보를 꺼내오는 코드가 외부에서 사용된다는 점에서 아쉽긴 합니다. 물론 애그리거트 데이터를 조회하는 것 자체는 문제는 아니지만요.
제안해주신 것처럼 Member에 프로필 값을 체크하는 메소드를 만드는 것도 하나의 방법입니다. 그런데 이 방식을 선택하지 않은 이유는 회원 도메인이 가지는 로직으로 이런 것까지 만들어야 하는가라는 의문이 들었기 때문입니다. 왜 Member는 프로필을 비교하는 메소드를 가져야 할까 생각해보면, 좀 과도하지 않은가라는 생각이 들었던 거죠.
그래서 우선은 프로필 업데이트에 적용할 검증 로직을 서비스 계층으로 빼뒀습니다. 리포지토리를 사용해야 하는 것도 이유이고요. 그래도 프로필 값을 비교하는 부분을 도메인쪽으로 빼서 좀 더 단순하게 구성한다면, 이럴 땐 차라리 검증을 담당하는 MemberValidator 갈은 도메인 서비스를 하나 사용하는 게 더 적절할 것 같긴합니다. 근데 그렇게까지 만드는 게 당장엔 조금 과도한 작업으로 느껴져서 이건 나중에 리팩터링을 고민해보자는 생각으로 우선은 넣지 않았습니다. 그렇게 도메인 서비스까지 도입을 하지 않더라도 다음 두 줄은 메소드를 추출해서 더 의미를 드러내는 게 낫지 않았을까 싶네요.
Profile currentProfile = member.getDetail().getProfile();
if (currentProfile != null && currentProfile.address().equals(profileAddress)) return;
파트 2에서 리팩터링을 한번 해보겠습니다. 좋은 제안 해주셔서 감사합니다.