SlideShare ist ein Scribd-Unternehmen logo
1 von 25
DDD 그게 뭔데 (DDD 개념 찍어 먹어보기 편)
고명석 a.k.a R.bert Ko
자기 소개
• Incheon Dev‘s 커뮤니티 운영 중
• 현재 Mondrian AI Backend / Infra Engineer
• 종합 4년차 개발자
• WPF를 이용한 Vision Machine 개발 1년 4개월
• 웹 프런트 개발 1년 1개월
• 웹 백엔드 개발 / 인프라 1년
제 인생 목표는 토발즈, 밥 형 보다 유명해지기,
하루에 발렌타인 30년산 한 잔씩 마시는 삶
그 중에 밥아저씨… Uncle Bob은 누구?
깔끔한거 좋아하는 아저씨 Robert C. Martin a.k.a “Uncle bob” Martin
• 클린 코드
• 클린 코더
• 클린 아키텍처
• 클린 애자일
저희가 봐야할 건 여기 밑에 있는 클린 아키텍처입니다.
물론 나머지 책들도 명서이니 읽어보시죠
• 프레임워크의 독립적
• 테스트 용이
• UI 독립적, Database 독립적
• 외부 기능 독립적
을 목적으로 밥 삼촌이 내세운 아키텍처인데,
한마디로 의존성(관심사) 분리가 목적이며
대부분의 아키텍처들도 마찬가지!
클린 아키텍처는
• 클린 아키텍처
• DDD
• Hexagonal (Ports & Adapters)
• Onion
등 다양한 아키텍처를 참고해서 구조가 잡혀있습니다.
현재 몬드리안에이아이에서는
DDD에 대해서 말한다더니… 클린 아키텍처말고 DDD는 뭐죠?
DDD는
Domain Driven Design, 즉 도메인 주도 설계의 약자입니다.
DDD도
클린 아키텍처와 같은 목표를 갖고있는 아키텍처입니다.
(그래서 클린 아키텍처를 서두로 시작했던 것이죠…!)
도메인…?
blahblah.com 이런건가요…?
Domain은 저희가 아는 그런 IPv4, IPv6를 이해하기 쉽게 만든 그런 녀석이 아닙니다.
DDD에서의
Domain은 소프트웨어로 해결하고자 하는 영역을 말합니다
Post
Views
Comment
Likes
게시판을 예로 들면 도메인은 다음과 같을 수 있습니다.
Post라는 도메인을 루트로, 하위에 Views, Comment, Likes 등과 같은 Domain Model들을 구성 할 수 있죠.
물론 Views, Comment, Like에도 하위 Domain Model들을 구성할 수 있습니다.
DDD에는
다음과 같은 layer들로 구성이 되어있습니다.
User Interface (Presenter)
Application
Domain
Infrastructure
사용자로부터 요청을 받아서
하위 레이어 전달 및 반환.
Domain 모델을 이용하여 기능 구현.
Business logic은 Domain에서 구현한다.
Domain에 대한 핵심 Business
객체의 state 및 logic 제공
구현 기술에 대한 영속성 구현
이번 시간에는,
Domain Layer에 대해서 집중적으로 알아볼겁니다…!!
Domain Layer에는
• Entity
• Value
• Aggregate
• Repository
• Domain Service
그리고 다음과 같은 요소들이 있습니다.
Entity
• 식별자가 존재하며, 식별자를 제외한 나머지 값들은 변경가능한 (mutable) 오브젝트
• 해당 영역의 business logic 구현을 담당
• id값 외에 다른 값들이 같아도 같은 인스턴스가 아님!
• ex) Post, Comment
Domain Layer에는
Value
• 식별자는 존재하지 않으나, 값들이 불변인 오브젝트
• 개념적으로 완전한 하나를 표현할 때 사용
• 오브젝트의 모든 값이 같으면 서로 같은 인스턴스!
• Entity나 또 다른 VO의 속성으로서 사용된다
• ex) Views, Likes
예를 들어,
Post {
id: 2,
title: “Post”,
context: “Hello~” ,
views: Views(8)
}
Post {
id: 1,
title: “Post”,
context: “Hello~” ,
views: Views(3)
}
Entity
Post {
id: 1,
title: “Post2”,
context: “Hello…” ,
views: Views(5)
}
Post {
id: 1,
title: “Post”,
context: “Hello~”,
views: Views(3)
}
Entity
예를 들어,
Views {
count: 3
}
Views {
count: 3
}
VO
Views {
count: 4
}
Views {
count: 3
}
VO
• 애그리거트에 속한 모든 객체의 일관성 유지를 위해, 애그리거트에 대표하는 Entity를
애그리거트 루트로 갖고 있는다.
• 복잡한 도메인을 단순한 구조로 만들어준다
• 한 애그리거트에 속한 객체는 다른 애그리거트에 속할 수 없다
• 서로 다른 애그리거트는 서로를 관리 할 수 없다
Aggregate는?
수많은 Domain Model들의 복잡성을 줄이기 위해 상위 수준으로 묶은 군집입니다.
Aggregate는?
Post
<Root>
Post
Views Likes
Comment
<Root>
Comment
User
<Root>
User
다음에 이어서 배울 내용은?
• DIP (Denpendency Inversion Principle)과 Infrastructure Layer, Repository
• Business Logic 구현 예제
• Domain Service
• Aggregate간 Transaction 관리
• Bounded Context
감사합니다!
참고:
• http://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html
• https://k-elon.tistory.com/38

