SlideShare ist ein Scribd-Unternehmen logo
1 von 70
Downloaden Sie, um offline zu lesen
2021.10 stein.park
클린아키텍처&DDD
stein.park@kakao
구성
• 1. 바닥 다지기 : 클린 아키텍처 1부~4부
• 응집도가 높게 패키지 구성해보기
• 응집도&교착도, SOLID, 컴포넌트, dependency
• 2. 아키텍처 : 클린 아키텍처 5부
• Domain 레이어가 분리되는 과정 이해하기
• 3-tier, MVC, service layer, domain layer
• 클린 아키텍처 이해하기
• 3. Domain(layer) Driven Design : DDD Reference + DDD Distilled
• 도메인 레이어를 분리하기 위해 알아야할 사항들
WHY?
stein.park@kakao
해결영역이아닌문제영역에집중!
고객 S/W
Make
Right Product
Make
Product Right
https://productfolio.com/problem-space-vs-solution-space/ [dddd, p39]
stein.park@kakao
하지만현실은…
“무엇이 좋은가?”보다 “구현 가능한가?”에 많은 시간을 쏟음
PostMeta 수집 규칙
을 바꾸려면 어떻게 해야하
지??
[dddd, p99]
잘 정의된
PostMeta 수집 규칙은
무엇일까?
stein.park@kakao
이렇게좀이쁘게정리해보고싶은데
https://contextmapper.org/docs/event-storming/
stein.park@kakao
Action
Bounded Context
Reaction
Subdomain
그럴려면DDD뭐시기그러고…
근데 Domain Model은 뭐지??
Auth
Bounded Context
Reaction
Aggregate
<<Root>>
Reaction
<<ValueObject>>
UserId
<<Command>>
ReactCommand
<<ValueObject>>
UserId <<Entity>>
User
[dddd, p109 재구성]
token
<<DomainEvent>>
Reacted
stein.park@kakao
DomainModel얘기를하려면아키텍처얘기를해야하니
[dddd, p76]
stein.park@kakao
클린아키텍처부터시작합니다.
stein.park
1.바닥다지기
클린 아키텍처의 기본 지식들
stein.park@kakao
주요출처
[asd] Agile Software Development, Principles, Patterns, and Practices, 2003
[sd] Structured Design: Fundamentals of a Discipline of Computer Program and Systems Design, 1979/2008
[ca] The Clean Architecture(2017)
stein.park@kakao
주요출처
[asd] Agile Software Development, Principles, Patterns, and Practices, 2003
[sd] Structured Design: Fundamentals of a Discipline of Computer Program and Systems Design, 1979/2008
[ca] The Clean Architecture(2017)
stein.park@kakao
개요
• 1부: (아키텍처) 소개
• 2부: 프로그래밍 패러다임
• 3부에 앞서: 결합도&응집도
• 3부: SOLID
• 4부: 컴포넌트 원칙(REP, CCP, CRP, ADP, SDP, SAP)
stein.park@kakao
1부소개
• 1장 : 설계(design)과 아키텍처(architecture)란?
• 고수준에서 저수준으로 향하는 의사결정의 연속이며, 서로 이어져 있음
• 목표는 필요한 시스템을 만들고 유지보수하는 데 투입되는 인력을 최소하는 것
• 좋은 설계(TDD 등)를 갖추면 시작부터 끝까지 빠름
• 2장: 두 가지 가치에 대한 이야기
• 두 가지 가치 = 행위(behavior) + 구조(structure)
• 아키텍처는 형태(행위, 요구사항, 기능)에 독립적이어야하고, 그럴수록 더 실용적
• 변경을 쉽게 하는 구조를 만드는 것이 중요
stein.park@kakao
1부소개
• 변경이 쉬운 구조를 만들면
• 저수준과 고수준을 분리하고
• 의존성을 역전시켜주면
• 고수준에서 저수준으로 의사결정할 수 있음
• 고수준은 저수준에 독립적으로 의사결정
stein.park@kakao
2부벽돌부터시작하기:프로그래밍패러다임
• 구조적 프로그래밍: 제어흐름의 직접적인 전환에 대해 규칙을 부과한다.
• 함수를 증명가능한 더 작은 단위로 분해 & 테스트
• 테스트는 버그가 있음을 보여줄 뿐, 버그가 없음을 보여줄 수는 없다. - 다익스트라
• 객체 지향 프로그래밍: 제어흐름의 간접적인 전환에 대해 규칙을 부과한다.
• 캡슐화에는 딱히 강하지 않고, 상속에는 편리함을 주며, 다형성에는 안전&편리를 제공
• 다형성으로 의존성 역전이 쉬움 => 컴포넌트 분리가 쉬워짐 => 설계 자유도 UP
• 함수형 프로그래밍: 할당문에 대한 규칙을 부과한다.
• 경합조건, 교착상태, 동시 업데이트 모두 가변상태 때문인데 FP에서는 이 문제가 줄어듦
• 이벤트 소싱으로 데이터를 관리함으로써 완전한 불변성을 가질 수도 있음. 예) git
패러다임은 ‘해서는 안되는 것’을 규정
stein.park@kakao
2부벽돌부터시작하기:프로그래밍패러다임
• 구조적 프로그래밍: 제어흐름의 직접적인 전환에 대해 규칙을 부과한다.
• 함수를 증명가능한 더 작은 단위로 분해 & 테스트
• 테스트는 버그가 있음을 보여줄 뿐, 버그가 없음을 보여줄 수는 없다. - 다익스트라
• 객체 지향 프로그래밍: 제어흐름의 간접적인 전환에 대해 규칙을 부과한다.
• 캡슐화에는 딱히 강하지 않고, 상속에는 편리함을 주며, 다형성에는 안전&편리를 제공
• 다형성으로 의존성 역전이 쉬움 => 컴포넌트 분리가 쉬워짐 => 설계 자유도 UP
• 함수형 프로그래밍: 할당문에 대한 규칙을 부과한다.
• 경합조건, 교착상태, 동시 업데이트 모두 가변상태 때문인데 FP에서는 이 문제가 줄어듦
• 이벤트 소싱으로 데이터를 관리함으로써 완전한 불변성을 가질 수도 있음. 예) git
패러다임은 ‘해서는 안되는 것’을 규정
goto 쓰지마
stein.park@kakao
2부벽돌부터시작하기:프로그래밍패러다임
• 구조적 프로그래밍: 제어흐름의 직접적인 전환에 대해 규칙을 부과한다.
• 함수를 증명가능한 더 작은 단위로 분해 & 테스트
• 테스트는 버그가 있음을 보여줄 뿐, 버그가 없음을 보여줄 수는 없다. - 다익스트라
• 객체 지향 프로그래밍: 제어흐름의 간접적인 전환에 대해 규칙을 부과한다.
• 캡슐화에는 딱히 강하지 않고, 상속에는 편리함을 주며, 다형성에는 안전&편리를 제공
• 다형성으로 의존성 역전이 쉬움 => 컴포넌트 분리가 쉬워짐 => 설계 자유도 UP
• 함수형 프로그래밍: 할당문에 대한 규칙을 부과한다.
• 경합조건, 교착상태, 동시 업데이트 모두 가변상태 때문인데 FP에서는 이 문제가 줄어듦
• 이벤트 소싱으로 데이터를 관리함으로써 완전한 불변성을 가질 수도 있음. 예) git
패러다임은 ‘해서는 안되는 것’을 규정
goto 쓰지마
상속된 것으로만 전환해
stein.park@kakao
2부벽돌부터시작하기:프로그래밍패러다임
• 구조적 프로그래밍: 제어흐름의 직접적인 전환에 대해 규칙을 부과한다.
• 함수를 증명가능한 더 작은 단위로 분해 & 테스트
• 테스트는 버그가 있음을 보여줄 뿐, 버그가 없음을 보여줄 수는 없다. - 다익스트라
• 객체 지향 프로그래밍: 제어흐름의 간접적인 전환에 대해 규칙을 부과한다.
• 캡슐화에는 딱히 강하지 않고, 상속에는 편리함을 주며, 다형성에는 안전&편리를 제공
• 다형성으로 의존성 역전이 쉬움 => 컴포넌트 분리가 쉬워짐 => 설계 자유도 UP
• 함수형 프로그래밍: 할당문에 대한 규칙을 부과한다.
• 경합조건, 교착상태, 동시 업데이트 모두 가변상태 때문인데 FP에서는 이 문제가 줄어듦
• 이벤트 소싱으로 데이터를 관리함으로써 완전한 불변성을 가질 수도 있음. 예) git
패러다임은 ‘해서는 안되는 것’을 규정
goto 쓰지마
상속된 것으로만 전환해
immutable 만세
stein.park@kakao
3부에앞서:결합도&응집도
모듈: expression, statement, function, procedure, method, class, … ‘aggregate identifier’
[Structured Design, 1978, 2008] Kent Beck - youtube
Stackoverflow - What does 'low in coupling and high in cohesion' mean
Coursera - 객체 지향 설계
단일 액터를 책임지는 코드
를 함께 묶어주는 힘 - [ca]
slide: CSC407-Structured Design by Dave A. Penny
stein.park@kakao
3부에앞서:결합도&응집도
모듈: expression, statement, function, procedure, method, class, … ‘aggregate identifier’
[Structured Design, 1978, 2008] Kent Beck - youtube
Stackoverflow - What does 'low in coupling and high in cohesion' mean
Coursera - 객체 지향 설계
모든 코드를 한
파일에 때려넣음
단일 액터를 책임지는 코드
를 함께 묶어주는 힘 - [ca]
slide: CSC407-Structured Design by Dave A. Penny
stein.park@kakao
3부에앞서:결합도&응집도
모듈: expression, statement, function, procedure, method, class, … ‘aggregate identifier’
[Structured Design, 1978, 2008] Kent Beck - youtube
Stackoverflow - What does 'low in coupling and high in cohesion' mean
Coursera - 객체 지향 설계
모든 코드를 한
파일에 때려넣음
단일 액터를 책임지는 코드
를 함께 묶어주는 힘 - [ca]
응집도를 높이고
결합도를 줄여서
최적점을 찾자!
slide: CSC407-Structured Design by Dave A. Penny
stein.park@kakao
결합도&응집도…
복잡하면 비용 증가 -> 나누자 -> 고려사항이 는다 -> 나눠도 비용증가???
고려사항이 많아지면
복잡도가 증가 고려사항을 줄이기 위해 문제를 나눴더니
작아진 조각들 간에 복잡도가 증가
막 나누면 안되고
결합도를 낮추고 응집도를 높여라
stein.park@kakao
Coupling
Dependency가 문제!
stein.park@kakao
Cohesion
응집도는 문제영역에서 찾는다!
https://productfolio.com/problem-space-vs-solution-space/
고객 S/W
[dddd, p39]
Make
Right Product
Make
Product Right
(s) (s)
stein.park@kakao
문제영역vs해결영역
https://www.zentao.pm/blog/tree-swing-project-management-tire-analogy-426.mhtml
[s]
stein.park@kakao
정리하자면…문제영역중심으로잘쪼개자
어떻게 해야 잘 쪼개는지는 뒤에서 다룸
stein.park@kakao
정리하자면…문제영역중심으로잘쪼개자
어떻게 해야 잘 쪼개는지는 뒤에서 다룸
stein.park@kakao
결합도&응집도관점에서패키지나누기
Domain layer에서…
도메인지식
prodo
neo
ProdoService
NeoQueryService
패턴명
model
service
ProdoService
NeoCommandService
NeoStatsEvent
NeoCommandService
NeoStatsEvent
NeoQueryService
stein.park@kakao
Module,Component
응집도를 높이고 결합도를 줄이기 위한 원칙들
SRP = 단일책임원칙
OCP = 개방-폐쇄 원칙
LSP = 리스코프의 치환 원칙
ISP = 인터페이스 분리 원칙
DIP = 의존성 역전 원칙
모듈(+컴포넌트) = SOLID <응집도>
REP = 재사용/릴리스 등가 원칙
CCP = 공통 폐쇄 원칙
CRP = 공통 재사용 원칙
<결합도>
ADP = 의존성 비순환 원칙
하향식(top-down) 설계(불가원칙)
SDP = 안정된 의존성 원칙
SAP = 안정된 추상화 원칙
https://blog.cleancoder.com/uncle-bob/2020/10/18/Solid-Relevance.html
Design Principles and Design Patterns, Robert C. Martin, 2000
[ca][asd] [asd]
https://sungjk.github.io/2019/10/26/clean-architecture-1.html
[ca]
3부: 설계 원칙 4부: 컴포넌트 원칙
stein.park@kakao
SRP=단일책임원칙
하나의 모듈은 하나의 액터에 대해서만 책임진다 ~= 잘게 잘 쪼갠다
stein.park@kakao
SRP=단일책임원칙
하나의 모듈은 하나의 액터에 대해서만 책임진다 ~= 잘게 잘 쪼갠다
stein.park@kakao
SRP=단일책임원칙
하나의 모듈은 하나의 액터에 대해서만 책임진다 ~= 잘게 잘 쪼갠다
stein.park@kakao
SRP=단일책임원칙
하나의 모듈은 하나의 액터에 대해서만 책임진다 ~= 잘게 잘 쪼갠다
stein.park@kakao
OCP=개방-폐쇄원칙
A가 B를 확장하는 것은 열려있지만, 변경하는 것은 닫혀있다.
재무 데이터
재무 분석기
보고서용
재무 데이터
보고서를
웹에 표시
보고서를
프린터로 출력
PM 관점에서
[oosc, §3.3]
[oosc] https://web.uettaxila.edu.pk/CMS/AUT2011/seSCbs/tutorial/Object%20Oriented%20Software%20Construction.pdf
설명을 위해 화살표 방향을 바꿈
책에는 “데이터 흐름” 방향인데,
“의존성 방향”으로 바꿈
stein.park@kakao
OCP=개방-폐쇄원칙
A가 B를 확장하는 것은 열려있지만, 변경하는 것은 닫혀있다.
재무 데이터
재무 분석기
보고서용
재무 데이터
보고서를
웹에 표시
Open
Open
PM 관점에서
[oosc, §3.3]
[oosc] https://web.uettaxila.edu.pk/CMS/AUT2011/seSCbs/tutorial/Object%20Oriented%20Software%20Construction.pdf
설명을 위해 화살표 방향을 바꿈
책에는 “데이터 흐름” 방향인데,
“의존성 방향”으로 바꿈
stein.park@kakao
OCP=개방-폐쇄원칙
A가 B를 확장하는 것은 열려있지만, 변경하는 것은 닫혀있다.
재무 데이터
재무 분석기
보고서용
재무 데이터
보고서를
웹에 표시
Close
Close
PM 관점에서
[oosc, §3.3]
[oosc] https://web.uettaxila.edu.pk/CMS/AUT2011/seSCbs/tutorial/Object%20Oriented%20Software%20Construction.pdf
설명을 위해 화살표 방향을 바꿈
책에는 “데이터 흐름” 방향인데,
“의존성 방향”으로 바꿈
stein.park@kakao
OCP=개방-폐쇄원칙
A가 B를 확장하는 것은 열려있지만, 변경하는 것은 닫혀있다.
재무 데이터
재무 분석기
보고서용
재무 데이터
보고서를
웹에 표시
보고서를
프린터로 출력
Open
Close
Close
PM 관점에서
[oosc, §3.3]
[oosc] https://web.uettaxila.edu.pk/CMS/AUT2011/seSCbs/tutorial/Object%20Oriented%20Software%20Construction.pdf
설명을 위해 화살표 방향을 바꿈
책에는 “데이터 흐름” 방향인데,
“의존성 방향”으로 바꿈
stein.park@kakao
OCP=개방-폐쇄원칙
A가 B를 확장하는 것은 열려있지만, 변경하는 것은 닫혀있다.
재무 데이터
재무 분석기
보고서용
재무 데이터
보고서를
웹에 표시
보고서를
프린터로 출력
Open
Close
Reopen
PM 관점에서
[oosc, §3.3]
[oosc] https://web.uettaxila.edu.pk/CMS/AUT2011/seSCbs/tutorial/Object%20Oriented%20Software%20Construction.pdf
설명을 위해 화살표 방향을 바꿈
책에는 “데이터 흐름” 방향인데,
“의존성 방향”으로 바꿈
유형 별
enum
stein.park@kakao
OCP=개방-폐쇄원칙
A가 B를 확장하는 것은 열려있지만, 변경하는 것은 닫혀있다.
재무 데이터
재무 분석기
보고서용
재무 데이터
보고서를
웹에 표시
보고서를
프린터로 출력
Open
Close
Reopen
Reopen
PM 관점에서
[oosc, §3.3]
[oosc] https://web.uettaxila.edu.pk/CMS/AUT2011/seSCbs/tutorial/Object%20Oriented%20Software%20Construction.pdf
설명을 위해 화살표 방향을 바꿈
책에는 “데이터 흐름” 방향인데,
“의존성 방향”으로 바꿈
유형 별
enum
stein.park@kakao
OCP=개방-폐쇄원칙
A가 B를 확장하는 것은 열려있지만, 변경하는 것은 닫혀있다.
재무 데이터
재무 분석기
보고서용
재무 데이터
보고서를
웹에 표시
보고서를
프린터로 출력
Open
Close
Reopen
Reopen
Reopen
PM 관점에서
[oosc, §3.3]
[oosc] https://web.uettaxila.edu.pk/CMS/AUT2011/seSCbs/tutorial/Object%20Oriented%20Software%20Construction.pdf
설명을 위해 화살표 방향을 바꿈
책에는 “데이터 흐름” 방향인데,
“의존성 방향”으로 바꿈
유형 별
enum
stein.park@kakao
OCP=개방-폐쇄원칙
고수준이 Closed 될 수 있도록 저수준 -> 고수준으로 의존성을 역전
재무 데이터
재무 분석기
보고서용
재무 데이터
웹에 표시
프린터로
출력
stein.park@kakao
OCP=개방-폐쇄원칙
추이 종속성(transitive dependency)
stein.park@kakao
OCP=개방-폐쇄원칙
추이 종속성(transitive dependency)
stein.park@kakao
OCP=개방-폐쇄원칙
추이 종속성(transitive dependency)
stein.park@kakao
OCP=개방-폐쇄원칙
추이 종속성(transitive dependency)
Controller가 entities의 getter/setter를
이용해 뭔가 로직을 수행하면
entities가 수정될 때 controller도 체크해
봐야함.
stein.park@kakao
OCP=개방-폐쇄원칙
추이 종속성(transitive dependency)
Controller가 entities의 getter/setter를
이용해 뭔가 로직을 수행하면
entities가 수정될 때 controller도 체크해
봐야함.
stein.park@kakao
OCP=개방-폐쇄원칙
추이 종속성(transitive dependency)
Controller가 entities의 getter/setter를
이용해 뭔가 로직을 수행하면
entities가 수정될 때 controller도 체크해
봐야함.
stein.park@kakao
LSP=리스코프의치환원칙
A를 사용하는 P에서 A를 B로 치환해도 P의 행위가 변하지 않으면 B는 A의 하위타입이다.
Billing License
+ calcFee()
Personal
License
Business
License
- users
<I>
User Rectangle
+ setH, + setW
Square
+ setSide
stein.park@kakao
Square
+ setSide
OCP+LSP동시위반사례
Class User {
void DrawShape(Shape s) {
if (s instanceof Square)
…
else
…
}
}
User Rectangle
+ setH, + setW
Interface가 아닌 구현 클래스
를 알아야하므로 LSP 위반
Rectangle의 기능을 확장하는데 User가 변경
되는 문제가 발생했으므로 OCP 위반
[asp, p133]
stein.park@kakao
OCP+LSP동시위반사례
Class User {
void DrawShape(Shape s) {
if (s instanceof Square)
…
else
…
}
}
User Rectangle
+ setH, + setW
Interface가 아닌 구현 클래스
를 알아야하므로 LSP 위반
Rectangle의 기능을 확장하는데 User가 변경
되는 문제가 발생했으므로 OCP 위반
[asp, p133]
Open Open
stein.park@kakao
OCP+LSP동시위반사례
Class User {
void DrawShape(Shape s) {
if (s instanceof Square)
…
else
…
}
}
User Rectangle
+ setH, + setW
Interface가 아닌 구현 클래스
를 알아야하므로 LSP 위반
Rectangle의 기능을 확장하는데 User가 변경
되는 문제가 발생했으므로 OCP 위반
[asp, p133]
Close Close
stein.park@kakao
Square
+ setSide
OCP+LSP동시위반사례
Class User {
void DrawShape(Shape s) {
if (s instanceof Square)
…
else
…
}
}
User Rectangle
+ setH, + setW
Interface가 아닌 구현 클래스
를 알아야하므로 LSP 위반
Rectangle의 기능을 확장하는데 User가 변경
되는 문제가 발생했으므로 OCP 위반
[asp, p133]
Close Close
Open
stein.park@kakao
Square
+ setSide
OCP+LSP동시위반사례
Class User {
void DrawShape(Shape s) {
if (s instanceof Square)
…
else
…
}
}
User Rectangle
+ setH, + setW
Interface가 아닌 구현 클래스
를 알아야하므로 LSP 위반
Rectangle의 기능을 확장하는데 User가 변경
되는 문제가 발생했으므로 OCP 위반
[asp, p133]
Reopen
Close
Open
stein.park@kakao
ISP=인터페이스분리원칙
필요한 것에만 의존성을 갖기위해 인터페이스를 작게 유지한다.
stein.park@kakao
ISP=인터페이스분리원칙
필요한 것에만 의존성을 갖기위해 인터페이스를 작게 유지한다.
필요 이상으로 많은 것을 포함하는 모듈에
의존하는 것은 해로운 일
고려사항이 는다 = 에러가 는다
stein.park@kakao
DIP=의존성역전원칙
고수준 정책을 구현하는 코드는 저수준 세부사항 코드에 의존하면 안 된다. 대신 세부사항이 정책에 의존해야 한다.
a. 상위 수준의 모듈은 하위 수준의 모듈에 의존해서는 안된다. 둘 모두 추상화에 의존해야한다.
b. 추상화는 구체적인 사항에 의존해서는 안 된다. 구체적인 사항은 추상화에 의존해야 한다.
[asd]
DIP 예외
User가 Square 때문에
Open되는 문제 해결
의존성(dependency) 방향이 제어흐름
의 정반대 방향으로 역전(inversion)
(more…)
stein.park@kakao
Dependencyvsflowofcontrol
Dependency
소스 코드 의존성은 반드
시 안쪽으로, 고수준의
정책을 향해야 한다.
Flow of control
실행 순서
https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html
stein.park@kakao
응집도:REP,CCP,CRP
REP
Group
for reusers
CCP
Group for
maintenance
CRP
Split to avoid
unneeded
releases
재사용/릴리스(번호) 등가 원칙
공통 재사용 원칙
(= 컴포넌트의 ISP)
공통 폐쇄 원칙
(= 컴포넌트의 SRP)
stein.park@kakao
ADP:특징
main은 언제든지
배포가능
Test에 걸리적거리
지 않음 여기서부터 차례대
로 릴리즈하면 됨
stein.park@kakao
ADP:순환끊기
stein.park@kakao
ADP:순환끊기
stein.park@kakao
ADP:순환끊기
stein.park@kakao
ADP:순환끊기
stein.park@kakao
하향식(top-down)설계
모듈을 하나씩 만들어감
의존성이 쌓이면서 SRP/CCP로 컴포넌트 묶음
너무 커진 컴포넌트를 CRP로 분리
그 과정에 순환이 발생하면 ADP 적용
stein.park@kakao
변경 후
변경 전
결합도:SDP+SAP=DIP
Stable
U
UServer
US
Flexible
C
Stable
U
Flexible
C
[s]
stein.park@kakao
변경 후
변경 전
결합도:SDP+SAP=DIP
Stable
U
UServer
US
Flexible
C
Stable
U
Flexible
C
GW 서버
[s]
stein.park@kakao
변경 후
변경 전
결합도:SDP+SAP=DIP
Stable
U
UServer
US
Flexible
C
Stable
U
Flexible
C
[s]
slf4j
Logback
stein.park@kakao
결합도:SDP+SAP
https://uchanlee.dev/clean-architecture/book/ch14/
DB 스키마 (Bad)
String (Good)
I = Fan-out / (Fan-in + Fan-out)
A = #(추상+인터페이스) / #클래스
D’ = 주계열과의 거리의 normalize 값
slf4j
삭제 하다 남은
Repo interface
Logback
stein.park@kakao
정리하면…
• 응집도 & 결합도 개념과 inter-module vs intra-module complexity
• 응집도는 문제영역에서 찾기
• 컴포넌트는 모듈의 묶음이면서 배포단위
• Java의 패키지도 컴포넌트이고, Clean시스템도 컴포넌트
• S(잘게 쪼게고)O(Reopen 안되게하고)L(상속 제대로하고)I(인터페이스도 쪼게고)D(의
존성 역전으로 유연성 주고)
• 컴포넌트 응집도: REP 지키면서, CCP로 묶고, CRP로 나누기
• 컴포넌트 결합도: 순환은 끊고(ADP), 안정성(SDP)과 추상도(SAP)에 따라 의존성 관리

