SlideShare a Scribd company logo
1 of 26
12 모델과
                  디자인 패턴의 연결



12년	 11월	 3일	 토
디자인패턴의 활용
                  • 디자인패턴은 순수 기술적 용어로 작성됨.

                  • 도메인 모델링과 디자인에서
                   디자인패턴 일부를 적용할 수 있음.

                  • DDD에서 사용할려면, 아래 2가지 측면으로 볼 수 있음

                   ‣ 코드안에서 적용되는 기술적 디자인 패턴.

                   ‣ 모델안에서 적용되는 개념적 패턴.


12년	 11월	 3일	 토
Strategy
                  (A.K.A. Policy)

                       • 알고리즘군을 정의.

                       • 각 알고리즘을 캡슐화.

                       • 알고리즘을 교체가능하도록.




12년	 11월	 3일	 토
Strategy
                  • 도메인 모델에서 적절한 프로세스를 교체할 수 있어야 함.

                  • 수많은 프로세스중에서
                   적절한 프로세스를 선택하는 것은 어렵다.

                  • 하나의 프로세스가
                   여러가지 업무를 혼합하여 수행하면 모델링하기 어렵다.

                  • 프로세스의 주 개념에서 변경되는 부분을 분리.



12년	 11월	 3일	 토
Strategy

                  • 프로세스의 변화되는 부분을
                   모델내에서 "Strategy" 오브젝트로 격리.

                  • 프로세스의 행위와 규칙을 분리.

                  • "Strategy" 패턴에 맞게 변경되는 부분을 구현.

                  • 이러한 구현은 각각 다른 방법으로 업무를 수행.



12년	 11월	 3일	 토
경로 탐색 정책

                                           • Routing Service는
                                             경로 리스트를 생성.

                                           • 가장 빠른 경로 리스트,
                                             가장 저렴한 경로 리스트.

            findFastest(Specification):Itinerary
            findCheapest(Specification):Itinerary



12년	 11월	 3일	 토
경로 탐색 정책




                  find(Specification, LegMagnitudePolicy):Itinerary

12년	 11월	 3일	 토
주의점

                  • 도메인 레이어에 기술적 디자인 패턴 적용시,
                   레이어를 추가해서 작업해라.

                  • 추가된 레이어에 전략과 정책을 넣고 분리해라.

                  • 객체가 늘어난다면, 공유하여 사용할 수 있도록,
                   객체에 상태를 가지지 않도록 만들어라.




12년	 11월	 3일	 토
Composite

                        • 부분과 전체를 표현
                         하기 위함.

                        • 개별 객체와 복합
                         개체를 동일하게 처
                         리.




12년	 11월	 3일	 토
Composite

                  • 복잡한 도메인인 경우,
                   중요한 오브젝트는 임의의 깊이를 가지는
                   부분 오브젝트들이 중첩되어 구성된다.

                  • 각 레벨 오브젝트는 구분할 수 도 있지만,
                   각 부분 오브젝트를 동일한 하나의 전체로 다룰 수 있다.




12년	 11월	 3일	 토
Composite 미적용
                  • 모델에 중첩된 컨테이너의 연관성이 반영되지 않으면,
                   각 계층의 공통된 행위는 중복되고, 유연성이 떨어진다.

                  • 컨테이너가 다른 컨테이너를 포함할 수 없고,
                   컨테이너를 포함할 수 있는 깊이는 고정된다.

                  • 클라이언트 입장에서는 개념적으로 차이가 없어도,
                   각 계층마다 다른 인터페이스로 관리하고,
                   정보를 수집하기 위한 순회 작업은 복잡해진다.




12년	 11월	 3일	 토
Composite 적용

                  • COMPOSITE의 모든 개체를 포함하는 추상타입을 정의.

                  • 컨테이너는 정보를 수집하고 반환하는 메소드 정의하고,
                   "단말" 노드는 자신이 가진 정보를 기반하여 구현.

                  • 클라이언트는 추상 타입과 통신하며,
                   컨테이너와 단말을 구별할 필요가 없다.




