[DDD START] 6장 응용 서비스와 표현 영역 - 응용 서비스의 구현

응용 서비스의 구현

응용 서비스의 크기

응용 서비스는 보통 다음 두 가지 방법 중 한 가지 방식으로 구현한다

응용 서비스의 인터페이스가 필요한가?

응용 서비스는 표현 영역에서 필요한 데이터만 리턴하는것이 좋다

표현 영역에 의존하지 않는다

도메인 영역에서 발생시킨 이벤트를 처리한다

예)암호 초기화 기능은 다음과 같이 암호 변경 후 “암호 변경됨” 이벤트를 발생시킬 수 있다

public class Member {

    private Password password;

    public void initializePassword() {
        String newPassword = generateRandomPassword();
        this.password = new Password(newPassword);
        Events.raise(new PasswordChangedEvent(this.id, password))
    }
}

응용 서비스는 이벤트를 받아서 후처리를 한다

public class InitPasswordService {
    
    @Transactional
    public void initializePassword(String memberId) {
        Events.handle((PasswordChangeEvent evt) ->  {
            // evt.getId() 에 해당하는 회원에게 이메일 발송하는 기능 구현
        });
    }
}

왜 이벤트를 사용하지?

이벤트를 사용하지 않은 코드

public class InitPasswordService {
    
    @Transactional
    public void initializePassword(String memberId) {
        Member member = memberRepository.findById(memberId);
        checkMemberExists(member);
        member.initializePassword(); // 이벤트 발생하지 않음
        sendNewPasswordMailToMember(member); // 이메일 발송 
    }
}

응용 서비스가 사용자 요청 기능을 실행하는데 별다른 기여를 못한다면 응용 서비스를 만들지 않고 바로 도메인 리포지토리에 접근해도 된다

public class OrderController {

    private OrderViewDao orderViewDao;

    @RequestMapping("/myorders")
    public String list(ModelMap model) {
        String OrdererId = SecurityContext.getAuthentication().getId();
        List<OrderView> orders = orderViewDao.selectByOrderer(ordererId);
    }
}

Reference