SlideShare a Scribd company logo
1 of 39
아꿈사 유장혁 도메인 주도 설계: 소프트웨어의 복잡성을 다루는 지혜6장 - 도메인 객체의 생명주기
Aggregate (집합체) Factory (펙터리) Repository (리파지터리) 목차
데이터 변경의 단위로 다루는 연관 객체의 묶음을 말한다 생명주기의 모든 단계에서 불변식이 유지돼야 할 범위를 표시해준다 루트(Root) / 경계(Boundary) 로구성된다 Aggregate (집합체)
무엇이 포함되고 포함되지 않는지를 정의한다 경계(Boundary)
단 하나만 존재 Aggregate 내에 포함된 특정 Entity를 가리킨다 루트(Root)
경계 안의 객체는 서로 참조할 수 있지만, 경계 바깥의 객체는 루트만 참조할 수 있다 루트 이외의 Entity는 지역 식별성(Local Identity)을 지니며,  이는 Aggregate 내에서만 구분되면 된다
각 루트 Entity는 전역 식별성을 지닌다. 경계 안의 Entity는 지역식별성을 지니며, 이러한 지역 식별성은 해당 Aggregate 안에서만 유일하다 . 루트 Entity는 궁극적으로 불변식을 검사할 책임이 있다 Aggregate의 경계 밖에서는 루트 Entity를 제외한 Aggregate 내부의 구성요소를 참조할 수 없다. 규칙
데이터베이스 질의를 이용하면Aggregate의 루트만 직 접적으로 획득할 수 있다. Aggregate 안의 객체는 다른 Aggregate의 루트만 참조할 수 있다. 삭제 연산은 Aggregate 경계 안의 모든 요소를 한 번에 제거해야 한다. Aggregate 경계 안의 어떤 객체를 변경하더라도 전체 Aggregate 의 불변식은모두 지켜져야 한다
Entity와 Value Object를 Aggregate로 모으고 각각에 대해 경계를 정의하라 한 Entity를 골라 Aggregate의 루트로 만들고 Aggregate 경계 내부의 객체에 대해서는 루트를 거쳐 접근할 수 있게 하라 Aggregate밖의 객체는 루트만 참조할 수 있게 하라 내부 구성요소에 대한 일시적인 참조는 단일 연산에서만 사용할 목적에 한해 외부로 전달될 수 있다. 루트를 경유하지 않고는 Aggregate 의 내부를 변경할 수 없다 수행
객체의 생성과 재구성이라는 생명주기 전이(transition)를 캡슐화한다 어떤 객체나 전체 Aggregate를 생성하는 일이 복잡해 지거나 내부 구조를 너무 많이 드러내는 경우 Factory가 캡슐화를 제공해준다 클라이언트의 목적과 생성된 객체의 추상적인 관점을 반영하는 인터페이스를 제공한다. Factory (펙터리)
복잡한 객체와 Aggregate의 인스턴스를 생성하는 책임을 별도의 객체로 옮겨라 모든 복잡한 객체 조립 과정을 캡슐화하는 동시에 클라이언트가 인스턴스화되는객체의 구상클래스를 참조할 필요가 없는 인터페이스를 제공하라 전체 Aggregate를 하나의 단위로 생성해서 그것의 불변식이 이행되게 하라 수행
Factory Method (팩터리메서드) Abstract Factory (추상 팩터리) Builder (빌더) 종류
Factory를 잘 설계하기 위한 두 가지 기본 요건 1) 각 생성 방법은 원자적 (atomic)이어야 하며, 생성된 객체나 Aggregate 의 불변식을모두 지켜야 한다. 일관성 있는 상태에서만 객체를 만들어 낼 수 있어야 한다. 2) 생성된 클래스보다는 생성하고자 하는 타입으로 추상화돼야 한다. 자신에게 전달된 인자와 결합될 것이다. 추상적인 타입의 인자를 사용하라. Tip
1) Value Object 는 불변적이다. 생성물이 완전히 최종적 인 형태로 만들어 진다. Entity Factory는 유효한 Aggregate 를 만들어 내는 데 필요한 필수 속성만 받아들이는 경향이 있다 2) Entity에는 식별성할당과관련된 쟁점이 있다는 것이다 Entity Factory와 Value Object Factory
재구성에 사용된 Entity Factory는 새로운 ID를 할당하지 않는다. Factory의 입력 매개 변수에는 반드시 식별 속성을 포함해야 한다 객체를 재구성하는 Factory는 불변식 위반을 다른 방식으로 처리 할 것이다.  저장된 객체의 재구성
생명주기의 중간과 마지막을 다루며, 거대한 관련 인프라스트럭처를  캡슐화하면서 영속 객체를 찾아 조회하는 수단을 제공한다. 참조하는 객체를 획득하는 방법을 제공해준다 특정 타입의 모든 객체를 (대개 모방된) 하나의 개념적 집합으로 나타낸다.  더욱 정교한 질의 기능이 있다. 컬렉션처럼 동작한다. Repository (리파지터리)
데이터베이스 검색은 어디서든 이용할 수 있으며,곧바로 어떠한 객체에도 접근하게 해준다 Aggregate 내부에 존재하는 모든 객체는 루트에서부터 탐색을 토대로 접근하는 것 말고는 접근이 금지돼 있다는 점이다 문제
클라이언트는 지정된 기준에 근거해 객체를 선택하는 질의 메서드를 이용해 Repository 에서 객체를 요청하는데,대개 특정 속성의 값을 선택 기준으로 삼는다 Repository 는 요청된 객체를 가져 오며, 데이터 베이스 질의 및 메타데이터 매핑에 대한 장치를 캡슐화한다 Repository 는 클라이언트에서 요구하는 기준에 근거해 객체를 선택하는 다양한 질의를 구현 및 반환할 수 있다 해결
잘 알려진 전역 인터페이스를 토대로 한 접근 방법을 마련하라 객체를 추가하고 제거하는 메서드를제공하고,이 메서드가 실제로 데이터 저장소에 데이터를 삽입하고 데 이 터 저장소에서 제거하는 연산을 캡슐화하게 하라 특정한 기준으로 객체를 선택하고 속성값이 특정 기준을 만족하는 완전히 인스턴스화된 객체나 객체 컬렉션을 반환하는 메서드를 제공함으로써 실제 저장소와 질의 기술을 캡슐화하라 실질적으로 직접 접근해야 하는 Aggregate 의 루트에 대해서만 Repository를 제공하고,모든 객체 저장과 접근은 Repository 에 위임해서 클라이언트가 모텔에 집중하게 하라. 수행
가장 만들기 쉬운 Repository 는 질의에 구체적 인 매개변수를 직접 입력 하는 것이다 Repository 에 질의하기
질의의 수가 많은 프로젝트에서는 좀더 유연하게 질의를 수행할 수 있는 Repository프레임워크를 만들 수 있다
저장 · 조회 · 질의 메커니즘을 캡슐화하는 것은 Repository구현의 가장 기본적인 기능이다 타입을 추상화한다 클라이언트와의 분리를 활용한다 트랜잭션(개시, 커밋) 제어를 클라이언트에 둔다 Repository 구현
Factory가 객체 생애의 초기 단계를 다루는 데 반해 Repository는 중간 단계와 마지막 단계를 관리하는 데 도움된다 Factory 가 새로운 객체를 만들어 내는데 반해 Repository 는 기존 객체를 찾아낸다. 찾는데 없을 경우에는 생성할 수 있지만 이는 Factory 에게 위임한다 Factory 와의 관계
결론