12년	 11월	 3일	 토
여러 경로로
                  구성된 배송 경로




12년	 11월	 3일	 토
12년	 11월	 3일	 토
12년	 11월	 3일	 토
12년	 11월	 3일	 토
12년	 11월	 3일	 토
12년	 11월	 3일	 토
13. 더 심층적인
                  통찰력을 향한 리팩터링

                  • 심층적인 리팩터링을 하기 위해서.

                   ‣ 도메인에 주력하라.

                   ‣ 다른 관점으로 현상과 사물을 바라보도록 노력하라.

                   ‣ 도메인 전문가와 지속적으로 대화하라.




12년	 11월	 3일	 토
리팩터링

                  • 한두명의 개발자가 코드를 보며 개선의 여지를 찾차 수정하
                   고, 테스트하여 검증한다.

                  • 리팩터링 과정에서 도메인에 대한 통찰력을 추구하면 더 폭
                   넓은 컨텍스트를 만들 수 있다.




12년	 11월	 3일	 토
시작

                  • 도메인 전문가없이 작성된 모델과,
                   새로운 요구 사항이 자연스럽게 추가되지 못하는 상황에서

                  • 개발자는 근본적으로 도메인 모델에서 개념이 빠져거나,
                   관계에 오류가 있다고 가정한다.

                  • 도메인을 심층적으로 이해한 개발자가 더 명쾌하고 유용한
                   모델로 만드는 것이 리팩터링이다.




12년	 11월	 3일	 토
조사팀
                  • 코드 변경에 착수한 개발자는 뛰어난 2명의 개발자를 선발.

                  • 도메인 전문가도 참여.

                  • 30분에서 1시간 30분정도 브레인스토밍 진행.

                  • UML, 시나리오 진행.

                  • 만족스러운 결과라면 코드로 구현.



12년	 11월	 3일	 토
선행 기술
                  • 브레인스토밍, 서적, 실무 개발자의 추상적인 개념등으로
                   부터 정보를 얻을 수 있다.

                  • 분석 패턴을 통해 다른 이의 경험을 활용.
                   현재 도메인의 소프트웨어를 개발한 경험을 활용.

                  • 디자인패턴이 구현 요구와 모델 개념에 적합할 경우 활용.

                  • 수학이나 술어 로직.



12년	 11월	 3일	 토
개발자를 위한 설계

                  • 다른 코드와 통합, 반복적 코드 수정, 심층적인 리팩터링을
                   통해 유연한 설계

                  • 유연한 설계는 설계의 의도, 코드의 영향 예측, 정신적 부담
                   을 줄임.

                  • 가장 빈번하게 발생하는 부분은 유연하게,
                   자주 변경되지 않는 부분은 단순하게.




12년	 11월	 3일	 토
타이밍

                  • 수정하기 위해 완벽할 때까지 기다리지 마라.

                   ‣ 도메인을 이해하고 있는 바가 설계에
                     적용되지 않은 경우.

                   ‣ 중요한 개념이 설계상에 암시적으로 표현된 경우.

                   ‣ 설계상 중요 부분이 더 유연하게 만들 수 있는 경우.



12년	 11월	 3일	 토
위기를 기회로
                  • 리팩터링이 안정적인 상태로 진행되는 것 처럼 보이지만,
                   심층적인 통찰력을 향한 리팩터링은 그렇지 않다.

                  • 모델을 일정 기간동안 꾸준히 정제하다 보면,
                   모든 것을 뒤흔드는 통찰력을 얻는다.

                  • 위기로 보이는 이 시점에서 더 훌륭한 모델을 생각해낼 수
                   있다.

                  • 그리고 지속적인 정제 과정이 다시 시작된다.


12년	 11월	 3일	 토

More Related Content

Similar to Ddd ch12-13

Event Storming(이벤트 스토밍)
Event Storming(이벤트 스토밍)Event Storming(이벤트 스토밍)
Event Storming(이벤트 스토밍)종일 김
 
Domain driven design ch3
Domain driven design ch3Domain driven design ch3
Domain driven design ch3HyeonSeok Choi
 