Weitere ähnliche Inhalte

Was ist angesagt?

Jbehave- Basics to Advance
Jbehave- Basics to AdvanceJbehave- Basics to Advance
Jbehave- Basics to AdvanceRavinder Singh
 
대용량 분산 아키텍쳐 설계 #2 대용량 분산 시스템 아키텍쳐 디자인 패턴
대용량 분산 아키텍쳐 설계 #2 대용량 분산 시스템 아키텍쳐 디자인 패턴대용량 분산 아키텍쳐 설계 #2 대용량 분산 시스템 아키텍쳐 디자인 패턴
대용량 분산 아키텍쳐 설계 #2 대용량 분산 시스템 아키텍쳐 디자인 패턴Terry Cho
 
Support de cours EJB 3 version complète Par Mr Youssfi, ENSET, Université Ha...
Support de cours EJB 3 version complète Par Mr  Youssfi, ENSET, Université Ha...Support de cours EJB 3 version complète Par Mr  Youssfi, ENSET, Université Ha...
Support de cours EJB 3 version complète Par Mr Youssfi, ENSET, Université Ha...ENSET, Université Hassan II Casablanca
 
소프트웨어 아키텍처 문서화
소프트웨어 아키텍처 문서화소프트웨어 아키텍처 문서화
소프트웨어 아키텍처 문서화영기 김
 
