본문 바로가기

DDD/도메인 주도 설계 철저 입문

앱 서비스 인터페이스로 구현하기 - 「도메인 주도 설계 철저 입문」 6장 (4)

 

 

 

본 포스트 시리즈는 「도메인 주도 설계 철저 입문」책을 요약한 내용입니다.

 

 

이전 발행 글 보기

 

 

더보기

2024.09.02 - [DDD/도메인 주도 설계 철저 입문] - 도메인 주도 설계란? - 「도메인 주도 설계 철저 입문」 1장

2024.09.04 - [DDD/도메인 주도 설계 철저 입문] - 도메인 주도 설계란? - 「도메인 주도 설계 철저 입문」 2장 (1)

2024.09.05 - [DDD/도메인 주도 설계 철저 입문] - 도메인 주도 설계란? - 「도메인 주도 설계 철저 입문」 2장 (2)

2024.09.09 - [DDD/도메인 주도 설계 철저 입문] - 도메인 주도 설계란? - 「도메인 주도 설계 철저 입문」 3장 (1)

2024.09.09 - [DDD/도메인 주도 설계 철저 입문] - 도메인 주도 설계란? - 「도메인 주도 설계 철저 입문」 3장 (1)

2024.09.11 - [DDD/도메인 주도 설계 철저 입문] - 도메인 주도 설계란? - 「도메인 주도 설계 철저 입문」 3장 (2)

2024.09.30 - [DDD/도메인 주도 설계 철저 입문] - 도메인 주도 설계란? - 「도메인 주도 설계 철저 입문」 4장

2024.09.30 - [DDD/도메인 주도 설계 철저 입문] - 도메인 주도 설계란? - 「도메인 주도 설계 철저 입문」 5장 (1)

2024.09.30 - [DDD/도메인 주도 설계 철저 입문] - 도메인 주도 설계란? - 「도메인 주도 설계 철저 입문」 5장 (2)

2024.09.30 - [DDD/도메인 주도 설계 철저 입문] - 도메인 주도 설계란? - 「도메인 주도 설계 철저 입문」 5장 (3)

2024.10.05 - [DDD/도메인 주도 설계 철저 입문] - 도메인 주도 설계란? - 「도메인 주도 설계 철저 입문」 6장 (1)

2024.10.05 - [DDD/도메인 주도 설계 철저 입문] - 도메인 주도 설계란? - 「도메인 주도 설계 철저 입문」 6장 (2)

2024.10.06 - [DDD/도메인 주도 설계 철저 입문] - 도메인 주도 설계란? - 「도메인 주도 설계 철저 입문」 6장 (3)

 

 

 


 

06장 유스케이스를 구현하기 위한 '애플리케이션 서비스'

 

(4) 애플리케이션 서비스 구현 Tip

 

 

인터페이스로 구현하기

다음은 앱 서비스를 인터페이스로 구현한 경우 클라이언트가 이를 사용하는 코드이다.

public class Client {
    private IUserRegisterService userRegisterService;

    public Client(IUserRegisterService userRegisterService) {
        this.userRegisterService = userRegisterService;
    }

    public void register(String name) {
        UserRegisterCommand command = new UserRegisterCommand(name);
        userRegisterService.handle(command);
    }
}

 

 

인터페이스 구현 이유

도메인 주도 설계 철저 입문 144p

앱 서비스를 인터페이스로 구현하면 첫째, 앱 서비스의 구현이 끝나기 전에 클라이언트 측이 `MockUserRegisterService`를 만들어 개발을 진행할 수 있어 효율적이다. 둘째, 예외가 발생했을 때 예외 처리에 대한 개발을 진행하기 위해 `ExceptionUserRegisterService`를 개발하여 사용할 수 있다.

 

 

무상태로 구현하기

앱 서비스는 자기 자신을 변화시키는 것이 목적이 아니다. 프로그램 유저의 문제를 해결하기 위한 '행동'이다. 따라서 다음과 같이 구현하는 것은 바람직하지 않다. 

public class UserApplicationService {
	
    (...생략...)
    private boolean sendMail;

    (...생략...)
    public void register(UserRegisterCommand command) {
        
        (...생략...)
        // 메일 발송 설정이 활성화된 경우 메일을 발송
        if (sendMail) {
            MailUtility.send("user registered");
        }
    }
}

 

`sendMail`의 값은 서비스의 행동에 직접적으로 영향을 미치므로, `Register` 메소드를 사용할 때 서비스 인스턴스 상태를 신경쓰게 된다.

 

그렇다고 앱 서비스가 아무런 상태도 가지지 않는 것은 아니다. 다음 코드에서는 `UserApplicationService`가 `userRepository` 인스턴스를 가지지만, 이는 자신의 행동을 변화시키는 상태가 아니므로 문제 없다.

public class UserApplicationService {
    private final IUserRepository userRepository;
    (...생략...)
}

 

 


 

 

요약

 

1. 앱 서비스는 인터페이스로 구현할 경우 개발 생산성이 향상될 수 있다.

2. 앱 서비스는 자기 자신에게 변화를 주는 상태를 가져선 안된다.