SlideShare a Scribd company logo
도메인 주도 설계
16. 대규모 구조


              아꿈사
     박상혁 (kazuyapsh@gmail.com)
대규모 구조
• 설계를 관리 가능한 응집력 있는 MODULE로 분해
• 굉장히 많은 MODULE이 생겨남

•   기능의 특정 측면을 보려면 어떤 패키지를 찾아야 할까?
•   새 클래스는 어디다 둬야 할까?
•   이런 작은 패키지 중 일부는 실제로 어떤 의미가 있는가?
•   그와 같은 패키지는 서로 얼마나 잘 어울릴까?

• MODULAR를 중심으로 분해하더라도
  큰 모델은 파악하기에 너무 복잡할 수 있다!
대규모 구조
• 프로젝트의 규모와 상관없이 사람들은 시스템의 다른 부분에서 어
  느 정도 독립적으로 일해야 한다

• 큰 시스템에, 해당 시스템의 요소를 전체 설계에 걸친 패턴에서의
  역할 측면에서 해석하게 할 수 있는 지배적익 원칙이 없다면 개발
  자들은 나무만 보고 숲을 보지 못한다.

• 전체의 세부 사항을 깊이 파고들지 않고도 전체의 각 부분이 담당
  하는 역할을 이해할 수 있어야 한다
대규모 구조의 패턴

                                 SYSTEM
                                METAPHOR



           MODEL-DRIVEN           RESPONSIBILITY
             DESIGN                   LAYER


EVOLVING
 ORDER                          KNOWLEDGE
                                  LEVEL

                    PLUGGABLE
                    COMPONENT
                    FRAMEWORK
EVOLVING ORDER 발전하는 질서
• 구조화 되지 않은 설계에서 발생하는 비용을 경험한 적이 있는가?

• 이런 혼란을 피하고자 프로젝트에서는 다양한 방법으로 개발을
  제약하는 아키텍처를 부과한다

• 아무나 설계할 수 있다면
  – 누구도 전체적으로 이해할 수 없는 시스템이 만들어지고
  – 이런 시스템은 유지보수 하기 어렵다


• 그러나 아키텍처는 사전 설계와 관련한 가정을 둠으로써 프로젝트
  를 속박할 수 있고, 애플리케이션의 특정 부분에 대해 개발자/설계
  자의 권한을 너무 많이 앗아갈 수 있다.
EVOLVING ORDER 발전하는 질서
• 개념적인 대규모 구조가 애플리케이션과 함께 발전하게 해서 발전
  과정에서 전혀 다른 형식의 구조로도 변화할 수 있게 하라.

• 반드시 세부적인 지식을 토대로 내려야 할 세부적인 설계 및 모델
  과 관련된 의사결정을 과도하게 제약해서는 안된다.
대규모 구조의 패턴

                                 SYSTEM
                                METAPHOR



           MODEL-DRIVEN           RESPONSIBILITY
             DESIGN                   LAYER


EVOLVING
 ORDER                          KNOWLEDGE
                                  LEVEL

                    PLUGGABLE
                    COMPONENT
                    FRAMEWORK
SYSTEM METAPHOR 시스템 은유
• 소프트웨어 설계는 매우 추상적이고 파악하기 힘든 경향이 있다.

• 개발자와 사용자가 모두 시스템을 이해하고 시스템을 전체적으로
  바라보는 시각을 공유할 구체적인 수단이 필요하다

• '시스템 은유'는 어찌됐건 일종의 비유에 불과하므로 다양한 모델
  이 적절한 방법으로 '시스템 은유'에 매핑될 수 있다

• 어떤 시스템의 구체적인 비유가 나타나 팀원의 상상력을 포착하고
  유용한 방향으로 사고를 이끄는 것으로 보인다면 그것을 대규모
  구조로 채택하라
대규모 구조의 패턴

                                 SYSTEM
                                METAPHOR



           MODEL-DRIVEN           RESPONSIBILITY
             DESIGN                   LAYER


EVOLVING
 ORDER                          KNOWLEDGE
                                  LEVEL

                    PLUGGABLE
                    COMPONENT
                    FRAMEWORK
RESPONSIBILITY LAYER 책임 계층
• 각 개별 객체에 손수 만든 책임이 할당돼 있다면 가이드라인도 없
  고, 균일함도 없고, 넓은 범위에 걸친 도메인을 동시에 다룰 능력
  도 없는 셈이다. 큰 모델이 응집력을 부여하려면 그러한 책임 할당
  에 특정 구조를 도입하는 것이 도움이 된다.

• 계층은 시스템 구획으로서...