svn 능력자를 위한 git 개념 가이드
svn 능력자를 위한 git 개념 가이드svn 능력자를 위한 git 개념 가이드
svn 능력자를 위한 git 개념 가이드Insub Lee
 
Spring Boot + React + Gradle in VSCode
Spring Boot + React + Gradle in VSCodeSpring Boot + React + Gradle in VSCode
Spring Boot + React + Gradle in VSCodedpTablo
 
스프링캠프 2016 발표 - Deep dive into spring boot autoconfiguration
스프링캠프 2016 발표 - Deep dive into spring boot autoconfiguration스프링캠프 2016 발표 - Deep dive into spring boot autoconfiguration
스프링캠프 2016 발표 - Deep dive into spring boot autoconfiguration수홍 이
 
소프트웨어 아키텍처
소프트웨어 아키텍처소프트웨어 아키텍처
소프트웨어 아키텍처영기 김
 
Domain-Driven-Design 정복기 2탄
Domain-Driven-Design 정복기 2탄Domain-Driven-Design 정복기 2탄
Domain-Driven-Design 정복기 2탄Suhyeon Jo
 
Java EE vs Spring Framework
Java  EE vs Spring Framework Java  EE vs Spring Framework
Java EE vs Spring Framework Rohit Kelapure
 
Charla TestingUy 2019 - Cypress.io - Automatización al siguiente nivel
Charla TestingUy 2019 - Cypress.io - Automatización al siguiente nivelCharla TestingUy 2019 - Cypress.io - Automatización al siguiente nivel
Charla TestingUy 2019 - Cypress.io - Automatización al siguiente nivelTestingUy
 
