Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

DDD로 복잡함 다루기

10,450 views

Published on

DDD가 시스템이 복잡해지는 것을 어떻게 완화해주는지 살펴본다.

Published in: Technology
  • Dating direct: ❤❤❤ http://bit.ly/2Qu6Caa ❤❤❤
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Dating for everyone is here: ❶❶❶ http://bit.ly/2Qu6Caa ❶❶❶
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • DOWNLOAD FULL MOVIE, INTO AVAILABLE FORMAT ......................................................................................................................... ......................................................................................................................... ,DOWNLOAD FULL. MOVIE 4K,FHD,HD,480P here { https://tinyurl.com/yybdfxwh }
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

DDD로 복잡함 다루기

  1. 1. DDD로 복잡함 다루기 최범균(madvirus@madvirus.net), 2018-02-07
  2. 2. 발표자 •최범균,madvirus@madvirus.net • 주로자바로먹고살며, • 코딩잘하고싶고,글잘쓰고싶은 • 개발자 2
  3. 3. 내용 •DDD로복잡함다루기 • 복잡한시스템 • DDD소개 • DDD로복잡도낮추기 •대상 • 복잡한시스템을만들어야하는개발자 3
  4. 4. #1 복잡한 시스템 4
  5. 5. 복잡한 시스템 5
  6. 6. 시간이 갈수록 복잡도는 가속화 6
  7. 7. 예: 연통배관 구조(이상) UI 서비스 DAO UI 서비스 DAO UI 서비스 DAO 7
  8. 8. 예: 연통배관 구조(현실) UI 서비스 DAO UI 서비스 DAO UI 서비스 DAO 8
  9. 9. 복잡도가 증가하면 결합도&분석 비용 증가 "로직 중복, (유사)모델 중복, 로직 분산, 뇌 부하" 9
  10. 10. 복잡도가 증가하면 결합도&분석 비용 증가 변경 비용 증가 10
  11. 11. 복잡도가 증가하면 결합도&분석 비용 증가 변경 비용 증가 경쟁력 저하(망함) 11
  12. 12. 필요한 것 •경쟁력을높이기위해여러수준에서 시 스템이복잡해지는것을억제하는방법 변경 비용 시간 12
  13. 13. #2 DDD 소개 13
  14. 14. 도메인 주도 설계 •도메인중심개발 •세가지축 • 유비쿼터스언어UbiquitousLanguage 도메인의언어 • 바운디드컨텍스트Bounded Context 상위수준경계 • 패턴TacticalPattern 도메인모델구현패턴 14
  15. 15. 유비쿼터스 언어 •도메인언어사용 • 대화,문서,코드등모든곳 • 지속적인발견/발전 DigWorkKingInfoinfo= DigWorkKindInfo.builder() .digKind(digKind) ... .build() digWorkReport.changeDigWorkKind(info); 화면에서 이걸 누르면 굴착 종류를 OO로 변경 … 15
  16. 16. 바운디드 컨텍스트 • 기능을구현한소프트웨어/시스템 • 유비쿼터스언어경계 • 언어에컨텍스트를제공 • 바운디드컨텍스트크기/연동 • 조직구조를반영 16 부서/직원 점검 직원부서 조원 리포트 점검 대상
  17. 17. 아키텍처 •도메인모델을도메인영역에모음 도메인응용UI 인프라 17
  18. 18. 도메인 모델 구현 패턴 • 기본모델 • 엔티티 • 밸류 • 개념적인단일모델 • 애그리거트 • 도메인로직 • 객체모델 • 도메인서비스(또는함수형) • 영속 • 리포지토리 18
  19. 19. 엔티티 •중심모델 • 개념적인식별자(ID) • 고정,변하지않음 • 데이터/상태 • 도메인로직에영향(제약조건등) • 자신만의라이프사이클 • 생성상태변경(삭제) 19
  20. 20. 밸류 •개념적으로 하나인데이터집합표현 • 예:주소=주소1+주소2+우편번호 • 예:돈=양+통화 •모델의표현력향상 20
  21. 21. 도메인 로직 •도메인로직을도메인모델에넣기 publicclassBigDigWorkCheck{ ... publicvoidupdate(BigCheckUpdateInfobcUpdInfo){ if(isDecideProgressing()){ thrownew…(); } ... 결제가 진행중이면 수정할 수 없다 접수 상태가 아니면 알림벨 처리를 할 수 없고, 일반 작업이면 배관확인 상태로 아니면 대기 상태가 된다 publicclassDigWorkEocs{ ... publicvoidprocessAlimbell(){ if(isNotReceivedState()){ thrownew…; } this.state=DigKind.isNormal(jobgu)? EocsState.PIPE_CHECK.cd(): EocsState.WAIT.cd(); } 21
  22. 22. 애그리거트 •개별모델을상위수준에서묶는단위  상위 수준에서 모델 이해  한 애그리거트에 속한 객체는 유사한 라이프사이클 22
  23. 23. 애그리거트 •도메인규칙/일관성관리단위 • 애그리거트루트책임 • 외부에서애그리거트내부의구성요소에직 접접근/수정하지못함 • 루트를통해접근 •한애그리거트는자기자신만관리 23
  24. 24. 애그리거트 일관성 범위 예 @Transactional public void regist(BigCheckRegistRequest req) { DigWorkReport report = findDigWork(req); BigDigWorkCheck bigCheck = findBigCheck(req); if (bigCheck != null) { BigCheckUpdateInfo updInfo = …; bigCheck.update( … ); } else { BigDigWorkCheck newBigCheck = registerBigCheckOfReport(report, req); bigCheckRepository.save(newBigCheck); } } /./ 애그리거트 루트 public class BigDigWorkCheck { ... public void update( BigCheckUpdateInfo updInfo) { if (isDecideProgressing()) throw new DecideProgressException(); ... this.joinTimeFrom = updInfo.getJoinTimeFrom(); … this.updateDetails(updInfo.getResults()); } private void updateDetails( List<CheckResult> results) { … // details 수정 } 24
  25. 25. 리포지토리 • 애그리거트의개념적인저장소 • 저장,조회,삭제등기능제공 • ID생성기능제공 • 조건을이용한검색기능제공 • 도메인영역에인터페이스위치 • 실제구현은인프라스트럭처에위치 25
  26. 26. 응용 서비스 • 응용로직흐름제어 • 도메인모델을 사용해서기능구현 • 트랜잭션관리 @Transactional public void regist(BigCheckRegistRequest req) { DigWorkReport report = findDigWork(req); BigDigWorkCheck bigCheck = bigCheckRepository.findOne(…); if (bigCheck != null) { BigCheckUpdateInfo updInfo = …; bigCheck.update( … ); } else { BigDigWorkCheck newBigCheck = registerBigCheckOfReport(report, req); bigCheckRepository.save(newBigCheck); } } 26
  27. 27. 도메인 서비스 •한애그리거트로구현할수없는기능 • 여러애그리거트가관여하는기능 • 외부시스템/외부BC연동기능 •예 • 계좌이체 • 두계좌관여 • 상품가격할인계산 • 상품,쿠폰,회원(등급)관여 27
  28. 28. 도메인 서비스와 구현 •구현기술의존,외부연동이필요하면 인프라영역에구현위치 28
  29. 29. 도메인 이벤트 •도메인모델에서발생한것을표현 • 주로상태변경 • 기능실행후관련이벤트발생 •이벤트와관련된도메인기능 • A하면,B를한다/A할때,B를한다. • 예 • 주문접수하면담당자에게이메일로통지 • 배송시작하면수취인에게카톡보냄 29
  30. 30. 도메인 이벤트 •도메인에서 이벤트발생, •이벤트핸들러가이벤트에반응 30 public class Delivery { public void start() { … Events.raise( new DeliveryStartedEvent( this.id, this.state, this.startingTime) ); } public class EventHandler { public void handle( DeliveryStartedEvent evt) { … // 통지 처리 } }
  31. 31. #3 DDD로 복잡도 낮추기 31
  32. 32. 유비쿼터스 언어 •불필요한해석감소 publicclassDigWorkEocs{ ... publicvoidprocessAlimbell(){ if(isNotReceivedState()){ thrownew…; } this.state= DigKind.isNormal(jobgu)? EocsState.PIPE_CHECK.cd(): EocsState.WAIT.cd(); } publicclassDigWorkEocs{ ... publicvoidchangeState(){ if(!state.equals("20")){ thrownew…; } this.state= jobgu.equals("20")? "30": "60"; } 32
  33. 33. 애그리거트와 모델 이해 •개념적으로 상위수준에서모델이해 • 개별요소의복잡함에빠지는것방지 수정의뢰 거리측정 도면 33
  34. 34. 애그리거트와 응집도 •개념적으로 하나인모델의도메인로직 을단일애그리거트로모음 34 publicvoidalimbell(…){ DigWorkEocsdw=findOne(…); if(dw==null)throw… dw.processAlimbell(); } publicclassDigWorkEocs{ ... publicvoidprocessAlimbell(){ if(isNotReceivedState()){ thrownew…; } this.state=DigKind.isNormal(jobgu)? EocsState.PIPE_CHECK.cd(): EocsState.WAIT.cd(); } publicvoidalimbell(…){ DigWorkEocsdw=findOne(…); if(dw==null)throw… if(!dw.getState().equals("20")){ throw… } dw.setState( dw.getJobgu().equals("20")? "30":"60" ); }
  35. 35. 애그리거트 간 ID 참조 •애그리거트 간연관을ID로처리 • 모델간직접의존을끊음 •결합도감소효과 • 다른모델의수정에따른여파감소 • 다른모델수정가능성차단 • 애그리거트는자기자신만변경 •구현복잡도감소 • 여러애그리거트가필요한조회는별도모 델로구현CQRS 35
  36. 36. 도메인 서비스로 도메인 간 분리 •도메인서비스를사용해서간접의존 • 다른도메인변경에따른영향최소화 36 인프라/외부 변화에 도메인 영향 적음
  37. 37. 도메인 이벤트로 유연함 증가 •핸들러추가로기능추가 •외부시스템과메시지로통합 • 결과적일관성 37 도메인 모델 도메인 이벤트 생성 핸들러 핸들러 서비스 메시징 시스템 BC
  38. 38. 바운디드 컨텍스트로 상위 수준 관계 관리 •상위수준바운디드 컨텍스트통합뷰 38
  39. 39. BC 결과 구조 39 도메인 Agg Agg Svc BC E V E V BC Event 메시징 도메인App BC 인프라 Svc 구현 핸들러 핸들러 App 인프라
  40. 40. DDD와 복잡도 감소 요약 항목 효과 유비쿼터스 언어 뇌부하↓ 애그리거트 뇌부하↓, 응집도↑ 애그리거트 간 ID 참조 결합도↓, 확장성↑ 도메인 서비스 결합도↓ 도메인 이벤트 유연함↑, 결합도↓ BC, 컨텍스트맵 뇌부하↓ 40
  41. 41. 복잡한 시스템에서의 DDD 이점 변경 비용 감소 DDD 학습 비용 41
  42. 42. 맺음말 42 다시 만들어도 잘 만들 수 없고, 잘 만드는 법을 알아야 잘 만든다
  43. 43. 끝 최범균 | madvirus@madvirus.net | http://javacan.tistory.com 43

×