Weitere ähnliche Inhalte

Was ist angesagt?

유지보수 가능한 개발 원칙
유지보수 가능한 개발 원칙유지보수 가능한 개발 원칙
유지보수 가능한 개발 원칙Hyosang Hong
 
Ksug2015 - JPA2, JPA 기초와매핑
Ksug2015 - JPA2, JPA 기초와매핑Ksug2015 - JPA2, JPA 기초와매핑
Ksug2015 - JPA2, JPA 기초와매핑Younghan Kim
 
영속성 컨텍스트로 보는 JPA
영속성 컨텍스트로 보는 JPA영속성 컨텍스트로 보는 JPA
영속성 컨텍스트로 보는 JPA경원 이
 
SpringDataJPA - 스프링 캠프
SpringDataJPA - 스프링 캠프SpringDataJPA - 스프링 캠프
SpringDataJPA - 스프링 캠프Younghan Kim
 
Ksug2015 - JPA1, JPA 소개
Ksug2015 - JPA1, JPA 소개Ksug2015 - JPA1, JPA 소개
Ksug2015 - JPA1, JPA 소개Younghan Kim
 
좌충우돌 ORM 개발기 | Devon 2012
좌충우돌 ORM 개발기 | Devon 2012좌충우돌 ORM 개발기 | Devon 2012
좌충우돌 ORM 개발기 | Devon 2012Daum DNA
 
Domain-Driven-Design 정복기 2탄
Domain-Driven-Design 정복기 2탄Domain-Driven-Design 정복기 2탄
Domain-Driven-Design 정복기 2탄Suhyeon Jo
 
Hibernate start (하이버네이트 시작하기)
Hibernate start (하이버네이트 시작하기)Hibernate start (하이버네이트 시작하기)
Hibernate start (하이버네이트 시작하기)visual khh
 
DDD와 이벤트소싱
DDD와 이벤트소싱DDD와 이벤트소싱
DDD와 이벤트소싱Suhyeon Jo
 
Sql 중심 코드 탈피 발표자료
Sql 중심 코드 탈피 발표자료Sql 중심 코드 탈피 발표자료
Sql 중심 코드 탈피 발표자료ssuser776e2d
 
MyBatis에서 JPA로
MyBatis에서 JPA로MyBatis에서 JPA로
MyBatis에서 JPA로Dongmin Shin
 