1. 아키텍쳐 설계 프로세스
1. 아키텍쳐 설계 프로세스1. 아키텍쳐 설계 프로세스
1. 아키텍쳐 설계 프로세스Terry Cho
 
Hibernate tutorial for beginners
Hibernate tutorial for beginnersHibernate tutorial for beginners
Hibernate tutorial for beginnersRahul Jain
 
An Introduction to Bazel
An Introduction to BazelAn Introduction to Bazel
An Introduction to BazelMatt Turner
 
도메인 주도 설계 - 6장 도메인 객체의 생명주기
도메인 주도 설계 - 6장 도메인 객체의 생명주기도메인 주도 설계 - 6장 도메인 객체의 생명주기
도메인 주도 설계 - 6장 도메인 객체의 생명주기JangHyuk You
 
Java Spring framework, Dependency Injection, DI, IoC, Inversion of Control
Java Spring framework, Dependency Injection, DI, IoC, Inversion of ControlJava Spring framework, Dependency Injection, DI, IoC, Inversion of Control
Java Spring framework, Dependency Injection, DI, IoC, Inversion of ControlArjun Thakur
 
자바 서버 애플리케이션 아키텍처 안티 패턴
자바 서버 애플리케이션 아키텍처 안티 패턴자바 서버 애플리케이션 아키텍처 안티 패턴
자바 서버 애플리케이션 아키텍처 안티 패턴Sungchul Park
 