More Related Content

What's hot

Angular 4 The new Http Client Module
Angular 4 The new Http Client ModuleAngular 4 The new Http Client Module
Angular 4 The new Http Client Modulearjun singh
 
애플리케이션 아키텍처와 객체지향
애플리케이션 아키텍처와 객체지향 애플리케이션 아키텍처와 객체지향
애플리케이션 아키텍처와 객체지향 Young-Ho Cho
 
webservice scaling for newbie
webservice scaling for newbiewebservice scaling for newbie
webservice scaling for newbieDaeMyung Kang
 
DDD 구현기초 (거의 Final 버전)
DDD 구현기초 (거의 Final 버전)DDD 구현기초 (거의 Final 버전)
DDD 구현기초 (거의 Final 버전)beom kyun choi
 
REST API 설계
REST API 설계REST API 설계
REST API 설계Terry Cho
 
Angular Advanced Routing
Angular Advanced RoutingAngular Advanced Routing
Angular Advanced RoutingLaurent Duveau
 
Angular - Chapter 2 - TypeScript Programming
Angular - Chapter 2 - TypeScript Programming  Angular - Chapter 2 - TypeScript Programming
Angular - Chapter 2 - TypeScript Programming WebStackAcademy
 
Domain Driven Design
Domain Driven DesignDomain Driven Design
Domain Driven DesignYoung-Ho Cho
 