• 모델에 존재하는 개념적 의존성과 도메인의 여러 부분에 대한 다
  양한 변화율과 변화의 근원을 검토하라. 도메인에서 자연적인 층
  을 식별하면 그것을 광범위한 추상적 책임으로 간주하라
• AGGREGATE, MODULE과 같은 각 도메인 객체의 책임이 한 계
  층의 책임안에서 말끔히 맞아 떨어지로록 모델을 리팩터링하라
RESPONSIBILITY LAYER 책임 계층
• 그림 16-3
RESPONSIBILITY LAYER 책임 계층
• "운영" 책임과 "기능"책임
• 그림 16-6
RESPONSIBILITY LAYER 책임 계층
• "의사결정 지원" 책임
• 그림 16-8
RESPONSIBILITY LAYER 책임 계층
• 그림 16-11
대규모 구조의 패턴

                                 SYSTEM
                                METAPHOR



           MODEL-DRIVEN           RESPONSIBILITY
             DESIGN                   LAYER


EVOLVING
 ORDER                          KNOWLEDGE
                                  LEVEL

                    PLUGGABLE
                    COMPONENT
                    FRAMEWORK
KNOWLEDGE LEVEL 지식 수준
• 더 넓은 범위의 규칙으로 제약되기 전까지 모델의 특정 부분을 사
  용자의 손에 맡겨야 할 때 생기는 문제를 해결한다

• 도메일을 모델링하기 보다 모델을 구조화한다
KNOWLEDGE LEVEL 지식 수준
• 그림 16-15
KNOWLEDGE LEVEL 지식 수준
• 그림 16-17
KNOWLEDGE LEVEL 지식 수준
• 그림 16-19
KNOWLEDGE LEVEL 지식 수준
• ENTITY 간의 역할과 관계가 각 상황마다 다양하게 작용하는 애
  플리케이션에서는 복잡성이 폭발적으로 증가할 수 있다
• 완전히 일반화된 모델이나 고도로 맞춤화가 가능한 모델도 사용
  자의 욕구를 충족하지 못한다
  – 다른 타입을 참조하거나
  – 각종 상황에서 여러가지 방법으로 쓰일 속성을 갖게 된다


• 기본적인 모델의 구조와 행위를 서술하고 제약하는 데 쓸 수 있는
  별도의 객체 집합을 만들어라
• 이러한 관심사를 두가지 '수준'으로 분리해서 하나는 매우 구체적
  으로 만들고 다른 하나는 사용자나 관리자의 맞춤화가 가능한 규
  칙과 지식을 반영하게 만들어라
KNOWLEDGE LEVEL 지식 수준
• 그림 16-21
KNOWLEDGE LEVEL 지식 수준
• 그림 16-22
대규모 구조의 패턴

                                 SYSTEM
                                METAPHOR



           MODEL-DRIVEN           RESPONSIBILITY
             DESIGN                   LAYER


EVOLVING
 ORDER                          KNOWLEDGE
                                  LEVEL

                    PLUGGABLE
                    COMPONENT
                    FRAMEWORK
PLUGGABLE COMPONENT FRAMEWORK
• 인터페이스와 상호작용에 대한 ABSTRACT CORE를 정제하고 그
  러한 인터페이스의 다양한 구현이 자유롭게 대체될 수 있는 프레
  임워크를 만들어라
• 이와 마찬가지로 컴포넌트가 ABSTRACT CORE의 인터페이스를
  통해 정확히 작동하는 한 어떠한 애플리케이션에서도 그러한 컴포
  넌트를 사용할 수 있게 하라.

• MAVEN ?
구조는 얼마나 제약성을 지녀야 하는가?
• 여러가지 대규모 구조가 가능하고, 심지어 일반화된 구조 패턴 안
  에서도 규칙을 얼마나 제약적으로 만드는가에 관한 선택의 여지는
  많다

• 제약은 개발자가 필요로 하는 유연함을 앗아갈 수 있다

• 프레임워크를 만들고 대규모 구조의 구현을 엄격히 통제하고자 하
  는 유혹을 이겨내야 한다

• 대규모 구조가 공헌하는 가장 중요한 바는 개념적 응집성과 도메
  인에 대한 통찰력을 주는 것이다
잘 맞아떨어지는 구조를 향한 리팩터링
• 최소주의
 – 구조를 간단하고 가볍게
 – 초반에는 '시스템은유'나 몇 가지 '책임계층'과 같은 느슨한 구조


• 의사소통과 자기 훈련
 – 새로운 개발과 리팩터링을 할 때 반드시 구조를 따른다
 – 대부분의 대규모 구조가 느슨한 개념적 지침이라서
   팀은 반드시 '자기 훈련'을 수행해야 한다