Was ist angesagt? (20)

Jbehave- Basics to Advance
Jbehave- Basics to AdvanceJbehave- Basics to Advance
Jbehave- Basics to Advance
 
대용량 분산 아키텍쳐 설계 #2 대용량 분산 시스템 아키텍쳐 디자인 패턴
대용량 분산 아키텍쳐 설계 #2 대용량 분산 시스템 아키텍쳐 디자인 패턴대용량 분산 아키텍쳐 설계 #2 대용량 분산 시스템 아키텍쳐 디자인 패턴
대용량 분산 아키텍쳐 설계 #2 대용량 분산 시스템 아키텍쳐 디자인 패턴
 
Support de cours EJB 3 version complète Par Mr Youssfi, ENSET, Université Ha...
Support de cours EJB 3 version complète Par Mr  Youssfi, ENSET, Université Ha...Support de cours EJB 3 version complète Par Mr  Youssfi, ENSET, Université Ha...
Support de cours EJB 3 version complète Par Mr Youssfi, ENSET, Université Ha...
 
소프트웨어 아키텍처 문서화
소프트웨어 아키텍처 문서화소프트웨어 아키텍처 문서화
소프트웨어 아키텍처 문서화
 
Maven
MavenMaven
Maven
 
svn 능력자를 위한 git 개념 가이드
svn 능력자를 위한 git 개념 가이드svn 능력자를 위한 git 개념 가이드
svn 능력자를 위한 git 개념 가이드
 