VSTS와 Azure를 이용한 팀 프로세스 관리
VSTS와 Azure를 이용한 팀 프로세스 관리VSTS와 Azure를 이용한 팀 프로세스 관리
VSTS와 Azure를 이용한 팀 프로세스 관리Gyuwon Yi
 
Sql 중심 코드 탈피
Sql 중심 코드 탈피Sql 중심 코드 탈피
Sql 중심 코드 탈피ssuser776e2d
 
Introduction to Web Components
Introduction to Web ComponentsIntroduction to Web Components
Introduction to Web ComponentsEunYoung Kim
 

Was ist angesagt? (19)

유지보수 가능한 개발 원칙
유지보수 가능한 개발 원칙유지보수 가능한 개발 원칙
유지보수 가능한 개발 원칙
 
DDD Start Ch#3
DDD Start Ch#3DDD Start Ch#3
DDD Start Ch#3
 
Ksug2015 - JPA2, JPA 기초와매핑
Ksug2015 - JPA2, JPA 기초와매핑Ksug2015 - JPA2, JPA 기초와매핑
Ksug2015 - JPA2, JPA 기초와매핑
 
영속성 컨텍스트로 보는 JPA
영속성 컨텍스트로 보는 JPA영속성 컨텍스트로 보는 JPA
영속성 컨텍스트로 보는 JPA
 
DDD start 1장
DDD start 1장DDD start 1장
DDD start 1장
 
SpringDataJPA - 스프링 캠프
SpringDataJPA - 스프링 캠프SpringDataJPA - 스프링 캠프
SpringDataJPA - 스프링 캠프
 
Ksug2015 - JPA1, JPA 소개
Ksug2015 - JPA1, JPA 소개Ksug2015 - JPA1, JPA 소개
Ksug2015 - JPA1, JPA 소개
 
좌충우돌 ORM 개발기 | Devon 2012
좌충우돌 ORM 개발기 | Devon 2012좌충우돌 ORM 개발기 | Devon 2012
좌충우돌 ORM 개발기 | Devon 2012
 
Domain-Driven-Design 정복기 2탄
Domain-Driven-Design 정복기 2탄Domain-Driven-Design 정복기 2탄
Domain-Driven-Design 정복기 2탄
 
DDD Repository
DDD RepositoryDDD Repository
DDD Repository
 
Hibernate start (하이버네이트 시작하기)
Hibernate start (하이버네이트 시작하기)Hibernate start (하이버네이트 시작하기)
Hibernate start (하이버네이트 시작하기)
 
DDD와 이벤트소싱
DDD와 이벤트소싱DDD와 이벤트소싱
DDD와 이벤트소싱
 
Sql 중심 코드 탈피 발표자료
Sql 중심 코드 탈피 발표자료Sql 중심 코드 탈피 발표자료
Sql 중심 코드 탈피 발표자료
 
MyBatis에서 JPA로
MyBatis에서 JPA로MyBatis에서 JPA로
MyBatis에서 JPA로
 
VSTS와 Azure를 이용한 팀 프로세스 관리
VSTS와 Azure를 이용한 팀 프로세스 관리VSTS와 Azure를 이용한 팀 프로세스 관리
VSTS와 Azure를 이용한 팀 프로세스 관리
 
Sql 중심 코드 탈피
Sql 중심 코드 탈피Sql 중심 코드 탈피
Sql 중심 코드 탈피
 
Introduction to Web Components
Introduction to Web ComponentsIntroduction to Web Components
Introduction to Web Components
 
DDD 준비 서문래
DDD 준비 서문래DDD 준비 서문래
DDD 준비 서문래
 
Java script
Java scriptJava script
Java script
 

Ähnlich wie DDD 그게 뭔데 (개념 찍먹편)

객체지향프로그래밍 특강
객체지향프로그래밍 특강객체지향프로그래밍 특강
객체지향프로그래밍 특강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
 