도메인주도설계
도메인주도설계도메인주도설계
도메인주도설계Wonjun Hwang
 
9장 도메인 주도 설계
9장 도메인 주도 설계9장 도메인 주도 설계
9장 도메인 주도 설계Hyosung Jeon
 
(11th korea data_tech_seminar)using_mongo_db_4.0_and_nosql_inbum_kim(skc&c)
(11th korea data_tech_seminar)using_mongo_db_4.0_and_nosql_inbum_kim(skc&c)(11th korea data_tech_seminar)using_mongo_db_4.0_and_nosql_inbum_kim(skc&c)
(11th korea data_tech_seminar)using_mongo_db_4.0_and_nosql_inbum_kim(skc&c)InBum Kim
 
애자일 프랙티스
애자일 프랙티스애자일 프랙티스
애자일 프랙티스한 경만
 
차정민 (소프트웨어 엔지니어) 이력서 + 경력기술서
차정민 (소프트웨어 엔지니어) 이력서 + 경력기술서차정민 (소프트웨어 엔지니어) 이력서 + 경력기술서
차정민 (소프트웨어 엔지니어) 이력서 + 경력기술서Jeongmin Cha
 
[Dev rookie]designpattern
[Dev rookie]designpattern[Dev rookie]designpattern
[Dev rookie]designpattern대영 노
 
도메인 주도 설계 - DDD
도메인 주도 설계 - DDD도메인 주도 설계 - DDD
도메인 주도 설계 - DDDMyeongdon Joo
 
Domain driven design 8장
Domain driven design 8장Domain driven design 8장
Domain driven design 8장kukuman
 
Pycon korea 2018 kaggle tutorial(kaggle break)
Pycon korea 2018 kaggle tutorial(kaggle break)Pycon korea 2018 kaggle tutorial(kaggle break)
Pycon korea 2018 kaggle tutorial(kaggle break)Yeonmin Kim
 
[I3 d]07 service_design_discover_
[I3 d]07 service_design_discover_[I3 d]07 service_design_discover_
[I3 d]07 service_design_discover_shalala46
 
Domain-Driven Design 훑어보기 Part 1
Domain-Driven Design 훑어보기 Part 1Domain-Driven Design 훑어보기 Part 1
Domain-Driven Design 훑어보기 Part 1Sangwon Ko
 
2장. 의사소통과 언어 사용
2장. 의사소통과 언어 사용2장. 의사소통과 언어 사용
2장. 의사소통과 언어 사용kidoki
 
C++ 코딩의 정석.pptx
C++ 코딩의 정석.pptxC++ 코딩의 정석.pptx
C++ 코딩의 정석.pptxsung suk seo
 
SNU UX Lab 패턴랭귀지 (The origin of Pattern Language)
SNU UX Lab 패턴랭귀지 (The origin of Pattern Language)SNU UX Lab 패턴랭귀지 (The origin of Pattern Language)
SNU UX Lab 패턴랭귀지 (The origin of Pattern Language)Hyun-Soo Ji
 

Similar to Ddd ch12-13 (20)

Event Storming(이벤트 스토밍)
Event Storming(이벤트 스토밍)Event Storming(이벤트 스토밍)
Event Storming(이벤트 스토밍)
 
Domain driven design ch3
Domain driven design ch3Domain driven design ch3
Domain driven design ch3
 
도메인주도설계
도메인주도설계도메인주도설계
도메인주도설계
 
9장 도메인 주도 설계
9장 도메인 주도 설계9장 도메인 주도 설계
9장 도메인 주도 설계
 
Refactoring
RefactoringRefactoring
Refactoring
 
(11th korea data_tech_seminar)using_mongo_db_4.0_and_nosql_inbum_kim(skc&c)
(11th korea data_tech_seminar)using_mongo_db_4.0_and_nosql_inbum_kim(skc&c)(11th korea data_tech_seminar)using_mongo_db_4.0_and_nosql_inbum_kim(skc&c)
(11th korea data_tech_seminar)using_mongo_db_4.0_and_nosql_inbum_kim(skc&c)
 