Domain-Driven Design with ASP.NET MVC
Domain-Driven Design with ASP.NET MVCDomain-Driven Design with ASP.NET MVC
Domain-Driven Design with ASP.NET MVCSteven Smith
 
Getting started with Redux js
Getting started with Redux jsGetting started with Redux js
Getting started with Redux jsCitrix
 
Multi thread game server
Multi thread game serverMulti thread game server
Multi thread game serverOnGameServer
 
D2 domain driven-design
D2 domain driven-designD2 domain driven-design
D2 domain driven-designArnaud Bouchez
 
React + Redux Introduction
React + Redux IntroductionReact + Redux Introduction
React + Redux IntroductionNikolaus Graf
 
Angular - Chapter 4 - Data and Event Handling
 Angular - Chapter 4 - Data and Event Handling Angular - Chapter 4 - Data and Event Handling
Angular - Chapter 4 - Data and Event HandlingWebStackAcademy
 

What's hot (20)

Angular 4 The new Http Client Module
Angular 4 The new Http Client ModuleAngular 4 The new Http Client Module
Angular 4 The new Http Client Module
 
애플리케이션 아키텍처와 객체지향
애플리케이션 아키텍처와 객체지향 애플리케이션 아키텍처와 객체지향
애플리케이션 아키텍처와 객체지향
 
webservice scaling for newbie
webservice scaling for newbiewebservice scaling for newbie
webservice scaling for newbie
 
Rich domain model
Rich domain modelRich domain model
Rich domain model
 
DDD 구현기초 (거의 Final 버전)
DDD 구현기초 (거의 Final 버전)DDD 구현기초 (거의 Final 버전)
DDD 구현기초 (거의 Final 버전)
 
REST API 설계
REST API 설계REST API 설계
REST API 설계
 
Angular Advanced Routing
Angular Advanced RoutingAngular Advanced Routing
Angular Advanced Routing
 
Angular - Chapter 2 - TypeScript Programming
Angular - Chapter 2 - TypeScript Programming  Angular - Chapter 2 - TypeScript Programming
Angular - Chapter 2 - TypeScript Programming
 
Domain Driven Design
Domain Driven DesignDomain Driven Design
Domain Driven Design
 
Angular
AngularAngular
Angular
 
Domain-Driven Design with ASP.NET MVC
Domain-Driven Design with ASP.NET MVCDomain-Driven Design with ASP.NET MVC
Domain-Driven Design with ASP.NET MVC
 
Getting started with Redux js
Getting started with Redux jsGetting started with Redux js
Getting started with Redux js
 
Angular Data Binding
Angular Data BindingAngular Data Binding
Angular Data Binding
 
Multi thread game server
Multi thread game serverMulti thread game server
Multi thread game server
 
Clean code slide
Clean code slideClean code slide
Clean code slide
 
D2 domain driven-design
D2 domain driven-designD2 domain driven-design
D2 domain driven-design
 
What is Swagger?
What is Swagger?What is Swagger?
What is Swagger?
 
React + Redux Introduction
React + Redux IntroductionReact + Redux Introduction
React + Redux Introduction
 
Angular 2
Angular 2Angular 2
Angular 2
 
Angular - Chapter 4 - Data and Event Handling
 Angular - Chapter 4 - Data and Event Handling Angular - Chapter 4 - Data and Event Handling
Angular - Chapter 4 - Data and Event Handling
 

Similar to 도메인 주도 설계 - 6장 도메인 객체의 생명주기

도메인 객체의 생명주기
도메인 객체의 생명주기도메인 객체의 생명주기
도메인 객체의 생명주기ukjinkwoun
 
디자인패턴 1~13
디자인패턴 1~13디자인패턴 1~13
디자인패턴 1~13Shin heemin
 
Head first디자인패턴 1~13_희민_호준
Head first디자인패턴 1~13_희민_호준Head first디자인패턴 1~13_희민_호준
Head first디자인패턴 1~13_희민_호준HoJun Sung
 
Composite pattern
Composite patternComposite pattern
Composite pattern경 송
 
Effective java
Effective javaEffective java
Effective javaHaeil Yi
 
