[DDD] 도메인 로직을 넣지 않기!

암호 변경기능

public class ChangePasswordService {
    public void changePassword(String memberId, String oldPw, String newPw) {
        Member member = memberRepository.findById(memberId);
        checkMemberExists(member);
        member.changePassword(oldPw, newPw);
    }
}
  • changePassword 의 경우 Member 애그리거트에서 수행중이다.

왜 Member 애그리거트에서 해당 행위를 수행할까?

이유는 2가지이다

  1. 코드의 응집성의 저하
    1. 도메인 데이터와 관련된 로직이 분산되어 있으며, 도메인 로직을 이해하기 위하여 여러 영역을 분석해야할 가능성이 있음.
  1. 코드의 중복
    1. 여러 응용 서비스에서 해당 도메인 로직을 구현하는 경우, 같은 메서드에서 다른 의미의 기능이 탄생할 수 있습니다.

잘못된 예시

public class DeactivationService {
    public void deactivate(String memberId, String oldPw) {
        Member member = memberRepository.findById(memberId);
        checkMemberExists(member);
        if (!passwordEncoder.matches(oldPw, member.getPassword())) {
            throw new BadPasswordException();
        }
        member.deactivate();
    }
}
  • 패스워드 비교를 응용 서비스 영역에서 수행
    • .. 뭐 만약 그럴일은 적겠지만, 패스워드 비교하는 로직이 변경되는 경우 해당 로직부분을 전부 탐색해서 리팩토링해줘야함;;

Uploaded by N2T