애자일 프랙티스
애자일 프랙티스애자일 프랙티스
애자일 프랙티스
 
차정민 (소프트웨어 엔지니어) 이력서 + 경력기술서
차정민 (소프트웨어 엔지니어) 이력서 + 경력기술서차정민 (소프트웨어 엔지니어) 이력서 + 경력기술서
차정민 (소프트웨어 엔지니어) 이력서 + 경력기술서
 
[Dev rookie]designpattern
[Dev rookie]designpattern[Dev rookie]designpattern
[Dev rookie]designpattern
 
도메인 주도 설계 - DDD
도메인 주도 설계 - DDD도메인 주도 설계 - DDD
도메인 주도 설계 - DDD
 
Domain driven design 8장
Domain driven design 8장Domain driven design 8장
Domain driven design 8장
 
Pycon korea 2018 kaggle tutorial(kaggle break)
Pycon korea 2018 kaggle tutorial(kaggle break)Pycon korea 2018 kaggle tutorial(kaggle break)
Pycon korea 2018 kaggle tutorial(kaggle break)
 
[I3 d]07 service_design_discover_
[I3 d]07 service_design_discover_[I3 d]07 service_design_discover_
[I3 d]07 service_design_discover_
 
Domain-Driven Design 훑어보기 Part 1
Domain-Driven Design 훑어보기 Part 1Domain-Driven Design 훑어보기 Part 1
Domain-Driven Design 훑어보기 Part 1
 
Bounded Context
Bounded ContextBounded Context
Bounded Context
 
2장. 의사소통과 언어 사용
2장. 의사소통과 언어 사용2장. 의사소통과 언어 사용
2장. 의사소통과 언어 사용
 
C++ 코딩의 정석.pptx
C++ 코딩의 정석.pptxC++ 코딩의 정석.pptx
C++ 코딩의 정석.pptx
 
Chean code chapter 1
Chean code chapter 1Chean code chapter 1
Chean code chapter 1
 
Microservice coding guide
Microservice coding guideMicroservice coding guide
Microservice coding guide
 
SNU UX Lab 패턴랭귀지 (The origin of Pattern Language)
SNU UX Lab 패턴랭귀지 (The origin of Pattern Language)SNU UX Lab 패턴랭귀지 (The origin of Pattern Language)
SNU UX Lab 패턴랭귀지 (The origin of Pattern Language)
 

More from Kyungryul KIM

전문검색기술도전
전문검색기술도전전문검색기술도전
전문검색기술도전Kyungryul KIM
 
Nib_NSWindowController
Nib_NSWindowControllerNib_NSWindowController
Nib_NSWindowControllerKyungryul KIM
 
서버인프라를지탱하는기술5 1 2
서버인프라를지탱하는기술5 1 2서버인프라를지탱하는기술5 1 2
서버인프라를지탱하는기술5 1 2Kyungryul KIM
 
Chaper24 languages high_and_low
Chaper24 languages high_and_lowChaper24 languages high_and_low
Chaper24 languages high_and_lowKyungryul KIM
 
Ch22 운영체제
Ch22 운영체제Ch22 운영체제
Ch22 운영체제Kyungryul KIM
 

More from Kyungryul KIM (20)

Node ch12
Node ch12Node ch12
Node ch12
 
11.scripting
11.scripting11.scripting
11.scripting
 
32 osx app_release
32 osx app_release32 osx app_release
32 osx app_release
 
Meteor ddp
Meteor ddpMeteor ddp
Meteor ddp
 
Cocos2dx 7.1-7.2
Cocos2dx 7.1-7.2Cocos2dx 7.1-7.2
Cocos2dx 7.1-7.2
 
Cocos2 d x-7.3_4
Cocos2 d x-7.3_4Cocos2 d x-7.3_4
Cocos2 d x-7.3_4
 
Cocos2d x-ch5-1
Cocos2d x-ch5-1Cocos2d x-ch5-1
Cocos2d x-ch5-1
 
Coco2d x
Coco2d xCoco2d x
Coco2d x
 
23 drag drop
23 drag drop23 drag drop
23 drag drop
 
