도메인 로직으로 분리해도 되나요?
198
投稿した質問数 4
해당 코드에서 자기 자신의 프로필 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
2
작성하면서 살짝 고민했던 부분이네요.
강의에서 만든 코드는 사실 애그리거트 내부의 정보를 꺼내오는 코드가 외부에서 사용된다는 점에서 아쉽긴 합니다. 물론 애그리거트 데이터를 조회하는 것 자체는 문제는 아니지만요.
제안해주신 것처럼 Member에 프로필 값을 체크하는 메소드를 만드는 것도 하나의 방법입니다. 그런데 이 방식을 선택하지 않은 이유는 회원 도메인이 가지는 로직으로 이런 것까지 만들어야 하는가라는 의문이 들었기 때문입니다. 왜 Member는 프로필을 비교하는 메소드를 가져야 할까 생각해보면, 좀 과도하지 않은가라는 생각이 들었던 거죠.
그래서 우선은 프로필 업데이트에 적용할 검증 로직을 서비스 계층으로 빼뒀습니다. 리포지토리를 사용해야 하는 것도 이유이고요. 그래도 프로필 값을 비교하는 부분을 도메인쪽으로 빼서 좀 더 단순하게 구성한다면, 이럴 땐 차라리 검증을 담당하는 MemberValidator 갈은 도메인 서비스를 하나 사용하는 게 더 적절할 것 같긴합니다. 근데 그렇게까지 만드는 게 당장엔 조금 과도한 작업으로 느껴져서 이건 나중에 리팩터링을 고민해보자는 생각으로 우선은 넣지 않았습니다. 그렇게 도메인 서비스까지 도입을 하지 않더라도 다음 두 줄은 메소드를 추출해서 더 의미를 드러내는 게 낫지 않았을까 싶네요.
Profile currentProfile = member.getDetail().getProfile();
if (currentProfile != null && currentProfile.address().equals(profileAddress)) return;
파트 2에서 리팩터링을 한번 해보겠습니다. 좋은 제안 해주셔서 감사합니다.
도메인 모델에서 관계와 규칙을 구분하는 방법
0
33
2
헥사고날 아키텍처에서의 배치, 시큐리티, 비동기 이벤트 처리는 어떻게 하나요?
0
109
2
어댑터에서 도메인에 직접 의존하는 경우에 대해
0
112
2
Member 도메인이 PasswordEncoder를 받는 구조 질문 있습니다.
0
98
2
MemberService와 EmailSender 책임 분리에 대한 질문
0
100
2
NonNullApi를 NullMarked로 대체하라고 합니다.
0
120
2
39. 문서와 코드 다듬기 updateInfo 테스트 질문 있습니다.
0
70
2
Repository Adapter 설계에 대해 피드백을 부탁드립니다
0
102
2
헥사고날 part2 강의 출시 예정일 문의 드립니다.
0
242
2
PT 문의사항
0
95
1
초기 어플리케이션 구동 시 compose.yml 파싱 오류
0
146
2
애플리케이션의 JPA 리턴과 도메인 모델
0
124
2
애그리거트 루트의 하위 도메인들의 depth가 깊어질 때 문의
0
132
2
페이징 처리를 해야한다면 어떻게 해야할까요?
0
185
2
애그리거트의 repository
0
115
2
Domain Expert가 정확히 어떤 역할을 하는 사람인가요?
0
224
1
회원 애플리케이션 서비스 테스트 (1)
0
101
2
정적 팩토리 메서드 관련 질문드립니다!
0
102
2
spotbug + @NonNullApi 로만 Null 방어가 될까요?
0
125
2
required 포트에 관해서
0
87
2
혹시 다음 편은 언제쯤 오픈할까요?
0
161
2
서비스 단위 테스트 코드 작성
0
92
2
domain 모듈에 entity를 정의한다고 했을때
0
91
2
여러 엔티티의 조합으로 리포트를 제공해야할 때
0
75
2