잘 맞아떨어지는 구조를 향한 리팩터링
• 재구조화가 유연한 설계를 낳는다
 – 구조는 시스템의 복잡성이 증가하고 이해가 깊어질수록 발전한다
 – 구조가 바뀔 때 전체 시스템은 새로운 질서를 따르도록 바뀌어야 한다


• 디스틸레이션은 부하를 줄인다
 – 지속적인 디스틸레이션
끗

QnA

More Related Content

What's hot

Ngrx
NgrxNgrx
[Devil's camp 2019] 혹시 Elixir 아십니까? 정.말.갓.언.어.입.니.다
[Devil's camp 2019] 혹시 Elixir 아십니까? 정.말.갓.언.어.입.니.다[Devil's camp 2019] 혹시 Elixir 아십니까? 정.말.갓.언.어.입.니.다
[Devil's camp 2019] 혹시 Elixir 아십니까? 정.말.갓.언.어.입.니.다
KWON JUNHYEOK
 
자바에서 null을 안전하게 다루는 방법
자바에서 null을 안전하게 다루는 방법자바에서 null을 안전하게 다루는 방법
자바에서 null을 안전하게 다루는 방법
Sungchul Park
 
대용량 분산 아키텍쳐 설계 #3 대용량 분산 시스템 아키텍쳐
대용량 분산 아키텍쳐 설계 #3 대용량 분산 시스템 아키텍쳐대용량 분산 아키텍쳐 설계 #3 대용량 분산 시스템 아키텍쳐
대용량 분산 아키텍쳐 설계 #3 대용량 분산 시스템 아키텍쳐
Terry Cho
 
Decomposing Applications for Scalability and Deployability (April 2012)
Decomposing Applications for Scalability and Deployability (April 2012)Decomposing Applications for Scalability and Deployability (April 2012)
Decomposing Applications for Scalability and Deployability (April 2012)
Chris Richardson
 
JIRA 업무 생산성 향상 및 프로젝트 관리
JIRA 업무 생산성 향상 및 프로젝트 관리JIRA 업무 생산성 향상 및 프로젝트 관리
JIRA 업무 생산성 향상 및 프로젝트 관리
KwangSeob Jeong
 
[D2]pinpoint 개발기
[D2]pinpoint 개발기[D2]pinpoint 개발기
[D2]pinpoint 개발기
NAVER D2
 
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
내훈 정
 
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
흥배 최
 
MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현
YEONG-CHEON YOU
 
Ch6 대용량서비스레퍼런스아키텍처 part.1
Ch6 대용량서비스레퍼런스아키텍처 part.1Ch6 대용량서비스레퍼런스아키텍처 part.1
Ch6 대용량서비스레퍼런스아키텍처 part.1
Minchul Jung
 
Domain Driven Design
Domain Driven DesignDomain Driven Design
Domain Driven Design
AOE
 
[Atlassian in 부산]Git을 이용한 형상관리 전략_투씨드
[Atlassian in 부산]Git을 이용한 형상관리 전략_투씨드[Atlassian in 부산]Git을 이용한 형상관리 전략_투씨드
[Atlassian in 부산]Git을 이용한 형상관리 전략_투씨드
Atlassian 대한민국
 
서버학개론(백엔드 서버 개발자를 위한)
서버학개론(백엔드 서버 개발자를 위한)서버학개론(백엔드 서버 개발자를 위한)
서버학개론(백엔드 서버 개발자를 위한)
수보 김
 
React Class Components vs Functional Components: Which is Better?
React Class Components vs Functional Components: Which is Better?React Class Components vs Functional Components: Which is Better?
React Class Components vs Functional Components: Which is Better?
Fibonalabs
 
State Management in Angular/React
State Management in Angular/ReactState Management in Angular/React
State Management in Angular/React
DEV Cafe
 
CQRS and Event Sourcing, An Alternative Architecture for DDD
CQRS and Event Sourcing, An Alternative Architecture for DDDCQRS and Event Sourcing, An Alternative Architecture for DDD
CQRS and Event Sourcing, An Alternative Architecture for DDD
Dennis Doomen
 
Iocp advanced
Iocp advancedIocp advanced
Iocp advanced
Nam Hyeonuk
 
golang과 websocket을 활용한 서버프로그래밍 - 장애없는 서버 런칭 도전기
golang과 websocket을 활용한 서버프로그래밍 - 장애없는 서버 런칭 도전기golang과 websocket을 활용한 서버프로그래밍 - 장애없는 서버 런칭 도전기
golang과 websocket을 활용한 서버프로그래밍 - 장애없는 서버 런칭 도전기
Sangik Bae
 
이승재, 마비노기 듀얼: 분산 데이터베이스 트랜잭션 설계와 구현, NDC2015
이승재, 마비노기 듀얼: 분산 데이터베이스 트랜잭션 설계와 구현, NDC2015이승재, 마비노기 듀얼: 분산 데이터베이스 트랜잭션 설계와 구현, NDC2015
이승재, 마비노기 듀얼: 분산 데이터베이스 트랜잭션 설계와 구현, NDC2015devCAT Studio, NEXON
 

What's hot (20)

Ngrx
NgrxNgrx
Ngrx
 
[Devil's camp 2019] 혹시 Elixir 아십니까? 정.말.갓.언.어.입.니.다
[Devil's camp 2019] 혹시 Elixir 아십니까? 정.말.갓.언.어.입.니.다[Devil's camp 2019] 혹시 Elixir 아십니까? 정.말.갓.언.어.입.니.다
[Devil's camp 2019] 혹시 Elixir 아십니까? 정.말.갓.언.어.입.니.다
 
자바에서 null을 안전하게 다루는 방법
자바에서 null을 안전하게 다루는 방법자바에서 null을 안전하게 다루는 방법
자바에서 null을 안전하게 다루는 방법
 
대용량 분산 아키텍쳐 설계 #3 대용량 분산 시스템 아키텍쳐
대용량 분산 아키텍쳐 설계 #3 대용량 분산 시스템 아키텍쳐대용량 분산 아키텍쳐 설계 #3 대용량 분산 시스템 아키텍쳐
대용량 분산 아키텍쳐 설계 #3 대용량 분산 시스템 아키텍쳐
 
Decomposing Applications for Scalability and Deployability (April 2012)
Decomposing Applications for Scalability and Deployability (April 2012)Decomposing Applications for Scalability and Deployability (April 2012)
Decomposing Applications for Scalability and Deployability (April 2012)
 
JIRA 업무 생산성 향상 및 프로젝트 관리
JIRA 업무 생산성 향상 및 프로젝트 관리JIRA 업무 생산성 향상 및 프로젝트 관리
JIRA 업무 생산성 향상 및 프로젝트 관리
 
[D2]pinpoint 개발기
[D2]pinpoint 개발기[D2]pinpoint 개발기
[D2]pinpoint 개발기
 
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
 
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
 
MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현
 
Ch6 대용량서비스레퍼런스아키텍처 part.1
Ch6 대용량서비스레퍼런스아키텍처 part.1Ch6 대용량서비스레퍼런스아키텍처 part.1
Ch6 대용량서비스레퍼런스아키텍처 part.1
 
Domain Driven Design
Domain Driven DesignDomain Driven Design
Domain Driven Design
 
[Atlassian in 부산]Git을 이용한 형상관리 전략_투씨드
[Atlassian in 부산]Git을 이용한 형상관리 전략_투씨드[Atlassian in 부산]Git을 이용한 형상관리 전략_투씨드
[Atlassian in 부산]Git을 이용한 형상관리 전략_투씨드
 
서버학개론(백엔드 서버 개발자를 위한)
서버학개론(백엔드 서버 개발자를 위한)서버학개론(백엔드 서버 개발자를 위한)
서버학개론(백엔드 서버 개발자를 위한)
 
React Class Components vs Functional Components: Which is Better?
React Class Components vs Functional Components: Which is Better?React Class Components vs Functional Components: Which is Better?
React Class Components vs Functional Components: Which is Better?
 
State Management in Angular/React
State Management in Angular/ReactState Management in Angular/React
State Management in Angular/React
 
CQRS and Event Sourcing, An Alternative Architecture for DDD
CQRS and Event Sourcing, An Alternative Architecture for DDDCQRS and Event Sourcing, An Alternative Architecture for DDD
CQRS and Event Sourcing, An Alternative Architecture for DDD
 
Iocp advanced
Iocp advancedIocp advanced
Iocp advanced
 
golang과 websocket을 활용한 서버프로그래밍 - 장애없는 서버 런칭 도전기
golang과 websocket을 활용한 서버프로그래밍 - 장애없는 서버 런칭 도전기golang과 websocket을 활용한 서버프로그래밍 - 장애없는 서버 런칭 도전기
golang과 websocket을 활용한 서버프로그래밍 - 장애없는 서버 런칭 도전기
 
이승재, 마비노기 듀얼: 분산 데이터베이스 트랜잭션 설계와 구현, NDC2015
이승재, 마비노기 듀얼: 분산 데이터베이스 트랜잭션 설계와 구현, NDC2015이승재, 마비노기 듀얼: 분산 데이터베이스 트랜잭션 설계와 구현, NDC2015
이승재, 마비노기 듀얼: 분산 데이터베이스 트랜잭션 설계와 구현, NDC2015
 

Similar to 도메인 주도 설계 - 16 대규모 구조

대규모 구조
대규모 구조대규모 구조
대규모 구조ukjinkwoun
 
도메인 주도 설계 ch17
도메인 주도 설계 ch17도메인 주도 설계 ch17
도메인 주도 설계 ch17HyeonSeok Choi
 
Reactive programming vs reactive systems
Reactive programming vs reactive systemsReactive programming vs reactive systems
Reactive programming vs reactive systems
Jinhyuck Kim
 
Lost practice : Requirement Analysis
Lost practice : Requirement AnalysisLost practice : Requirement Analysis
Lost practice : Requirement Analysis
c K
 
도메인 주도 개발 4장 도메인의 격리
도메인 주도 개발 4장 도메인의 격리도메인 주도 개발 4장 도메인의 격리
도메인 주도 개발 4장 도메인의 격리Choonghyun Yang
 
[Dev rookie]designpattern
[Dev rookie]designpattern[Dev rookie]designpattern
[Dev rookie]designpattern
대영 노
 
C Language II
C Language IIC Language II
C Language IISuho Kwon
 
Event Storming(이벤트 스토밍)
Event Storming(이벤트 스토밍)Event Storming(이벤트 스토밍)
Event Storming(이벤트 스토밍)
종일 김
 
Bounded Context
Bounded ContextBounded Context
Bounded Context
HyeonSeok Choi
 
Domain driven design ch3
Domain driven design ch3Domain driven design ch3
Domain driven design ch3HyeonSeok Choi
 
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
 
Uml 세미나
Uml 세미나Uml 세미나
Uml 세미나
Daniel Shin
 
2015 Open Cloud Engine Handbook
2015 Open Cloud Engine Handbook2015 Open Cloud Engine Handbook
2015 Open Cloud Engine Handbook
uEngine Solutions
 
Droid knights 2019 - (Large-scale App을 위한) Android Architecture 총정리
Droid knights 2019 - (Large-scale App을 위한) Android Architecture 총정리Droid knights 2019 - (Large-scale App을 위한) Android Architecture 총정리
Droid knights 2019 - (Large-scale App을 위한) Android Architecture 총정리
Sa-ryong Kang
 
Cloud migration pattern using microservices
Cloud migration pattern using microservicesCloud migration pattern using microservices
Cloud migration pattern using microservices
Seong-Bok Lee
 
Dev rookie codecomplete-1
Dev rookie codecomplete-1Dev rookie codecomplete-1
Dev rookie codecomplete-1
대영 노
 
3부. 더 심층적인 통찰력을 향한 리팩터링 (8장 도약)
3부. 더 심층적인 통찰력을 향한 리팩터링 (8장 도약)3부. 더 심층적인 통찰력을 향한 리팩터링 (8장 도약)
3부. 더 심층적인 통찰력을 향한 리팩터링 (8장 도약)Choonghyun Yang
 
MSA 세미나.pptx
MSA 세미나.pptxMSA 세미나.pptx
MSA 세미나.pptx
ssuser89c688
 
마이크로 프론트엔드 아키텍쳐를 위한 모노레포 관리
마이크로 프론트엔드 아키텍쳐를 위한 모노레포 관리마이크로 프론트엔드 아키텍쳐를 위한 모노레포 관리
마이크로 프론트엔드 아키텍쳐를 위한 모노레포 관리
경식 최
 
도메인 주도 설계 - DDD
도메인 주도 설계 - DDD도메인 주도 설계 - DDD
도메인 주도 설계 - DDD
Myeongdon Joo
 

Similar to 도메인 주도 설계 - 16 대규모 구조 (20)

대규모 구조
대규모 구조대규모 구조
대규모 구조
 
도메인 주도 설계 ch17
도메인 주도 설계 ch17도메인 주도 설계 ch17
도메인 주도 설계 ch17
 
Reactive programming vs reactive systems
Reactive programming vs reactive systemsReactive programming vs reactive systems
Reactive programming vs reactive systems
 
Lost practice : Requirement Analysis
Lost practice : Requirement AnalysisLost practice : Requirement Analysis
Lost practice : Requirement Analysis
 
도메인 주도 개발 4장 도메인의 격리
도메인 주도 개발 4장 도메인의 격리도메인 주도 개발 4장 도메인의 격리
도메인 주도 개발 4장 도메인의 격리
 
[Dev rookie]designpattern
[Dev rookie]designpattern[Dev rookie]designpattern
[Dev rookie]designpattern
 
C Language II
C Language IIC Language II
C Language II
 
Event Storming(이벤트 스토밍)
Event Storming(이벤트 스토밍)Event Storming(이벤트 스토밍)
Event Storming(이벤트 스토밍)
 
Bounded Context
Bounded ContextBounded Context
Bounded Context
 
Domain driven design ch3
Domain driven design ch3Domain driven design ch3
Domain driven design ch3
 
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)
 
Uml 세미나
Uml 세미나Uml 세미나
Uml 세미나
 
2015 Open Cloud Engine Handbook
2015 Open Cloud Engine Handbook2015 Open Cloud Engine Handbook
2015 Open Cloud Engine Handbook
 
Droid knights 2019 - (Large-scale App을 위한) Android Architecture 총정리
Droid knights 2019 - (Large-scale App을 위한) Android Architecture 총정리Droid knights 2019 - (Large-scale App을 위한) Android Architecture 총정리
Droid knights 2019 - (Large-scale App을 위한) Android Architecture 총정리
 
Cloud migration pattern using microservices
Cloud migration pattern using microservicesCloud migration pattern using microservices
Cloud migration pattern using microservices
 
Dev rookie codecomplete-1
Dev rookie codecomplete-1Dev rookie codecomplete-1
Dev rookie codecomplete-1
 
3부. 더 심층적인 통찰력을 향한 리팩터링 (8장 도약)
3부. 더 심층적인 통찰력을 향한 리팩터링 (8장 도약)3부. 더 심층적인 통찰력을 향한 리팩터링 (8장 도약)
3부. 더 심층적인 통찰력을 향한 리팩터링 (8장 도약)
 
MSA 세미나.pptx
MSA 세미나.pptxMSA 세미나.pptx
MSA 세미나.pptx
 
마이크로 프론트엔드 아키텍쳐를 위한 모노레포 관리
마이크로 프론트엔드 아키텍쳐를 위한 모노레포 관리마이크로 프론트엔드 아키텍쳐를 위한 모노레포 관리
마이크로 프론트엔드 아키텍쳐를 위한 모노레포 관리
 
도메인 주도 설계 - DDD
도메인 주도 설계 - DDD도메인 주도 설계 - DDD
도메인 주도 설계 - DDD
 

More from SH Park

Nodejs_chapter9
Nodejs_chapter9Nodejs_chapter9
Nodejs_chapter9
SH Park
 
PrimesIsInP
PrimesIsInPPrimesIsInP
PrimesIsInPSH Park
 
Introduction to prolog
Introduction to prologIntroduction to prolog
Introduction to prologSH Park
 
Apprenticeship patterns chapter4
Apprenticeship patterns chapter4Apprenticeship patterns chapter4
Apprenticeship patterns chapter4SH Park
 
xunittestpatternchapter15
xunittestpatternchapter15xunittestpatternchapter15
xunittestpatternchapter15SH Park
 
Design Pattern In Functional Language
Design Pattern In Functional LanguageDesign Pattern In Functional Language
Design Pattern In Functional LanguageSH Park
 
4장 스포츠 시뮬레이션 - 단순 축구
4장 스포츠 시뮬레이션 - 단순 축구4장 스포츠 시뮬레이션 - 단순 축구
4장 스포츠 시뮬레이션 - 단순 축구SH Park
 
5장. 그래프와 트리 (3,4)
5장. 그래프와 트리 (3,4)5장. 그래프와 트리 (3,4)
5장. 그래프와 트리 (3,4)SH Park
 

More from SH Park (8)

Nodejs_chapter9
Nodejs_chapter9Nodejs_chapter9
Nodejs_chapter9
 
PrimesIsInP
PrimesIsInPPrimesIsInP
PrimesIsInP
 
Introduction to prolog
Introduction to prologIntroduction to prolog
Introduction to prolog
 
Apprenticeship patterns chapter4
Apprenticeship patterns chapter4Apprenticeship patterns chapter4
Apprenticeship patterns chapter4
 
xunittestpatternchapter15
xunittestpatternchapter15xunittestpatternchapter15
xunittestpatternchapter15
 
Design Pattern In Functional Language
Design Pattern In Functional LanguageDesign Pattern In Functional Language
Design Pattern In Functional Language
 
4장 스포츠 시뮬레이션 - 단순 축구
4장 스포츠 시뮬레이션 - 단순 축구4장 스포츠 시뮬레이션 - 단순 축구
4장 스포츠 시뮬레이션 - 단순 축구
 
5장. 그래프와 트리 (3,4)
5장. 그래프와 트리 (3,4)5장. 그래프와 트리 (3,4)
5장. 그래프와 트리 (3,4)
 

도메인 주도 설계 - 16 대규모 구조

  • 1. 도메인 주도 설계 16. 대규모 구조 아꿈사 박상혁 (kazuyapsh@gmail.com)
  • 2. 대규모 구조 • 설계를 관리 가능한 응집력 있는 MODULE로 분해 • 굉장히 많은 MODULE이 생겨남 • 기능의 특정 측면을 보려면 어떤 패키지를 찾아야 할까? • 새 클래스는 어디다 둬야 할까? • 이런 작은 패키지 중 일부는 실제로 어떤 의미가 있는가? • 그와 같은 패키지는 서로 얼마나 잘 어울릴까? • MODULAR를 중심으로 분해하더라도 큰 모델은 파악하기에 너무 복잡할 수 있다!
  • 3. 대규모 구조 • 프로젝트의 규모와 상관없이 사람들은 시스템의 다른 부분에서 어 느 정도 독립적으로 일해야 한다 • 큰 시스템에, 해당 시스템의 요소를 전체 설계에 걸친 패턴에서의 역할 측면에서 해석하게 할 수 있는 지배적익 원칙이 없다면 개발 자들은 나무만 보고 숲을 보지 못한다. • 전체의 세부 사항을 깊이 파고들지 않고도 전체의 각 부분이 담당 하는 역할을 이해할 수 있어야 한다
  • 4. 대규모 구조의 패턴 SYSTEM METAPHOR MODEL-DRIVEN RESPONSIBILITY DESIGN LAYER EVOLVING ORDER KNOWLEDGE LEVEL PLUGGABLE COMPONENT FRAMEWORK
  • 5. EVOLVING ORDER 발전하는 질서 • 구조화 되지 않은 설계에서 발생하는 비용을 경험한 적이 있는가? • 이런 혼란을 피하고자 프로젝트에서는 다양한 방법으로 개발을 제약하는 아키텍처를 부과한다 • 아무나 설계할 수 있다면 – 누구도 전체적으로 이해할 수 없는 시스템이 만들어지고 – 이런 시스템은 유지보수 하기 어렵다 • 그러나 아키텍처는 사전 설계와 관련한 가정을 둠으로써 프로젝트 를 속박할 수 있고, 애플리케이션의 특정 부분에 대해 개발자/설계 자의 권한을 너무 많이 앗아갈 수 있다.
  • 6. EVOLVING ORDER 발전하는 질서 • 개념적인 대규모 구조가 애플리케이션과 함께 발전하게 해서 발전 과정에서 전혀 다른 형식의 구조로도 변화할 수 있게 하라. • 반드시 세부적인 지식을 토대로 내려야 할 세부적인 설계 및 모델 과 관련된 의사결정을 과도하게 제약해서는 안된다.
  • 7. 대규모 구조의 패턴 SYSTEM METAPHOR MODEL-DRIVEN RESPONSIBILITY DESIGN LAYER EVOLVING ORDER KNOWLEDGE LEVEL PLUGGABLE COMPONENT FRAMEWORK
  • 8. SYSTEM METAPHOR 시스템 은유 • 소프트웨어 설계는 매우 추상적이고 파악하기 힘든 경향이 있다. • 개발자와 사용자가 모두 시스템을 이해하고 시스템을 전체적으로 바라보는 시각을 공유할 구체적인 수단이 필요하다 • '시스템 은유'는 어찌됐건 일종의 비유에 불과하므로 다양한 모델 이 적절한 방법으로 '시스템 은유'에 매핑될 수 있다 • 어떤 시스템의 구체적인 비유가 나타나 팀원의 상상력을 포착하고 유용한 방향으로 사고를 이끄는 것으로 보인다면 그것을 대규모 구조로 채택하라
  • 9. 대규모 구조의 패턴 SYSTEM METAPHOR MODEL-DRIVEN RESPONSIBILITY DESIGN LAYER EVOLVING ORDER KNOWLEDGE LEVEL PLUGGABLE COMPONENT FRAMEWORK
  • 10. RESPONSIBILITY LAYER 책임 계층 • 각 개별 객체에 손수 만든 책임이 할당돼 있다면 가이드라인도 없 고, 균일함도 없고, 넓은 범위에 걸친 도메인을 동시에 다룰 능력 도 없는 셈이다. 큰 모델이 응집력을 부여하려면 그러한 책임 할당 에 특정 구조를 도입하는 것이 도움이 된다. • 계층은 시스템 구획으로서... • 모델에 존재하는 개념적 의존성과 도메인의 여러 부분에 대한 다 양한 변화율과 변화의 근원을 검토하라. 도메인에서 자연적인 층 을 식별하면 그것을 광범위한 추상적 책임으로 간주하라 • AGGREGATE, MODULE과 같은 각 도메인 객체의 책임이 한 계 층의 책임안에서 말끔히 맞아 떨어지로록 모델을 리팩터링하라
  • 11. RESPONSIBILITY LAYER 책임 계층 • 그림 16-3
  • 12. RESPONSIBILITY LAYER 책임 계층 • "운영" 책임과 "기능"책임 • 그림 16-6
  • 13. RESPONSIBILITY LAYER 책임 계층 • "의사결정 지원" 책임 • 그림 16-8
  • 14. RESPONSIBILITY LAYER 책임 계층 • 그림 16-11
  • 15. 대규모 구조의 패턴 SYSTEM METAPHOR MODEL-DRIVEN RESPONSIBILITY DESIGN LAYER EVOLVING ORDER KNOWLEDGE LEVEL PLUGGABLE COMPONENT FRAMEWORK
  • 16. KNOWLEDGE LEVEL 지식 수준 • 더 넓은 범위의 규칙으로 제약되기 전까지 모델의 특정 부분을 사 용자의 손에 맡겨야 할 때 생기는 문제를 해결한다 • 도메일을 모델링하기 보다 모델을 구조화한다
  • 17. KNOWLEDGE LEVEL 지식 수준 • 그림 16-15
  • 18. KNOWLEDGE LEVEL 지식 수준 • 그림 16-17
  • 19. KNOWLEDGE LEVEL 지식 수준 • 그림 16-19
  • 20. KNOWLEDGE LEVEL 지식 수준 • ENTITY 간의 역할과 관계가 각 상황마다 다양하게 작용하는 애 플리케이션에서는 복잡성이 폭발적으로 증가할 수 있다 • 완전히 일반화된 모델이나 고도로 맞춤화가 가능한 모델도 사용 자의 욕구를 충족하지 못한다 – 다른 타입을 참조하거나 – 각종 상황에서 여러가지 방법으로 쓰일 속성을 갖게 된다 • 기본적인 모델의 구조와 행위를 서술하고 제약하는 데 쓸 수 있는 별도의 객체 집합을 만들어라 • 이러한 관심사를 두가지 '수준'으로 분리해서 하나는 매우 구체적 으로 만들고 다른 하나는 사용자나 관리자의 맞춤화가 가능한 규 칙과 지식을 반영하게 만들어라
  • 21. KNOWLEDGE LEVEL 지식 수준 • 그림 16-21
  • 22. KNOWLEDGE LEVEL 지식 수준 • 그림 16-22
  • 23. 대규모 구조의 패턴 SYSTEM METAPHOR MODEL-DRIVEN RESPONSIBILITY DESIGN LAYER EVOLVING ORDER KNOWLEDGE LEVEL PLUGGABLE COMPONENT FRAMEWORK
  • 24. PLUGGABLE COMPONENT FRAMEWORK • 인터페이스와 상호작용에 대한 ABSTRACT CORE를 정제하고 그 러한 인터페이스의 다양한 구현이 자유롭게 대체될 수 있는 프레 임워크를 만들어라 • 이와 마찬가지로 컴포넌트가 ABSTRACT CORE의 인터페이스를 통해 정확히 작동하는 한 어떠한 애플리케이션에서도 그러한 컴포 넌트를 사용할 수 있게 하라. • MAVEN ?
  • 25. 구조는 얼마나 제약성을 지녀야 하는가? • 여러가지 대규모 구조가 가능하고, 심지어 일반화된 구조 패턴 안 에서도 규칙을 얼마나 제약적으로 만드는가에 관한 선택의 여지는 많다 • 제약은 개발자가 필요로 하는 유연함을 앗아갈 수 있다 • 프레임워크를 만들고 대규모 구조의 구현을 엄격히 통제하고자 하 는 유혹을 이겨내야 한다 • 대규모 구조가 공헌하는 가장 중요한 바는 개념적 응집성과 도메 인에 대한 통찰력을 주는 것이다
  • 26. 잘 맞아떨어지는 구조를 향한 리팩터링 • 최소주의 – 구조를 간단하고 가볍게 – 초반에는 '시스템은유'나 몇 가지 '책임계층'과 같은 느슨한 구조 • 의사소통과 자기 훈련 – 새로운 개발과 리팩터링을 할 때 반드시 구조를 따른다 – 대부분의 대규모 구조가 느슨한 개념적 지침이라서 팀은 반드시 '자기 훈련'을 수행해야 한다
  • 27. 잘 맞아떨어지는 구조를 향한 리팩터링 • 재구조화가 유연한 설계를 낳는다 – 구조는 시스템의 복잡성이 증가하고 이해가 깊어질수록 발전한다 – 구조가 바뀔 때 전체 시스템은 새로운 질서를 따르도록 바뀌어야 한다 • 디스틸레이션은 부하를 줄인다 – 지속적인 디스틸레이션