inflearn logo
강의

講義

知識共有

トビーのクリーン・スプリング - ドメインモデルパターンとヘキサゴナルアーキテクチャ Part 1

文書とコードの洗練

도메인 로직으로 분리해도 되나요?

198

iii66029804

投稿した質問数 4

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);
        }
}

java spring spring-boot jpa 리팩토링 ddd

回答 1

2

tobyilee

작성하면서 살짝 고민했던 부분이네요.

강의에서 만든 코드는 사실 애그리거트 내부의 정보를 꺼내오는 코드가 외부에서 사용된다는 점에서 아쉽긴 합니다. 물론 애그리거트 데이터를 조회하는 것 자체는 문제는 아니지만요.

제안해주신 것처럼 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