도메인주도개발
[DDD] 도메인 로직을 넣지 않기!
OverTheHorizon3410
2024. 1. 19. 15:50
암호 변경기능
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가지이다
- 코드의 응집성의 저하
- 도메인 데이터와 관련된 로직이 분산되어 있으며, 도메인 로직을 이해하기 위하여 여러 영역을 분석해야할 가능성이 있음.
- 코드의 중복
- 여러 응용 서비스에서 해당 도메인 로직을 구현하는 경우, 같은 메서드에서 다른 의미의 기능이 탄생할 수 있습니다.
잘못된 예시
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