Common cartridge 요약본
Common cartridge 요약본Common cartridge 요약본
Common cartridge 요약본Se Joung Kim
 
Builder, prototype, singleton pattern
Builder, prototype, singleton patternBuilder, prototype, singleton pattern
Builder, prototype, singleton patternYoonJong Choi
 
Sql 중심 코드 탈피
Sql 중심 코드 탈피Sql 중심 코드 탈피
Sql 중심 코드 탈피ssuser776e2d
 
(자바교육/스프링교육/스프링프레임워크교육/마이바티스교육추천)#2.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
(자바교육/스프링교육/스프링프레임워크교육/마이바티스교육추천)#2.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)(자바교육/스프링교육/스프링프레임워크교육/마이바티스교육추천)#2.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
(자바교육/스프링교육/스프링프레임워크교육/마이바티스교육추천)#2.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)탑크리에듀(구로디지털단지역3번출구 2분거리)
 
Sql 중심 코드 탈피 발표자료
Sql 중심 코드 탈피 발표자료Sql 중심 코드 탈피 발표자료
Sql 중심 코드 탈피 발표자료ssuser776e2d
 
Effective c++ 1~8장
Effective c++ 1~8장 Effective c++ 1~8장
Effective c++ 1~8장 Shin heemin
 
[Swift] Factory Method
[Swift] Factory Method[Swift] Factory Method
[Swift] Factory MethodBill Kim
 
Java script의 이해
Java script의 이해Java script의 이해
Java script의 이해seungkyu park
 
[Dev rookie]designpattern
[Dev rookie]designpattern[Dev rookie]designpattern
[Dev rookie]designpattern대영 노
 

Similar to 도메인 주도 설계 - 6장 도메인 객체의 생명주기 (20)

도메인 객체의 생명주기
도메인 객체의 생명주기도메인 객체의 생명주기
도메인 객체의 생명주기
 
디자인패턴 1~13
디자인패턴 1~13디자인패턴 1~13
디자인패턴 1~13
 
Head first디자인패턴 1~13_희민_호준
Head first디자인패턴 1~13_희민_호준Head first디자인패턴 1~13_희민_호준
Head first디자인패턴 1~13_희민_호준
 
Composite pattern
Composite patternComposite pattern
Composite pattern
 
DDD Repository
DDD RepositoryDDD Repository
DDD Repository
 
Effective java
Effective javaEffective java
Effective java
 
2.Spring IoC & DI (ioc container)
2.Spring IoC & DI (ioc container)2.Spring IoC & DI (ioc container)
2.Spring IoC & DI (ioc container)
 
Django View Part 1
Django View Part 1Django View Part 1
Django View Part 1
 
Common cartridge 요약본
Common cartridge 요약본Common cartridge 요약본
Common cartridge 요약본
 
Builder, prototype, singleton pattern
Builder, prototype, singleton patternBuilder, prototype, singleton pattern
Builder, prototype, singleton pattern
 
Sql 중심 코드 탈피
Sql 중심 코드 탈피Sql 중심 코드 탈피
Sql 중심 코드 탈피
 
(자바교육/스프링교육/스프링프레임워크교육/마이바티스교육추천)#2.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
(자바교육/스프링교육/스프링프레임워크교육/마이바티스교육추천)#2.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)(자바교육/스프링교육/스프링프레임워크교육/마이바티스교육추천)#2.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
(자바교육/스프링교육/스프링프레임워크교육/마이바티스교육추천)#2.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
 
Sql 중심 코드 탈피 발표자료
Sql 중심 코드 탈피 발표자료Sql 중심 코드 탈피 발표자료
Sql 중심 코드 탈피 발표자료
 
MEC++ 5
MEC++ 5MEC++ 5
MEC++ 5
 
Design patterns
Design patternsDesign patterns
Design patterns
 
Effective c++ 1~8장
Effective c++ 1~8장 Effective c++ 1~8장
Effective c++ 1~8장
 
[Swift] Factory Method
[Swift] Factory Method[Swift] Factory Method
[Swift] Factory Method
 
Java script의 이해
Java script의 이해Java script의 이해
Java script의 이해
 
DDD Start Ch#3
DDD Start Ch#3DDD Start Ch#3
DDD Start Ch#3
 
[Dev rookie]designpattern
[Dev rookie]designpattern[Dev rookie]designpattern
[Dev rookie]designpattern
 

More from JangHyuk You

