Recommended
PDF
PDF
효율적인 빅데이터 분석 및 처리를 위한 Glue, EMR 활용 - 김태현 솔루션즈 아키텍트, AWS :: AWS Summit Seoul 2019
PDF
Amazon Dynamo DB 활용하기 - 강민석 :: AWS Database Modernization Day 온라인
PDF
AWS Summit Seoul 2023 | 갤럭시 규모의 서비스를 위한 Amazon DynamoDB의 역할과 비용 최적화 방법
PDF
PDF
Handling iframes using selenium web driver
PPTX
스프링 JPA 강좌(Spring Data JPA 간단 예제)
PDF
AWS로 사용자 천만 명 서비스 만들기 (윤석찬)- 클라우드 태권 2015
PDF
데이터베이스 운영, 서버리스로 걱정 끝! - 윤석찬, AWS 테크에반젤리스트 - AWS Builders Online Series
PPTX
LOD (linked open data) part 2 lod 구축과 현황
PDF
AWS Fargate on EKS 실전 사용하기
PDF
PDF
게임을 위한 최적의 AWS DB 서비스 소개 Dynamo DB, Aurora - 이종립 / Principle Enterprise Evang...
PDF
What is Apache Spark | Apache Spark Tutorial For Beginners | Apache Spark Tra...
PDF
20190319 AWS Black Belt Online Seminar Amazon FSx for Lustre
PDF
AWS Summit Seoul 2023 | 데이터, 분석 및 AI를 통합하는 단 하나의 레이크하우스, Databricks on AWS 로 ...
PDF
LODAC 2017 Linked Open Data Workshop
PPTX
REST Easy with Django-Rest-Framework
PDF
20200826 AWS Black Belt Online Seminar AWS CloudFormation
PDF
PPTX
PDF
AWS Summit Seoul 2023 | 롯데면세점이 고객에게 차별화된 경험을 제공하는 방법: AWS Native 서비스를 활용한 초개인...
PDF
AWS Black Belt Online Seminar 2017 AWS Storage Gateway
PDF
Neo4j in Production: A look at Neo4j in the Real World
PDF
20210119 AWS Black Belt Online Seminar AWS CloudTrail
PDF
PPTX
PDF
20190522 AWS Black Belt Online Seminar AWS Step Functions
PDF
PDF
Ddd start 부록 지앤선&ksug
More Related Content
PDF
PDF
효율적인 빅데이터 분석 및 처리를 위한 Glue, EMR 활용 - 김태현 솔루션즈 아키텍트, AWS :: AWS Summit Seoul 2019
PDF
Amazon Dynamo DB 활용하기 - 강민석 :: AWS Database Modernization Day 온라인
PDF
AWS Summit Seoul 2023 | 갤럭시 규모의 서비스를 위한 Amazon DynamoDB의 역할과 비용 최적화 방법
PDF
PDF
Handling iframes using selenium web driver
PPTX
스프링 JPA 강좌(Spring Data JPA 간단 예제)
PDF
AWS로 사용자 천만 명 서비스 만들기 (윤석찬)- 클라우드 태권 2015
What's hot
PDF
데이터베이스 운영, 서버리스로 걱정 끝! - 윤석찬, AWS 테크에반젤리스트 - AWS Builders Online Series
PPTX
LOD (linked open data) part 2 lod 구축과 현황
PDF
AWS Fargate on EKS 실전 사용하기
PDF
PDF
게임을 위한 최적의 AWS DB 서비스 소개 Dynamo DB, Aurora - 이종립 / Principle Enterprise Evang...
PDF
What is Apache Spark | Apache Spark Tutorial For Beginners | Apache Spark Tra...
PDF
20190319 AWS Black Belt Online Seminar Amazon FSx for Lustre
PDF
AWS Summit Seoul 2023 | 데이터, 분석 및 AI를 통합하는 단 하나의 레이크하우스, Databricks on AWS 로 ...
PDF
LODAC 2017 Linked Open Data Workshop
PPTX
REST Easy with Django-Rest-Framework
PDF
20200826 AWS Black Belt Online Seminar AWS CloudFormation
PDF
PPTX
PDF
AWS Summit Seoul 2023 | 롯데면세점이 고객에게 차별화된 경험을 제공하는 방법: AWS Native 서비스를 활용한 초개인...
PDF
AWS Black Belt Online Seminar 2017 AWS Storage Gateway
PDF
Neo4j in Production: A look at Neo4j in the Real World
PDF
20210119 AWS Black Belt Online Seminar AWS CloudTrail
PDF
PPTX
PDF
20190522 AWS Black Belt Online Seminar AWS Step Functions
Viewers also liked
PDF
PDF
Ddd start 부록 지앤선&ksug
PDF
Tensorflow regression 텐서플로우 회귀
PDF
PDF
PDF
PDF
PDF
PDF
PDF
PDF
Event source 학습 내용 공유
PPTX
PPTX
Ddd start! 6장. 응용 서비스와 표현 영역
PPTX
PDF
PDF
스프링 시큐리티 구조 이해
PPTX
7가지 동시성 모델 - 6장. 순차 프로세스 통신
PDF
도메인 주도 설계의 본질
PDF
PDF
우리가 모르는 노드로 할 수 있는 몇가지
Similar to DDD 준비 서문래
PDF
PPTX
PPT
Daejeon IT Developer Conference Hibernate3
PPTX
PDF
PDF
PDF
PPTX
Event Storming and Implementation Workshop
PPT
Daejeon IT Developer Conference Hibernate3
PDF
Domain-Driven-Design 정복기 1탄
PDF
Domain-Driven-Design 정복기 1탄
PPTX
PDF
PPTX
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
PDF
PPTX
PPTX
반복적인 코드 작업 자동화, Codebone으로 손쉽게
PDF
PDF
PDF
Ksug2015 - JPA2, JPA 기초와매핑
More from beom kyun choi
PDF
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
PDF
PDF
PDF
PDF
PDF
PDF
PDF
차원축소 훑어보기 (PCA, SVD, NMF)
PDF
PDF
PDF
PDF
PDF
PDF
PDF
Okjsp 13주년 발표자료: 생존 프로그래밍 Test
PDF
PDF
DDD 준비 서문래 1. 2. 3. 4. 5. 6. 이해하기 쉬운 용어
• 향후코드이해에유리한용어선택
• 가능하면간결한단어
• 어려운영어,모호한영어<발음대로영어표기
• 예:CivilAppeal<Minwon
• 예:Kind,Type,Class,…<Gubun
6DDD 소개@서문래
7. 언어 = 도메인, 컨텍스트
• 언어는특정도메인이나컨텍스트에서의미
• 같은대상도도메인에따라다른용어
• 카탈로그의고객,주문의구매자
• 같은용어도도메인에따라다른의미
• 배송의상품은실물,카탈로그의상품은정보
• 도메인에맞는용어선택에는노력필요
• 도메인전문과와의대화
• 대화에출현한단어와(레거시)코드가불일치하면바꾸는노력
7DDD 소개@서문래
8. 언어의 발전
• 도메인에대한새로운이해
• 코드에반영,언어에반영
public class Order {
public voidchangeShippingInfo(
ShippingInfonewShippingInfo){
if (state== OrderState.PAYMENT_WAITING||
state== OrderState..PREPARING){
this.shippingInfo= newShippingInof;
} else {
thrownew IllegalStateException();
}
}
public class Order {
public voidchangeShippingInfo(
ShippingInfonewShippingInfo){
verifyNotYetShipped();
this.shippingInfo = newShippingInof;
}
public voidcancel() {
verifyNotYetShipped();
this.state= OrderState.CANCELED;
}
privatevoid verifyNotYetShipped(){
if (state!= OrderState.PAYMENT_WAITING&&
state!= OrderState.PREPARING)
throw new IllegalStateException();
}
"결제대기거나물건준비중일때"
배송지를변경할수있다.
"배송을아직하지않았으면"
배송지를변경할수있다,주문을취소할수있다.
8DDD 소개@서문래
9. 10. 11. 도메인 모델
• 도메인의구성요소를개념적으로표현한것
• 도메인의이해를바탕으로만들어짐
• 구현과정에서점진적으로상세화
• 소프트웨어모델
• 다양한관점에서의모델
• 정적인모델
• 클래스다이어그램,ER다이어그램
• 동적인모델
• 커뮤니케이션다이어그램,시퀀스다이어그램
• 상태다이어그램
11DDD 소개@서문래
12. 단순 데이터 모델
• 일부개념이사라짐
• 단순속성나열
• 반쪽
• 중요도메인기능/제약
이드러나지않음
Order
------------------------
-id:String
-state:String
-totalAmounts:int
-receiverName:String
-receiverPhoneNumber;String
-shipAddr1:String
-shipAddr2:String
-shipZipcode:String
-ordererName:String
-ordererId:String
Product
--------------
-id:String
-listPrice:int
12DDD 소개@서문래
13. 도메인 모델에 필요한 것
• 표현력
• 최대한중요개념이드러나도록
• 도메인용어를최대한모델에반영
• 불필요한번역/해석이발생하지않도록모델구축
• 기능
• 객체모델,함수
• 동적측면/제약조건표현
• 상태다이어그램등을활용
13DDD 소개@서문래
14. 15. 16. 17. 연통 배관 * 계층 구조
UI 서비스 DAO
UI 서비스 DAO
UI 서비스 DAO
• 참고 자료: http://www.slideshare.net/gyumee/ss-55616001
17DDD 소개@서문래
18. 고수준 모듈, 저수준 모듈
• 고수준모듈
• 어떤의미있는
단일기능을
제공하는모듈
• 저수준모듈
• 고수준모듈의
기능을구현하기
위해필요한
하위기능의
실제구현
18DDD 소개@서문래
19. 20. 21. 22. (DDD의) 영역
영역 설명
표현(UI) 사용자의 요청을 해석해서 다른 영역에 처리를
위임하고, 결과를 사용자에 알맞게 변환해서
전달한다.
사용자에게 보여지는 흐름을 제어한다.
응용 사용자의 요청을 처리할 기능을 구현한다. 처
리 흐름을 구현하며, 도메인 로직은 도메인 영
역에 위임한다.
도메인 도메인 로직을 구현한다. 엔티티, 밸류, 애그리
거트, 리포지토리, 도메인 서비스가 위치한다.
인프라스트럭처 DBMS 연동, REST 클라이언트와 같은 구현 기
술을 다룬다. DIP 구조에서 저수준 모듈이 이
영역에 위치한다.
22DDD 소개@서문래
23. 24. 25. 26. 27. 28. DDD의 모델 구성 요소
• 기본모델
• 엔티티
• 밸류
• 모델의묶음
• 애그리거트
• 기능
• 객체모델
• 도메인서비스
• 영속
• 리포지토리
28DDD 소개@서문래
29. 엔티티로 중심 모델 만들기
• 엔티티의특징
• 식별자(ID)를가짐
• 식별자는바뀌지않음
• 데이터/상태를가짐
• 자기만의라이프사이클을가짐
• (주로)엔티티의상태에따라다르게동작함
• (주로)DB테이블과1대1관계를가짐
• 대표적인예
• 주문,회원,제품
29DDD 소개@서문래
30. 밸류로 모델 표현력 증가하기
• 개념적으로하나인데이터집합을표현
• 예,주소,배송지,돈
Order
------------------------
-id:String
-state:String
-totalAmounts:int
-receiverName:String
-receiverPhoneNumber;String
-shipAddr1:String
-shipAddr2:String
-shipZipcode:String
-ordererName:String
-ordererId:String
Address
------------------------
-addr1:String
-addr2:String
-zipcode:String
Receiver
------------------------
-name:String
-phoneNumber;StringShippingInfo
-------------------
-receiver:Receiver
-address:Address
Order
------------------------
-id:String
-state:String
-totalAmounts:Money
-shippingInfo:ShippingInfo
-orderer:Orderer
Money
----------
-value:int
Orderer
----------
-name:String
-id:String
30DDD 소개@서문래
31. 모델에 기능 넣기
• 메서드로기능과제약표현
public class Order {
public void changeShippingInfo(ShippingInfo newShippingInfo) {
verifyNotYetShipped();
setShippingInfo(newShippingInfo);
}
private void verifyNotYetShipped() {
if (state != OrderState.PAYMENT_WAITING || … )
throw new IllegalArgumentException("already shipped");
}
private void setShippingInfo(ShippingInfo si) {
this.shippingInfo = si;
}
…
31DDD 소개@서문래
32. 도메인 모델의 공개 set 메서드 없애기
• 도메인코드의공개set/get메서드는
• 핵심개념이나의도를사라지게만듬
• completePayment()vssetOrderState()
• 절차지향이되기쉬움
• verifyNotYetShipped()vsgetOrderState()!=WAITING_PAYMENT
• set/get메서드기능/제약을표현하는메서드
• 필요한경우get과is같은데이터제공메서드사용
• 영역경계간데이터를전달하기위한DTO와구분
32DDD 소개@서문래
33. 34. 35. 36. 37. 38. 애그리거트 루트
• 도메인규칙과일관성을유지하는주체
• 애그리거트루트를통해서만애그리거트내부상태변경
• 애그리거트외부에기능을제공
public class Order {
public void changeShippingInfo(ShippingInfo newShippingInfo) {
verifyNotYetShipped();
setShippingInfo(newShippingInfo);
}
private void verifyNotYetShipped() {
if (state != OrderState.PAYMENT_WAITING || … )
throw new IllegalArgumentException("already shipped");
}
private void setShippingInfo(ShippingInfo si) {
this.shippingInfo = si;
}
…
38DDD 소개@서문래
39. 애그리거트 루트
• 애그리거트에속한객체를
이용해서기능구현
• 애그리거트에속한다른
객체에위임
• 애그리거트에속한다른
객체의상태를조회
• 밸류객체는객체자체를
교체하는방법이쉬움
public class Member {
private Password password;
public void changePassword(
String curPw,
String newPw) {
if (!password.match(curPw)) { // 위임
throw new NotMatchingException();
}
// 상태 변경
this.password = new Password(newPw);
}
…
39DDD 소개@서문래
40. 애그리거트의 크기, 경계
• 주로한개엔티티와소수의밸류객체로구성
• N개엔티티객체로구성되는경우는흔치않음
• has로보이는1-N관계는서로다른애그리거트인지
확인필요
• M-N관계는연관객체가어느애그리거트에속하는
지확인필요
40DDD 소개@서문래
41. 42. 리포지토리 인터페이스
• 리포지토리는애그리거트(루트)단위로존재
• OrderOrderRepository,MemberMemberRepository
• 테이블단위로존재하는것이아님
• 리포지토리의주요메서드
• save(Userorder)
• UserfindOne(Stringemail)
• List<User>findByJoinDateBetween(Datefrom,Dateto)
• List<User>findBySpec(Specificationspec)
• Page<User>findByName(Stringname)
• voidremove(Useruser)
42DDD 소개@서문래
43. 리포지토리 구현 기술: JPA
• 애그리거트를RDBMS와매핑하기에무난한기술
• 애노테이션기반설정(XML보다자바설정선호)
• 밸류에대한매핑설정/확장지원
• @Embeddable
• AttributeConverter
• 콜렉션지원
• 엔티티간1-1,1-N,N-M지원
• 연관엔티티에대한영속성전파
43DDD 소개@서문래
44. Spring Data JPA
• 반복작업제거
• 인터페이스만만들면구현객체는런타임에생성
• 정해진규칙에따라인터페이스정의
• JPQL,네이티브쿼리실행가능
• 페이징,스펙(+QueryDSL)지원
44DDD 소개@서문래
45. 스펙
• 검색조건을표현
• 개별검색조건을하나의스펙으로표현
• 검색조건의의미가잘드러남
• And,Or를이용한스펙조합
• 주로조회기능에서활용
• SpringDataJPA스펙지원
• 설명:http://goo.gl/7R4SYO
Specification<OnlineTest> nameSpec = nameLike("중간고사");
Specification<OnlineTest> yearSpec = yearBetween(2011, 2016);
Specifications<OnlineTest> specs = where(nameSpec);
specs = specs.and(yearBetween);
List<OnlineTest> test = onlineRepository.findAll(specs);
45DDD 소개@서문래
46. 애그리거트는 완전체
• 리포지토리는완전한애그리거트를다룸
• 로딩시점에애그리거트에속한모든연관객체로딩
• 즉,엔티티나콜렉션에대해EAGER로딩기본사용
• 기능구현에따라안전한경우에한해LAZY로딩
• 저장시점에애그리거트에속한모든연관객체저장
• 삭제시점에애그리거트에속한모든연관객체삭제
save(onlineTest)
find(id)
46DDD 소개@서문래
47. 애그리거트 간 연관
• 애그리거트간연관:애그리거트루트를참조
• 직접참조보다는ID참조선호
• 몇가지이유
• 편한탐색오용방지
• 성능에대한고민제거
• 시스템확장시유리
public class Reserve {
private Customer reserver;
…
public class Reserve {
private CustomerId reserverId;
…
47DDD 소개@서문래
48. 애그리거트 간 연관: ID 참조
• 연관된애그리거트와의조합이필요한기능
• 상태변경기능
• 응용서비스에서조합처리
• 도메인서비스고려
• 여러애그리거트함께조회
• 조회전용DAO고려
48DDD 소개@서문래
49. 사고 방식 추가
• 조인,데이터애그리거트,기능
• 애그리거트단위로기능구현
• 기능에서객체의상태를변경
• 루트에서다른객체에위임
• 한개모델조회,명령
• CQRS
• 조회전용DTO/DAO
49DDD 소개@서문래
50. 51. 52. 응용 서비스의 구현
• 도메인객체를사용한기능구현
• 리포지토리에서애그리거트루트를구하고
• 애그리거트루트의기능을실행
@Service
public class ActivateOperatorService {
private OperatorRepository operatorRepository;
@Transactional
public void activate(String operatorId) {
// 애그리거트 루트를 구하고
Operator operator = operatorRepository.findOne(operatorId);
if (operator == null)
throw new OperatorNotFoundException();
// 도메인 기능을 실행
operator.activate();
}
52DDD 소개@서문래
53. 응용 서비스의 입력과 출력
• 메서드파라미터
• 기능을수행하는데필요한데이터
public class ChangePasswordService {
public void changePassword(
String id,
String curPw,
String newPw) {
Member member = findMember(id);
member.changePassword(curPw, newPw);
}
...
public class PlaceOrderService {
public OrderNo placeOrder(OrderRequest req) {
OrderNo id = createNextOrderNo();
Order order = createOrder(id, req);
orderRepository.save(order);
return id;
}
...
* 도메인의 엔티티를 서비스의 파라미터로 사용하지 말 것
* 딱 들어맞는 경우로만 제한
53DDD 소개@서문래
54. 응용 서비스의 입력과 출력
• 리턴
• 요청처리결과를사용자에게보여줄경우응답제공
• 예,새로생성한주문의ID,주문목록
• 고민거리
• 도메인객체리턴vsUI에노출할데이터만담은객체리턴
• 구현편의성,팀표준,성능등고려
• 조회전용모델검토
• 익셉션은실패를의미
• 응용서비스나도메인에서발생
54DDD 소개@서문래
55. 응용 서비스와 트랜잭션
• 트랜잭션담당
public class ChangePasswordService {
@Transactional
public void changePassword(ChangePasswordRequest request) {
Member member = findExistingMember(request.getMemberId());
member.changePassword(
request.getCurrentPassword(),
request.getNewPassword());
}
...
* 고민거리 : Open Session In View
55DDD 소개@서문래
56. 응용 서비스에 도메인 로직 넣지 않기
• 도메인로직이나제약을구현하면안됨!
public class ActivateOperatorService {
private OperatorRepository operatorRepository;
@Transactional
public void activate(String operatorId) {
Operator operator = operatorRepository.findOne(operatorId);
if (operator == null)
throw new OperatorNotFoundException();
if (operator.isDeleted() || operator.isActivated()) {
throw new RuntimeException();
}
operator.setActivated(true);
// operator.activate()에 들어가야 할 제약 검사
}
56DDD 소개@서문래
57. 몇 가지 고민할 것
• 서비스
• 크기
• 도메인단위로기능몰아넣기vs기능군별로서비스구분
• 인터페이스필요여부
• 인터페이스 +구현클래스
• 그냥클래스만
• 서비스vs표현vs도메인
• 값검증
• 권한검사
57DDD 소개@서문래
58. 59. 60. 61. BC 간 관계
• 서비스공급자,고객
• 상류,하류
• 공개호스트서비스
OpenHostService
• 안티코럽션레이어
AnticorruptionLayer
• 공유커널
SharedKernel
• 독립방식
SeparateWay
61DDD 소개@서문래
62. 63. 64.