Node.js에서 공공API를 활용해서 개발하기
Node.js에서 공공API를 활용해서 개발하기Node.js에서 공공API를 활용해서 개발하기
Node.js에서 공공API를 활용해서 개발하기Inho Kwon
 
D2 캠퍼스 세미나 - 학생 개발자에서 신입 개발자로 한단계 업그레이드 하기
D2 캠퍼스 세미나 - 학생 개발자에서 신입 개발자로 한단계 업그레이드 하기D2 캠퍼스 세미나 - 학생 개발자에서 신입 개발자로 한단계 업그레이드 하기
D2 캠퍼스 세미나 - 학생 개발자에서 신입 개발자로 한단계 업그레이드 하기Soojin Ro
 
차정민 (소프트웨어 엔지니어) 이력서 + 경력기술서
차정민 (소프트웨어 엔지니어) 이력서 + 경력기술서차정민 (소프트웨어 엔지니어) 이력서 + 경력기술서
차정민 (소프트웨어 엔지니어) 이력서 + 경력기술서Jeongmin Cha
 
이제 문서는 DocC로 만들때가 되지 않았나요?
이제 문서는 DocC로 만들때가  되지 않았나요?이제 문서는 DocC로 만들때가  되지 않았나요?
이제 문서는 DocC로 만들때가 되지 않았나요?hyunho Lee
 
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍Chris Ohk
 
스프링 스터디 1장
스프링 스터디 1장스프링 스터디 1장
스프링 스터디 1장Seongchan Kang
 
131 deview 2013 yobi-채수원
131 deview 2013 yobi-채수원131 deview 2013 yobi-채수원
131 deview 2013 yobi-채수원NAVER D2
 
develop android app using intellij
develop android app using intellijdevelop android app using intellij
develop android app using intellijSewon Ann
 
개발자로써 갖춰야할 스킬들 - 최용호
개발자로써 갖춰야할 스킬들 - 최용호개발자로써 갖춰야할 스킬들 - 최용호
개발자로써 갖춰야할 스킬들 - 최용호용호 최
 
2015 SW마에스트로 100+ 컨퍼런스_오픈스택 Swift로 시작하는 오픈소스 분석 삽질기
2015 SW마에스트로 100+ 컨퍼런스_오픈스택 Swift로 시작하는 오픈소스 분석 삽질기2015 SW마에스트로 100+ 컨퍼런스_오픈스택 Swift로 시작하는 오픈소스 분석 삽질기
2015 SW마에스트로 100+ 컨퍼런스_오픈스택 Swift로 시작하는 오픈소스 분석 삽질기2015 SW마에스트로 100+ 컨퍼런스
 
이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013
이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013
이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013devCAT Studio, NEXON
 
오픈소스 소프트웨어 개발, 어디서부터 시작하는게 좋을까요? @ CNU(충남대)
오픈소스 소프트웨어 개발, 어디서부터 시작하는게 좋을까요? @ CNU(충남대)오픈소스 소프트웨어 개발, 어디서부터 시작하는게 좋을까요? @ CNU(충남대)
오픈소스 소프트웨어 개발, 어디서부터 시작하는게 좋을까요? @ CNU(충남대)Jaewon Choi
 
[12월 번역 Meetup] 나의 오픈스택 번역 contributing 삽질 경험기
[12월 번역 Meetup] 나의 오픈스택 번역 contributing 삽질 경험기[12월 번역 Meetup] 나의 오픈스택 번역 contributing 삽질 경험기
[12월 번역 Meetup] 나의 오픈스택 번역 contributing 삽질 경험기OpenStack Korea Community
 
[DEVIEW 2016] 네이버의 모던 웹 라이브러리 - egjs
[DEVIEW 2016] 네이버의 모던 웹 라이브러리 - egjs[DEVIEW 2016] 네이버의 모던 웹 라이브러리 - egjs
[DEVIEW 2016] 네이버의 모던 웹 라이브러리 - egjsJae Sung Park
 
