복잡한 비즈니스 도메인과 REST API를 지원 해야하는 응용 프로그램 (REST가 아니라 리소스 지향)을 설계하려고합니다. 리소스 모델 방식으로 도메인 모델을 노출시키는 방법을 찾는 데 어려움이 있습니다.
DDD에서 도메인 모델의 클라이언트는 절차 적 '응용 프로그램 서비스'계층을 거쳐 엔티티 및 도메인 서비스로 구현 된 모든 비즈니스 기능에 액세스해야합니다. 예를 들어 User 엔터티를 업데이트하는 두 가지 방법이있는 응용 프로그램 서비스가 있습니다.
userService.ChangeName(name);
userService.ChangeEmail(email);
이 응용 프로그램 서비스의 API는 상태가 아닌 명령 (동사, 프로 시저)을 제공합니다.
그러나 동일한 애플리케이션에 RESTful API를 제공해야하는 경우 다음과 같은 사용자 자원 모델이 있습니다.
{
name:"name",
email:"email@mail.com"
}
자원 지향 API는 명령이 아닌 상태를 노출 합니다 . 이로 인해 다음과 같은 문제가 발생합니다.
REST API에 대한 각 업데이트 조작은 자원 모델에서 업데이트되는 특성에 따라 하나 이상의 Application Service 프로 시저 호출에 맵핑 될 수 있습니다.
각 업데이트 작업은 REST API 클라이언트에 대한 원자적인 것처럼 보이지만 그렇게 구현되지는 않았습니다. 각 응용 프로그램 서비스 호출은 별도의 트랜잭션으로 설계되었습니다. 자원 모델에서 하나의 필드를 업데이트하면 다른 필드의 유효성 검사 규칙이 변경 될 수 있습니다. 따라서 모든 자원 모델 필드를 함께 유효성 검증하여 모든 잠재적 응용 프로그램 서비스 호출이 유효한지 확인해야합니다. 한 번에 일련의 명령을 검증하는 것은 한 번에 하나씩 수행하는 것보다 훨씬 덜 간단합니다. 개별 명령조차도 모르는 클라이언트에서 어떻게합니까?
다른 순서로 Application Service 메소드를 호출하면 다른 영향을 줄 수 있지만 REST API는 차이가없는 것처럼 보입니다 (하나의 자원 내).
더 비슷한 문제가 발생할 수 있지만 기본적으로 모두 같은 문제로 인해 발생합니다. 응용 프로그램 서비스를 호출 할 때마다 시스템 상태가 변경됩니다. 유효한 변경의 규칙, 엔터티가 다음 변경을 수행 할 수있는 작업 집합입니다. 자원 지향 API는 모든 것을 원자 연산처럼 보이게합니다. 그러나이 격차를 극복하는 복잡성은 어딘가에 가야만한다.
또한 UI가 명령 지향적 인 경우가 많으며 종종 클라이언트 측의 명령과 리소스를 매핑 한 다음 API 측으로 다시 매핑해야합니다.
질문 :
- 이 모든 복잡성을 (두껍고) REST-to-AppService 맵핑 계층으로 처리해야합니까?
- 아니면 DDD / REST에 대한 이해가 부족합니까?
- REST는 단순히 (매우 낮은) 복잡성에 걸쳐 도메인 모델의 기능을 노출시키는 데 실용적이지 않을 수 있습니까?