Spring Boot + React + Gradle in VSCode
Spring Boot + React + Gradle in VSCodeSpring Boot + React + Gradle in VSCode
Spring Boot + React + Gradle in VSCode
 
스프링캠프 2016 발표 - Deep dive into spring boot autoconfiguration
스프링캠프 2016 발표 - Deep dive into spring boot autoconfiguration스프링캠프 2016 발표 - Deep dive into spring boot autoconfiguration
스프링캠프 2016 발표 - Deep dive into spring boot autoconfiguration
 
소프트웨어 아키텍처
소프트웨어 아키텍처소프트웨어 아키텍처
소프트웨어 아키텍처
 
Domain-Driven-Design 정복기 2탄
Domain-Driven-Design 정복기 2탄Domain-Driven-Design 정복기 2탄
Domain-Driven-Design 정복기 2탄
 
Java EE vs Spring Framework
Java  EE vs Spring Framework Java  EE vs Spring Framework
Java EE vs Spring Framework
 
Jsf presentation
Jsf presentationJsf presentation
Jsf presentation
 
Charla TestingUy 2019 - Cypress.io - Automatización al siguiente nivel
Charla TestingUy 2019 - Cypress.io - Automatización al siguiente nivelCharla TestingUy 2019 - Cypress.io - Automatización al siguiente nivel
Charla TestingUy 2019 - Cypress.io - Automatización al siguiente nivel
 
1. 아키텍쳐 설계 프로세스
1. 아키텍쳐 설계 프로세스1. 아키텍쳐 설계 프로세스
1. 아키텍쳐 설계 프로세스
 
Hibernate tutorial for beginners
Hibernate tutorial for beginnersHibernate tutorial for beginners
Hibernate tutorial for beginners
 
An Introduction to Bazel
An Introduction to BazelAn Introduction to Bazel
An Introduction to Bazel
 
도메인 주도 설계 - 6장 도메인 객체의 생명주기
도메인 주도 설계 - 6장 도메인 객체의 생명주기도메인 주도 설계 - 6장 도메인 객체의 생명주기
도메인 주도 설계 - 6장 도메인 객체의 생명주기
 