격변하는 프로그래밍 언어, 이제는 Let it go
격변하는 프로그래밍 언어, 이제는 Let it go격변하는 프로그래밍 언어, 이제는 Let it go
격변하는 프로그래밍 언어, 이제는 Let it goChris Ohk
 
200819 NAVER TECH CONCERT 07_신입 iOS 개발자 개발업무 적응기
200819 NAVER TECH CONCERT 07_신입 iOS 개발자 개발업무 적응기200819 NAVER TECH CONCERT 07_신입 iOS 개발자 개발업무 적응기
200819 NAVER TECH CONCERT 07_신입 iOS 개발자 개발업무 적응기NAVER Engineering
 
Domain-Driven-Design 정복기 1탄
Domain-Driven-Design 정복기 1탄Domain-Driven-Design 정복기 1탄
Domain-Driven-Design 정복기 1탄Suhyeon Jo
 
소프트웨어 개발 트랜드 및 MSA (마이크로 서비스 아키텍쳐)의 이해
소프트웨어 개발 트랜드 및 MSA (마이크로 서비스 아키텍쳐)의 이해소프트웨어 개발 트랜드 및 MSA (마이크로 서비스 아키텍쳐)의 이해
소프트웨어 개발 트랜드 및 MSA (마이크로 서비스 아키텍쳐)의 이해Terry Cho
 

Ähnlich wie DDD 그게 뭔데 (개념 찍먹편) (20)

객체지향프로그래밍 특강
객체지향프로그래밍 특강객체지향프로그래밍 특강
객체지향프로그래밍 특강
 
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 총정리
 
Node.js에서 공공API를 활용해서 개발하기
Node.js에서 공공API를 활용해서 개발하기Node.js에서 공공API를 활용해서 개발하기
Node.js에서 공공API를 활용해서 개발하기
 
D2 캠퍼스 세미나 - 학생 개발자에서 신입 개발자로 한단계 업그레이드 하기
D2 캠퍼스 세미나 - 학생 개발자에서 신입 개발자로 한단계 업그레이드 하기D2 캠퍼스 세미나 - 학생 개발자에서 신입 개발자로 한단계 업그레이드 하기
D2 캠퍼스 세미나 - 학생 개발자에서 신입 개발자로 한단계 업그레이드 하기
 
차정민 (소프트웨어 엔지니어) 이력서 + 경력기술서
차정민 (소프트웨어 엔지니어) 이력서 + 경력기술서차정민 (소프트웨어 엔지니어) 이력서 + 경력기술서
차정민 (소프트웨어 엔지니어) 이력서 + 경력기술서
 
이제 문서는 DocC로 만들때가 되지 않았나요?
이제 문서는 DocC로 만들때가  되지 않았나요?이제 문서는 DocC로 만들때가  되지 않았나요?
이제 문서는 DocC로 만들때가 되지 않았나요?
 
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
 
스프링 스터디 1장
스프링 스터디 1장스프링 스터디 1장
스프링 스터디 1장
 
131 deview 2013 yobi-채수원
131 deview 2013 yobi-채수원131 deview 2013 yobi-채수원
131 deview 2013 yobi-채수원
 
develop android app using intellij
develop android app using intellijdevelop android app using intellij
develop android app using intellij
 
개발자로써 갖춰야할 스킬들 - 최용호
개발자로써 갖춰야할 스킬들 - 최용호개발자로써 갖춰야할 스킬들 - 최용호
개발자로써 갖춰야할 스킬들 - 최용호
 
2015 SW마에스트로 100+ 컨퍼런스_오픈스택 Swift로 시작하는 오픈소스 분석 삽질기
2015 SW마에스트로 100+ 컨퍼런스_오픈스택 Swift로 시작하는 오픈소스 분석 삽질기2015 SW마에스트로 100+ 컨퍼런스_오픈스택 Swift로 시작하는 오픈소스 분석 삽질기
2015 SW마에스트로 100+ 컨퍼런스_오픈스택 Swift로 시작하는 오픈소스 분석 삽질기
 
