Salesforce에서 실현되는 Domain Driven Design(DDD)

참조 관계



Salesforce에서 DDD를 구현한 경우의 참조 관계는 다음과 같습니다.



인프라층(오렌지)

DB나 외부 API에 접속하는 부분이 됩니다.
DAO도 여기에 해당합니다.

도메인 계층(녹색)

시스템의 지식을 가진 클래스가 해당됩니다.
도메인 계층은 두 가지로 나뉩니다.
・도메인 모델
  ⇒행동·룰을 가진 오브젝트
・도메인 서비스
  ⇒ 도메인 모델로 표현할 수 없는 처리를 여기에 쓴다
Salesforce에서는 sObject가 가장 도메인 모델에 가깝다고 생각합니다.
그래서 도메인 모델 클래스는 만들지 않습니다.
도메인 서비스는 sObject를 보조하는 클래스로 만듭니다. (밸리데이션 체크 등이 해당)

애플리케이션 레이어(블루)

여기에서는 시스템의 유스 케이스에 대응하는 클래스가 해당합니다.

UI/Batch/Trigger/GlobalAPI 계층(회색)

유스 케이스 처리를 호출하는 클라이언트 계층입니다.
Salesforce에서는 UI(Visualforce, LightningComponent 등), Batch, Trigger, GlobalAPI(Apex의 외부 공개 커스텀 API)가 해당됩니다.

높은 수준에서 낮은 수준으로 의존

의존성은 높은 수준(보다 인간에 가까운 움직임)에서 낮은 수준(더 기계에 가까운 움직임)으로 참조합니다.
각각의 패턴으로부터 들어온 유스 케이스를 저차원의 처리를 사용해 해결하겠습니다.

샘플 앱



요구사항

■Contact Create Page
・Contact 레코드를 작성할 수 있다
・「Account Phone」이 같은 Account 레코드가 이미 존재하고 있는 경우는, 그 레코드를 Contact 레코드에 묶는다
・「Account Phone」이 같은 Account 레코드가 없는 경우는, 작성해 그 레코드를 Contact 레코드에 묶는다



■Contact Table
· Contact Create Page로 작성한 레코드가 표시됨


클래스 구성



다음은 샘플 앱의 소스 코드입니다.
htps : // 기주 b. 코 m / 마사 야 팬 / ぇ s fur r-d d mp

처리 개요



■Contact Create Page
LWC 프레임워크로 개발하고 있습니다.
컨트롤러(dddContactCreateController.cls)는 최상위 회색 레이어에 해당합니다.
여기에서 ContactApplicationService(응용 프로그램 계층)의 유스 케이스 처리(createNewDddContact)를 호출합니다.
public with sharing class dddContactCreateController {
    public dddContactCreateController() {

    }

    @AuraEnabled
    public static String clickAction( String AccountName, String AccountPhone, String LastName, String FirstName ){
        ContactApplicationService contactAppService = new ContactApplicationService();
        return contactAppService.createNewDddContact(AccountName, AccountPhone, LastName, FirstName);
    }
}


createNewDddContact는 도메인 계층(sObject 및 ObjectService 계층)과 인프라 계층(DAO)을 활용하여 유스 케이스를 구현합니다.
    public Id createNewDddContact( String AccountName, String AccountPhone, String LastName, String FirstName ){

        //If there is not an Account record, create it.
        AccountService accountService = new AccountService();
        Account targetAccount = new Account( Name = AccountName, Phone = AccountPhone );
        List<Account> sameAccounts = new List<Account>( accountService.getSameAccount(targetAccount) );
        if( sameAccounts.size() == 1){
            targetAccount = sameAccounts[0];
        } else if( sameAccounts.size() == 0 ){
            insert targetAccount;
        } else {
            throw new ContactApplicationServiceException('Phone ' + AccountPhone + ' is duplicated' );
        }

        Contact contact = new Contact(AccountId = targetAccount.Id, LastName = LastName, FirstName = FirstName, LeadSource = 'DDD' );
        insert contact;
        return contact.Id;
    }


더 자세한 것은 Github의 소스 코드를 봐 주셨으면 합니다.

요약



쟈-와 써 보았습니다, 아직도 브러쉬 업해야 할 점은 가득합니다!
부디 코멘트 받을 수 있으면 기쁩니다.

좋은 웹페이지 즐겨찾기