게임 프로그래머를 위한 기초 수학 및 물리 - 8장
게임 프로그래머를 위한 기초 수학 및 물리 - 8장게임 프로그래머를 위한 기초 수학 및 물리 - 8장
게임 프로그래머를 위한 기초 수학 및 물리 - 8장JangHyuk You
 
게임 프로그래머를 위한 기초 수학 및 물리 - 9장
게임 프로그래머를 위한 기초 수학 및 물리 - 9장게임 프로그래머를 위한 기초 수학 및 물리 - 9장
게임 프로그래머를 위한 기초 수학 및 물리 - 9장JangHyuk You
 
Mongo DB 완벽가이드 - 4장 쿼리하기
Mongo DB 완벽가이드 - 4장 쿼리하기Mongo DB 완벽가이드 - 4장 쿼리하기
Mongo DB 완벽가이드 - 4장 쿼리하기JangHyuk You
 
프로그래머가 몰랐던 멀티코어 CPU 이야기 - 15, 16장
프로그래머가 몰랐던 멀티코어  CPU 이야기 - 15, 16장프로그래머가 몰랐던 멀티코어  CPU 이야기 - 15, 16장
프로그래머가 몰랐던 멀티코어 CPU 이야기 - 15, 16장JangHyuk You
 
TAOCP1 - 2.2.2 - 순차할당
TAOCP1 - 2.2.2 - 순차할당TAOCP1 - 2.2.2 - 순차할당
TAOCP1 - 2.2.2 - 순차할당JangHyuk You
 
TAOCP1 - 1.2.11.1 - O 표기법
TAOCP1 - 1.2.11.1 - O 표기법TAOCP1 - 1.2.11.1 - O 표기법
TAOCP1 - 1.2.11.1 - O 표기법JangHyuk You
 
IT 개발자가 쓴 통쾌한 인간관리 이야기 - Part2 : 프로세스가 제품이다
IT 개발자가 쓴 통쾌한 인간관리 이야기 - Part2 : 프로세스가 제품이다IT 개발자가 쓴 통쾌한 인간관리 이야기 - Part2 : 프로세스가 제품이다
IT 개발자가 쓴 통쾌한 인간관리 이야기 - Part2 : 프로세스가 제품이다JangHyuk You
 
Programming Lisp Clojure - 2장 : 클로저 둘러보기
Programming Lisp Clojure - 2장 : 클로저 둘러보기Programming Lisp Clojure - 2장 : 클로저 둘러보기
Programming Lisp Clojure - 2장 : 클로저 둘러보기JangHyuk You
 

More from JangHyuk You (8)

게임 프로그래머를 위한 기초 수학 및 물리 - 8장
게임 프로그래머를 위한 기초 수학 및 물리 - 8장게임 프로그래머를 위한 기초 수학 및 물리 - 8장
게임 프로그래머를 위한 기초 수학 및 물리 - 8장
 
게임 프로그래머를 위한 기초 수학 및 물리 - 9장
게임 프로그래머를 위한 기초 수학 및 물리 - 9장게임 프로그래머를 위한 기초 수학 및 물리 - 9장
게임 프로그래머를 위한 기초 수학 및 물리 - 9장
 
Mongo DB 완벽가이드 - 4장 쿼리하기
Mongo DB 완벽가이드 - 4장 쿼리하기Mongo DB 완벽가이드 - 4장 쿼리하기
Mongo DB 완벽가이드 - 4장 쿼리하기
 
프로그래머가 몰랐던 멀티코어 CPU 이야기 - 15, 16장
프로그래머가 몰랐던 멀티코어  CPU 이야기 - 15, 16장프로그래머가 몰랐던 멀티코어  CPU 이야기 - 15, 16장
프로그래머가 몰랐던 멀티코어 CPU 이야기 - 15, 16장
 
TAOCP1 - 2.2.2 - 순차할당
TAOCP1 - 2.2.2 - 순차할당TAOCP1 - 2.2.2 - 순차할당
TAOCP1 - 2.2.2 - 순차할당
 
TAOCP1 - 1.2.11.1 - O 표기법
TAOCP1 - 1.2.11.1 - O 표기법TAOCP1 - 1.2.11.1 - O 표기법
TAOCP1 - 1.2.11.1 - O 표기법
 