Hadoop ch5
Hadoop ch5Hadoop ch5
Hadoop ch5
 
전문검색기술도전
전문검색기술도전전문검색기술도전
전문검색기술도전
 
Nib_NSWindowController
Nib_NSWindowControllerNib_NSWindowController
Nib_NSWindowController
 
Dsas
DsasDsas
Dsas
 
서버인프라를지탱하는기술5 1 2
서버인프라를지탱하는기술5 1 2서버인프라를지탱하는기술5 1 2
서버인프라를지탱하는기술5 1 2
 
Chaper24 languages high_and_low
Chaper24 languages high_and_lowChaper24 languages high_and_low
Chaper24 languages high_and_low
 
Ch22 운영체제
Ch22 운영체제Ch22 운영체제
Ch22 운영체제
 
Mibis ch20
Mibis ch20Mibis ch20
Mibis ch20
 
Mibis ch15
Mibis ch15Mibis ch15
Mibis ch15
 
Mibis ch8
Mibis ch8Mibis ch8
Mibis ch8
 
Mibis ch4
Mibis ch4Mibis ch4
Mibis ch4
 

Ddd ch12-13

  • 1. 12 모델과 디자인 패턴의 연결 12년 11월 3일 토
  • 2. 디자인패턴의 활용 • 디자인패턴은 순수 기술적 용어로 작성됨. • 도메인 모델링과 디자인에서 디자인패턴 일부를 적용할 수 있음. • DDD에서 사용할려면, 아래 2가지 측면으로 볼 수 있음 ‣ 코드안에서 적용되는 기술적 디자인 패턴. ‣ 모델안에서 적용되는 개념적 패턴. 12년 11월 3일 토
  • 3. Strategy (A.K.A. Policy) • 알고리즘군을 정의. • 각 알고리즘을 캡슐화. • 알고리즘을 교체가능하도록. 12년 11월 3일 토
  • 4. Strategy • 도메인 모델에서 적절한 프로세스를 교체할 수 있어야 함. • 수많은 프로세스중에서 적절한 프로세스를 선택하는 것은 어렵다. • 하나의 프로세스가 여러가지 업무를 혼합하여 수행하면 모델링하기 어렵다. • 프로세스의 주 개념에서 변경되는 부분을 분리. 12년 11월 3일 토
  • 5. Strategy • 프로세스의 변화되는 부분을 모델내에서 "Strategy" 오브젝트로 격리. • 프로세스의 행위와 규칙을 분리. • "Strategy" 패턴에 맞게 변경되는 부분을 구현. • 이러한 구현은 각각 다른 방법으로 업무를 수행. 12년 11월 3일 토
  • 6. 경로 탐색 정책 • Routing Service는 경로 리스트를 생성. • 가장 빠른 경로 리스트, 가장 저렴한 경로 리스트. findFastest(Specification):Itinerary findCheapest(Specification):Itinerary 12년 11월 3일 토
  • 7. 경로 탐색 정책 find(Specification, LegMagnitudePolicy):Itinerary 12년 11월 3일 토
  • 8. 주의점 • 도메인 레이어에 기술적 디자인 패턴 적용시, 레이어를 추가해서 작업해라. • 추가된 레이어에 전략과 정책을 넣고 분리해라. • 객체가 늘어난다면, 공유하여 사용할 수 있도록, 객체에 상태를 가지지 않도록 만들어라. 12년 11월 3일 토
  • 9. Composite • 부분과 전체를 표현 하기 위함. • 개별 객체와 복합 개체를 동일하게 처 리. 12년 11월 3일 토
  • 10. Composite • 복잡한 도메인인 경우, 중요한 오브젝트는 임의의 깊이를 가지는 부분 오브젝트들이 중첩되어 구성된다. • 각 레벨 오브젝트는 구분할 수 도 있지만, 각 부분 오브젝트를 동일한 하나의 전체로 다룰 수 있다. 12년 11월 3일 토
  • 11. Composite 미적용 • 모델에 중첩된 컨테이너의 연관성이 반영되지 않으면, 각 계층의 공통된 행위는 중복되고, 유연성이 떨어진다. • 컨테이너가 다른 컨테이너를 포함할 수 없고, 컨테이너를 포함할 수 있는 깊이는 고정된다. • 클라이언트 입장에서는 개념적으로 차이가 없어도, 각 계층마다 다른 인터페이스로 관리하고, 정보를 수집하기 위한 순회 작업은 복잡해진다. 12년 11월 3일 토
  • 12. Composite 적용 • COMPOSITE의 모든 개체를 포함하는 추상타입을 정의. • 컨테이너는 정보를 수집하고 반환하는 메소드 정의하고, "단말" 노드는 자신이 가진 정보를 기반하여 구현. • 클라이언트는 추상 타입과 통신하며, 컨테이너와 단말을 구별할 필요가 없다. 12년 11월 3일 토
  • 13. 여러 경로로 구성된 배송 경로 12년 11월 3일 토
  • 19. 13. 더 심층적인 통찰력을 향한 리팩터링 • 심층적인 리팩터링을 하기 위해서. ‣ 도메인에 주력하라. ‣ 다른 관점으로 현상과 사물을 바라보도록 노력하라. ‣ 도메인 전문가와 지속적으로 대화하라. 12년 11월 3일 토
  • 20. 리팩터링 • 한두명의 개발자가 코드를 보며 개선의 여지를 찾차 수정하 고, 테스트하여 검증한다. • 리팩터링 과정에서 도메인에 대한 통찰력을 추구하면 더 폭 넓은 컨텍스트를 만들 수 있다. 12년 11월 3일 토
  • 21. 시작 • 도메인 전문가없이 작성된 모델과, 새로운 요구 사항이 자연스럽게 추가되지 못하는 상황에서 • 개발자는 근본적으로 도메인 모델에서 개념이 빠져거나, 관계에 오류가 있다고 가정한다. • 도메인을 심층적으로 이해한 개발자가 더 명쾌하고 유용한 모델로 만드는 것이 리팩터링이다. 12년 11월 3일 토
  • 22. 조사팀 • 코드 변경에 착수한 개발자는 뛰어난 2명의 개발자를 선발. • 도메인 전문가도 참여. • 30분에서 1시간 30분정도 브레인스토밍 진행. • UML, 시나리오 진행. • 만족스러운 결과라면 코드로 구현. 12년 11월 3일 토
  • 23. 선행 기술 • 브레인스토밍, 서적, 실무 개발자의 추상적인 개념등으로 부터 정보를 얻을 수 있다. • 분석 패턴을 통해 다른 이의 경험을 활용. 현재 도메인의 소프트웨어를 개발한 경험을 활용. • 디자인패턴이 구현 요구와 모델 개념에 적합할 경우 활용. • 수학이나 술어 로직. 12년 11월 3일 토
  • 24. 개발자를 위한 설계 • 다른 코드와 통합, 반복적 코드 수정, 심층적인 리팩터링을 통해 유연한 설계 • 유연한 설계는 설계의 의도, 코드의 영향 예측, 정신적 부담 을 줄임. • 가장 빈번하게 발생하는 부분은 유연하게, 자주 변경되지 않는 부분은 단순하게. 12년 11월 3일 토
  • 25. 타이밍 • 수정하기 위해 완벽할 때까지 기다리지 마라. ‣ 도메인을 이해하고 있는 바가 설계에 적용되지 않은 경우. ‣ 중요한 개념이 설계상에 암시적으로 표현된 경우. ‣ 설계상 중요 부분이 더 유연하게 만들 수 있는 경우. 12년 11월 3일 토
  • 26. 위기를 기회로 • 리팩터링이 안정적인 상태로 진행되는 것 처럼 보이지만, 심층적인 통찰력을 향한 리팩터링은 그렇지 않다. • 모델을 일정 기간동안 꾸준히 정제하다 보면, 모든 것을 뒤흔드는 통찰력을 얻는다. • 위기로 보이는 이 시점에서 더 훌륭한 모델을 생각해낼 수 있다. • 그리고 지속적인 정제 과정이 다시 시작된다. 12년 11월 3일 토