이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013
이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013
이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013
 
오픈소스 소프트웨어 개발, 어디서부터 시작하는게 좋을까요? @ CNU(충남대)
오픈소스 소프트웨어 개발, 어디서부터 시작하는게 좋을까요? @ CNU(충남대)오픈소스 소프트웨어 개발, 어디서부터 시작하는게 좋을까요? @ CNU(충남대)
오픈소스 소프트웨어 개발, 어디서부터 시작하는게 좋을까요? @ CNU(충남대)
 
[12월 번역 Meetup] 나의 오픈스택 번역 contributing 삽질 경험기
[12월 번역 Meetup] 나의 오픈스택 번역 contributing 삽질 경험기[12월 번역 Meetup] 나의 오픈스택 번역 contributing 삽질 경험기
[12월 번역 Meetup] 나의 오픈스택 번역 contributing 삽질 경험기
 
[DEVIEW 2016] 네이버의 모던 웹 라이브러리 - egjs
[DEVIEW 2016] 네이버의 모던 웹 라이브러리 - egjs[DEVIEW 2016] 네이버의 모던 웹 라이브러리 - egjs
[DEVIEW 2016] 네이버의 모던 웹 라이브러리 - egjs
 
격변하는 프로그래밍 언어, 이제는 Let it go
격변하는 프로그래밍 언어, 이제는 Let it go격변하는 프로그래밍 언어, 이제는 Let it go
격변하는 프로그래밍 언어, 이제는 Let it go
 
200819 NAVER TECH CONCERT 07_신입 iOS 개발자 개발업무 적응기
200819 NAVER TECH CONCERT 07_신입 iOS 개발자 개발업무 적응기200819 NAVER TECH CONCERT 07_신입 iOS 개발자 개발업무 적응기
200819 NAVER TECH CONCERT 07_신입 iOS 개발자 개발업무 적응기
 
Domain-Driven-Design 정복기 1탄
Domain-Driven-Design 정복기 1탄Domain-Driven-Design 정복기 1탄
Domain-Driven-Design 정복기 1탄
 
소프트웨어 개발 트랜드 및 MSA (마이크로 서비스 아키텍쳐)의 이해
소프트웨어 개발 트랜드 및 MSA (마이크로 서비스 아키텍쳐)의 이해소프트웨어 개발 트랜드 및 MSA (마이크로 서비스 아키텍쳐)의 이해
소프트웨어 개발 트랜드 및 MSA (마이크로 서비스 아키텍쳐)의 이해
 