Java Spring framework, Dependency Injection, DI, IoC, Inversion of Control
Java Spring framework, Dependency Injection, DI, IoC, Inversion of ControlJava Spring framework, Dependency Injection, DI, IoC, Inversion of Control
Java Spring framework, Dependency Injection, DI, IoC, Inversion of Control
 
자바 서버 애플리케이션 아키텍처 안티 패턴
자바 서버 애플리케이션 아키텍처 안티 패턴자바 서버 애플리케이션 아키텍처 안티 패턴
자바 서버 애플리케이션 아키텍처 안티 패턴
 
Jsf
JsfJsf
Jsf
 

Ähnlich wie 클린아키텍처와 DDD - day1

자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)
자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)
자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)DK Lee
 
Kubernetes on GCP
Kubernetes on GCPKubernetes on GCP
Kubernetes on GCPDaegeun Kim
 
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거Javajigi Jaesung
 
10만 라인, 26280시간의 이야기
10만 라인, 26280시간의 이야기10만 라인, 26280시간의 이야기
10만 라인, 26280시간의 이야기Minyoung Jeong
 
[Dev rookie]designpattern
[Dev rookie]designpattern[Dev rookie]designpattern
[Dev rookie]designpattern대영 노
 
MariaDB 마이그레이션 - 네오클로바
MariaDB 마이그레이션 - 네오클로바MariaDB 마이그레이션 - 네오클로바
MariaDB 마이그레이션 - 네오클로바NeoClova
 
엔터프라이즈 클라우드 마이그레이션 준비와 실행. 그리고, 클라우드 운영 모범 사례 공유-최지웅, 오픈소스컨설팅 CTO / 장진환, 스마일샤...
엔터프라이즈 클라우드 마이그레이션 준비와 실행. 그리고, 클라우드 운영 모범 사례 공유-최지웅, 오픈소스컨설팅 CTO / 장진환, 스마일샤...엔터프라이즈 클라우드 마이그레이션 준비와 실행. 그리고, 클라우드 운영 모범 사례 공유-최지웅, 오픈소스컨설팅 CTO / 장진환, 스마일샤...
엔터프라이즈 클라우드 마이그레이션 준비와 실행. 그리고, 클라우드 운영 모범 사례 공유-최지웅, 오픈소스컨설팅 CTO / 장진환, 스마일샤...Amazon Web Services Korea
 
Event Storming and Implementation Workshop
Event Storming and Implementation WorkshopEvent Storming and Implementation Workshop
Event Storming and Implementation WorkshopuEngine Solutions
 
SK Telecom - 망관리 프로젝트 TANGO의 오픈소스 데이터베이스 전환 여정 - 발표자 : 박승전, Project Manager, ...
SK Telecom - 망관리 프로젝트 TANGO의 오픈소스 데이터베이스 전환 여정 - 발표자 : 박승전, Project Manager, ...SK Telecom - 망관리 프로젝트 TANGO의 오픈소스 데이터베이스 전환 여정 - 발표자 : 박승전, Project Manager, ...
SK Telecom - 망관리 프로젝트 TANGO의 오픈소스 데이터베이스 전환 여정 - 발표자 : 박승전, Project Manager, ...Amazon Web Services Korea
 
Alluxio: Data Orchestration on Multi-Cloud
Alluxio: Data Orchestration on Multi-CloudAlluxio: Data Orchestration on Multi-Cloud
Alluxio: Data Orchestration on Multi-CloudJinwook Chung
 
Sql 중심 코드 탈피 발표자료
Sql 중심 코드 탈피 발표자료Sql 중심 코드 탈피 발표자료
Sql 중심 코드 탈피 발표자료ssuser776e2d
 
[KR] Building modern data pipeline with Snowflake + DBT + Airflow.pdf
[KR] Building modern data pipeline with Snowflake + DBT + Airflow.pdf[KR] Building modern data pipeline with Snowflake + DBT + Airflow.pdf
[KR] Building modern data pipeline with Snowflake + DBT + Airflow.pdfChris Hoyean Song
 
[2015 07-06-윤석준] Oracle 성능 최적화 및 품질 고도화 4
[2015 07-06-윤석준] Oracle 성능 최적화 및 품질 고도화 4[2015 07-06-윤석준] Oracle 성능 최적화 및 품질 고도화 4
[2015 07-06-윤석준] Oracle 성능 최적화 및 품질 고도화 4Seok-joon Yun
 