IT 개발자가 쓴 통쾌한 인간관리 이야기 - Part2 : 프로세스가 제품이다
IT 개발자가 쓴 통쾌한 인간관리 이야기 - Part2 : 프로세스가 제품이다IT 개발자가 쓴 통쾌한 인간관리 이야기 - Part2 : 프로세스가 제품이다
IT 개발자가 쓴 통쾌한 인간관리 이야기 - Part2 : 프로세스가 제품이다
 
Programming Lisp Clojure - 2장 : 클로저 둘러보기
Programming Lisp Clojure - 2장 : 클로저 둘러보기Programming Lisp Clojure - 2장 : 클로저 둘러보기
Programming Lisp Clojure - 2장 : 클로저 둘러보기
 

도메인 주도 설계 - 6장 도메인 객체의 생명주기

  • 1. 아꿈사 유장혁 도메인 주도 설계: 소프트웨어의 복잡성을 다루는 지혜6장 - 도메인 객체의 생명주기
  • 2. Aggregate (집합체) Factory (펙터리) Repository (리파지터리) 목차
  • 3.
  • 4. 데이터 변경의 단위로 다루는 연관 객체의 묶음을 말한다 생명주기의 모든 단계에서 불변식이 유지돼야 할 범위를 표시해준다 루트(Root) / 경계(Boundary) 로구성된다 Aggregate (집합체)
  • 5. 무엇이 포함되고 포함되지 않는지를 정의한다 경계(Boundary)
  • 6. 단 하나만 존재 Aggregate 내에 포함된 특정 Entity를 가리킨다 루트(Root)
  • 7. 경계 안의 객체는 서로 참조할 수 있지만, 경계 바깥의 객체는 루트만 참조할 수 있다 루트 이외의 Entity는 지역 식별성(Local Identity)을 지니며, 이는 Aggregate 내에서만 구분되면 된다
  • 8.
  • 9.
  • 10. 각 루트 Entity는 전역 식별성을 지닌다. 경계 안의 Entity는 지역식별성을 지니며, 이러한 지역 식별성은 해당 Aggregate 안에서만 유일하다 . 루트 Entity는 궁극적으로 불변식을 검사할 책임이 있다 Aggregate의 경계 밖에서는 루트 Entity를 제외한 Aggregate 내부의 구성요소를 참조할 수 없다. 규칙
  • 11. 데이터베이스 질의를 이용하면Aggregate의 루트만 직 접적으로 획득할 수 있다. Aggregate 안의 객체는 다른 Aggregate의 루트만 참조할 수 있다. 삭제 연산은 Aggregate 경계 안의 모든 요소를 한 번에 제거해야 한다. Aggregate 경계 안의 어떤 객체를 변경하더라도 전체 Aggregate 의 불변식은모두 지켜져야 한다
  • 12. Entity와 Value Object를 Aggregate로 모으고 각각에 대해 경계를 정의하라 한 Entity를 골라 Aggregate의 루트로 만들고 Aggregate 경계 내부의 객체에 대해서는 루트를 거쳐 접근할 수 있게 하라 Aggregate밖의 객체는 루트만 참조할 수 있게 하라 내부 구성요소에 대한 일시적인 참조는 단일 연산에서만 사용할 목적에 한해 외부로 전달될 수 있다. 루트를 경유하지 않고는 Aggregate 의 내부를 변경할 수 없다 수행
  • 13.
  • 14. 객체의 생성과 재구성이라는 생명주기 전이(transition)를 캡슐화한다 어떤 객체나 전체 Aggregate를 생성하는 일이 복잡해 지거나 내부 구조를 너무 많이 드러내는 경우 Factory가 캡슐화를 제공해준다 클라이언트의 목적과 생성된 객체의 추상적인 관점을 반영하는 인터페이스를 제공한다. Factory (펙터리)
  • 15.
  • 16. 복잡한 객체와 Aggregate의 인스턴스를 생성하는 책임을 별도의 객체로 옮겨라 모든 복잡한 객체 조립 과정을 캡슐화하는 동시에 클라이언트가 인스턴스화되는객체의 구상클래스를 참조할 필요가 없는 인터페이스를 제공하라 전체 Aggregate를 하나의 단위로 생성해서 그것의 불변식이 이행되게 하라 수행
  • 17. Factory Method (팩터리메서드) Abstract Factory (추상 팩터리) Builder (빌더) 종류
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23. Factory를 잘 설계하기 위한 두 가지 기본 요건 1) 각 생성 방법은 원자적 (atomic)이어야 하며, 생성된 객체나 Aggregate 의 불변식을모두 지켜야 한다. 일관성 있는 상태에서만 객체를 만들어 낼 수 있어야 한다. 2) 생성된 클래스보다는 생성하고자 하는 타입으로 추상화돼야 한다. 자신에게 전달된 인자와 결합될 것이다. 추상적인 타입의 인자를 사용하라. Tip
  • 24. 1) Value Object 는 불변적이다. 생성물이 완전히 최종적 인 형태로 만들어 진다. Entity Factory는 유효한 Aggregate 를 만들어 내는 데 필요한 필수 속성만 받아들이는 경향이 있다 2) Entity에는 식별성할당과관련된 쟁점이 있다는 것이다 Entity Factory와 Value Object Factory
  • 25. 재구성에 사용된 Entity Factory는 새로운 ID를 할당하지 않는다. Factory의 입력 매개 변수에는 반드시 식별 속성을 포함해야 한다 객체를 재구성하는 Factory는 불변식 위반을 다른 방식으로 처리 할 것이다. 저장된 객체의 재구성
  • 26.
  • 27.
  • 28. 생명주기의 중간과 마지막을 다루며, 거대한 관련 인프라스트럭처를 캡슐화하면서 영속 객체를 찾아 조회하는 수단을 제공한다. 참조하는 객체를 획득하는 방법을 제공해준다 특정 타입의 모든 객체를 (대개 모방된) 하나의 개념적 집합으로 나타낸다. 더욱 정교한 질의 기능이 있다. 컬렉션처럼 동작한다. Repository (리파지터리)
  • 29. 데이터베이스 검색은 어디서든 이용할 수 있으며,곧바로 어떠한 객체에도 접근하게 해준다 Aggregate 내부에 존재하는 모든 객체는 루트에서부터 탐색을 토대로 접근하는 것 말고는 접근이 금지돼 있다는 점이다 문제
  • 30. 클라이언트는 지정된 기준에 근거해 객체를 선택하는 질의 메서드를 이용해 Repository 에서 객체를 요청하는데,대개 특정 속성의 값을 선택 기준으로 삼는다 Repository 는 요청된 객체를 가져 오며, 데이터 베이스 질의 및 메타데이터 매핑에 대한 장치를 캡슐화한다 Repository 는 클라이언트에서 요구하는 기준에 근거해 객체를 선택하는 다양한 질의를 구현 및 반환할 수 있다 해결
  • 31.
  • 32. 잘 알려진 전역 인터페이스를 토대로 한 접근 방법을 마련하라 객체를 추가하고 제거하는 메서드를제공하고,이 메서드가 실제로 데이터 저장소에 데이터를 삽입하고 데 이 터 저장소에서 제거하는 연산을 캡슐화하게 하라 특정한 기준으로 객체를 선택하고 속성값이 특정 기준을 만족하는 완전히 인스턴스화된 객체나 객체 컬렉션을 반환하는 메서드를 제공함으로써 실제 저장소와 질의 기술을 캡슐화하라 실질적으로 직접 접근해야 하는 Aggregate 의 루트에 대해서만 Repository를 제공하고,모든 객체 저장과 접근은 Repository 에 위임해서 클라이언트가 모텔에 집중하게 하라. 수행
  • 33. 가장 만들기 쉬운 Repository 는 질의에 구체적 인 매개변수를 직접 입력 하는 것이다 Repository 에 질의하기
  • 34. 질의의 수가 많은 프로젝트에서는 좀더 유연하게 질의를 수행할 수 있는 Repository프레임워크를 만들 수 있다
  • 35. 저장 · 조회 · 질의 메커니즘을 캡슐화하는 것은 Repository구현의 가장 기본적인 기능이다 타입을 추상화한다 클라이언트와의 분리를 활용한다 트랜잭션(개시, 커밋) 제어를 클라이언트에 둔다 Repository 구현
  • 36.
  • 37. Factory가 객체 생애의 초기 단계를 다루는 데 반해 Repository는 중간 단계와 마지막 단계를 관리하는 데 도움된다 Factory 가 새로운 객체를 만들어 내는데 반해 Repository 는 기존 객체를 찾아낸다. 찾는데 없을 경우에는 생성할 수 있지만 이는 Factory 에게 위임한다 Factory 와의 관계
  • 38.