DDD 그게 뭔데 (개념 찍먹편)

  • 1. DDD 그게 뭔데 (DDD 개념 찍어 먹어보기 편) 고명석 a.k.a R.bert Ko
  • 2. 자기 소개 • Incheon Dev‘s 커뮤니티 운영 중 • 현재 Mondrian AI Backend / Infra Engineer • 종합 4년차 개발자 • WPF를 이용한 Vision Machine 개발 1년 4개월 • 웹 프런트 개발 1년 1개월 • 웹 백엔드 개발 / 인프라 1년
  • 3. 제 인생 목표는 토발즈, 밥 형 보다 유명해지기, 하루에 발렌타인 30년산 한 잔씩 마시는 삶
  • 4. 그 중에 밥아저씨… Uncle Bob은 누구?
  • 5. 깔끔한거 좋아하는 아저씨 Robert C. Martin a.k.a “Uncle bob” Martin • 클린 코드 • 클린 코더 • 클린 아키텍처 • 클린 애자일
  • 6. 저희가 봐야할 건 여기 밑에 있는 클린 아키텍처입니다. 물론 나머지 책들도 명서이니 읽어보시죠
  • 7. • 프레임워크의 독립적 • 테스트 용이 • UI 독립적, Database 독립적 • 외부 기능 독립적 을 목적으로 밥 삼촌이 내세운 아키텍처인데, 한마디로 의존성(관심사) 분리가 목적이며 대부분의 아키텍처들도 마찬가지! 클린 아키텍처는
  • 8. • 클린 아키텍처 • DDD • Hexagonal (Ports & Adapters) • Onion 등 다양한 아키텍처를 참고해서 구조가 잡혀있습니다. 현재 몬드리안에이아이에서는
  • 9. DDD에 대해서 말한다더니… 클린 아키텍처말고 DDD는 뭐죠?
  • 10. DDD는 Domain Driven Design, 즉 도메인 주도 설계의 약자입니다.
  • 11. DDD도 클린 아키텍처와 같은 목표를 갖고있는 아키텍처입니다. (그래서 클린 아키텍처를 서두로 시작했던 것이죠…!)
  • 13. Domain은 저희가 아는 그런 IPv4, IPv6를 이해하기 쉽게 만든 그런 녀석이 아닙니다. DDD에서의 Domain은 소프트웨어로 해결하고자 하는 영역을 말합니다
  • 14. Post Views Comment Likes 게시판을 예로 들면 도메인은 다음과 같을 수 있습니다. Post라는 도메인을 루트로, 하위에 Views, Comment, Likes 등과 같은 Domain Model들을 구성 할 수 있죠. 물론 Views, Comment, Like에도 하위 Domain Model들을 구성할 수 있습니다.
  • 15. DDD에는 다음과 같은 layer들로 구성이 되어있습니다. User Interface (Presenter) Application Domain Infrastructure 사용자로부터 요청을 받아서 하위 레이어 전달 및 반환. Domain 모델을 이용하여 기능 구현. Business logic은 Domain에서 구현한다. Domain에 대한 핵심 Business 객체의 state 및 logic 제공 구현 기술에 대한 영속성 구현
  • 16. 이번 시간에는, Domain Layer에 대해서 집중적으로 알아볼겁니다…!!
  • 17. Domain Layer에는 • Entity • Value • Aggregate • Repository • Domain Service 그리고 다음과 같은 요소들이 있습니다.
  • 18. Entity • 식별자가 존재하며, 식별자를 제외한 나머지 값들은 변경가능한 (mutable) 오브젝트 • 해당 영역의 business logic 구현을 담당 • id값 외에 다른 값들이 같아도 같은 인스턴스가 아님! • ex) Post, Comment Domain Layer에는 Value • 식별자는 존재하지 않으나, 값들이 불변인 오브젝트 • 개념적으로 완전한 하나를 표현할 때 사용 • 오브젝트의 모든 값이 같으면 서로 같은 인스턴스! • Entity나 또 다른 VO의 속성으로서 사용된다 • ex) Views, Likes
  • 19. 예를 들어, Post { id: 2, title: “Post”, context: “Hello~” , views: Views(8) } Post { id: 1, title: “Post”, context: “Hello~” , views: Views(3) } Entity Post { id: 1, title: “Post2”, context: “Hello…” , views: Views(5) } Post { id: 1, title: “Post”, context: “Hello~”, views: Views(3) } Entity
  • 20. 예를 들어, Views { count: 3 } Views { count: 3 } VO Views { count: 4 } Views { count: 3 } VO
  • 21. • 애그리거트에 속한 모든 객체의 일관성 유지를 위해, 애그리거트에 대표하는 Entity를 애그리거트 루트로 갖고 있는다. • 복잡한 도메인을 단순한 구조로 만들어준다 • 한 애그리거트에 속한 객체는 다른 애그리거트에 속할 수 없다 • 서로 다른 애그리거트는 서로를 관리 할 수 없다 Aggregate는? 수많은 Domain Model들의 복잡성을 줄이기 위해 상위 수준으로 묶은 군집입니다.
  • 23. 다음에 이어서 배울 내용은? • DIP (Denpendency Inversion Principle)과 Infrastructure Layer, Repository • Business Logic 구현 예제 • Domain Service • Aggregate간 Transaction 관리 • Bounded Context