넥슨 글로벌 플랫폼 구축 이야기 : DB Migration case study (임현수 플랫폼인프라실 Technical Manager, 넥...
넥슨 글로벌 플랫폼 구축 이야기 : DB Migration case study (임현수 플랫폼인프라실 Technical Manager, 넥...넥슨 글로벌 플랫폼 구축 이야기 : DB Migration case study (임현수 플랫폼인프라실 Technical Manager, 넥...
넥슨 글로벌 플랫폼 구축 이야기 : DB Migration case study (임현수 플랫폼인프라실 Technical Manager, 넥...Amazon Web Services Korea
 
C++ 코딩의 정석.pptx
C++ 코딩의 정석.pptxC++ 코딩의 정석.pptx
C++ 코딩의 정석.pptxsung suk seo
 
The Cucumber for Java
The Cucumber for JavaThe Cucumber for Java
The Cucumber for JavaJonghwa Lee
 
Devon 2011-b-5 효과적인 레거시 코드 다루기
Devon 2011-b-5 효과적인 레거시 코드 다루기Devon 2011-b-5 효과적인 레거시 코드 다루기
Devon 2011-b-5 효과적인 레거시 코드 다루기Daum DNA
 
Sql 중심 코드 탈피
Sql 중심 코드 탈피Sql 중심 코드 탈피
Sql 중심 코드 탈피ssuser776e2d
 
DMS와 SCT를 활용한 Oracle에서 Open Source DB로의 전환
DMS와 SCT를 활용한 Oracle에서 Open Source DB로의 전환DMS와 SCT를 활용한 Oracle에서 Open Source DB로의 전환
DMS와 SCT를 활용한 Oracle에서 Open Source DB로의 전환Amazon Web Services Korea
 

Ähnlich wie 클린아키텍처와 DDD - day1 (20)

자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)
자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)
자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)
 
Kubernetes on GCP
Kubernetes on GCPKubernetes on GCP
Kubernetes on GCP
 
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
 
10만 라인, 26280시간의 이야기
10만 라인, 26280시간의 이야기10만 라인, 26280시간의 이야기
10만 라인, 26280시간의 이야기
 
[Dev rookie]designpattern
[Dev rookie]designpattern[Dev rookie]designpattern
[Dev rookie]designpattern
 
MariaDB 마이그레이션 - 네오클로바
MariaDB 마이그레이션 - 네오클로바MariaDB 마이그레이션 - 네오클로바
MariaDB 마이그레이션 - 네오클로바
 
엔터프라이즈 클라우드 마이그레이션 준비와 실행. 그리고, 클라우드 운영 모범 사례 공유-최지웅, 오픈소스컨설팅 CTO / 장진환, 스마일샤...
엔터프라이즈 클라우드 마이그레이션 준비와 실행. 그리고, 클라우드 운영 모범 사례 공유-최지웅, 오픈소스컨설팅 CTO / 장진환, 스마일샤...엔터프라이즈 클라우드 마이그레이션 준비와 실행. 그리고, 클라우드 운영 모범 사례 공유-최지웅, 오픈소스컨설팅 CTO / 장진환, 스마일샤...
엔터프라이즈 클라우드 마이그레이션 준비와 실행. 그리고, 클라우드 운영 모범 사례 공유-최지웅, 오픈소스컨설팅 CTO / 장진환, 스마일샤...
 
Event Storming and Implementation Workshop
Event Storming and Implementation WorkshopEvent Storming and Implementation Workshop
Event Storming and Implementation Workshop
 
dbt 101
dbt 101dbt 101
dbt 101
 
SK Telecom - 망관리 프로젝트 TANGO의 오픈소스 데이터베이스 전환 여정 - 발표자 : 박승전, Project Manager, ...
SK Telecom - 망관리 프로젝트 TANGO의 오픈소스 데이터베이스 전환 여정 - 발표자 : 박승전, Project Manager, ...SK Telecom - 망관리 프로젝트 TANGO의 오픈소스 데이터베이스 전환 여정 - 발표자 : 박승전, Project Manager, ...
SK Telecom - 망관리 프로젝트 TANGO의 오픈소스 데이터베이스 전환 여정 - 발표자 : 박승전, Project Manager, ...
 
Alluxio: Data Orchestration on Multi-Cloud
Alluxio: Data Orchestration on Multi-CloudAlluxio: Data Orchestration on Multi-Cloud
Alluxio: Data Orchestration on Multi-Cloud
 
Sql 중심 코드 탈피 발표자료
Sql 중심 코드 탈피 발표자료Sql 중심 코드 탈피 발표자료
Sql 중심 코드 탈피 발표자료
 
[KR] Building modern data pipeline with Snowflake + DBT + Airflow.pdf
[KR] Building modern data pipeline with Snowflake + DBT + Airflow.pdf[KR] Building modern data pipeline with Snowflake + DBT + Airflow.pdf
[KR] Building modern data pipeline with Snowflake + DBT + Airflow.pdf
 
[2015 07-06-윤석준] Oracle 성능 최적화 및 품질 고도화 4
[2015 07-06-윤석준] Oracle 성능 최적화 및 품질 고도화 4[2015 07-06-윤석준] Oracle 성능 최적화 및 품질 고도화 4
[2015 07-06-윤석준] Oracle 성능 최적화 및 품질 고도화 4
 
넥슨 글로벌 플랫폼 구축 이야기 : DB Migration case study (임현수 플랫폼인프라실 Technical Manager, 넥...
넥슨 글로벌 플랫폼 구축 이야기 : DB Migration case study (임현수 플랫폼인프라실 Technical Manager, 넥...넥슨 글로벌 플랫폼 구축 이야기 : DB Migration case study (임현수 플랫폼인프라실 Technical Manager, 넥...
넥슨 글로벌 플랫폼 구축 이야기 : DB Migration case study (임현수 플랫폼인프라실 Technical Manager, 넥...
 
C++ 코딩의 정석.pptx
C++ 코딩의 정석.pptxC++ 코딩의 정석.pptx
C++ 코딩의 정석.pptx
 
The Cucumber for Java
The Cucumber for JavaThe Cucumber for Java
The Cucumber for Java
 
Devon 2011-b-5 효과적인 레거시 코드 다루기
Devon 2011-b-5 효과적인 레거시 코드 다루기Devon 2011-b-5 효과적인 레거시 코드 다루기
Devon 2011-b-5 효과적인 레거시 코드 다루기
 
Sql 중심 코드 탈피
Sql 중심 코드 탈피Sql 중심 코드 탈피
Sql 중심 코드 탈피
 
DMS와 SCT를 활용한 Oracle에서 Open Source DB로의 전환
DMS와 SCT를 활용한 Oracle에서 Open Source DB로의 전환DMS와 SCT를 활용한 Oracle에서 Open Source DB로의 전환
DMS와 SCT를 활용한 Oracle에서 Open Source DB로의 전환
 

클린아키텍처와 DDD - day1