Open kihyuk-sung opened 2 years ago
컴포넌트를 변경하는 이유는 오직 하나뿐이어야 한다.
코드상의 어떤 의존성이든 그 방향을 바꿀 수 있다.
buckpal
|----account
|------in
| |----web
| |----------AccountController
|------out
| |----persistence
| |-----------AccountPersistenceAdapter
| |-----------SpringDataAccountRepository
|
|------domain
| |----Account
| |----Activity
|
|------application
|----SendMoneyService
|
|----port
|----in
| |----SendMoneyUseCase
|
|----out
|----LoadAccountPort
|----LoadAccountPort
계층형 아키텍처의 토대는 데이터베이스인데, 웹 계층 -> 도메인 계층 -> 영속성 계층에 의존하면서 데이터베이스에 의존하게 된다.
비즈니스는 상태가 아니라 행동을 중심으로 모델링 하지만, 아키텍처는 도메인 로직이 아닌 데이터베이스를 토대로 설계하게 된다. 이는 ORM 사용 시 특히 두드러진다. 특히 영속성 계층과 도메인 계층의 결합이 발생하게 된다.
헬퍼, 유틸리티, 레포지토리 컴포넌트들을 영속성 계층으로 모두 끌어내릴 가능성이 커진다.
레거시에 새로운 기능을 추가할 때 어디에 추가할 지 몰라서 가장 편한 곳에 추가하게 된다. 그러면 유스케이스를 찾기가 어려워진다. 즉, 서비스 클래스가 엄청 비대해질 수 있다.
서로 다른 기능을 동시에 작업하기 어렵다. 예를 들어, 사용자 서비스를 만들기 위해서 한 명이 엔티티와 레파지토리 등 틀을 어느정도 잡아주면 그에 종속되어서 개발할 수 밖에 없다. 이때 맨먼스는 당연히 의미가 없어진다.
계층형 아키텍처도 올바르게 구축하면 쓸만하다.
컴포넌트를 변경하는 이유는 오직 하나뿐이어야 한다.
'책임'은 '변경할 이유'에 대응된다. 하나의 변경사항에 대해서 적용할 때 하나의 컴포넌트만 변경하면 되도록 잘 쪼개어서 설계해야한다.
코드상의 어떤 의존성이든 그 방향을 바꿀 수(역전시킬 수) 있다.
도메인 계층이 영속성이나 UI같은 외부 계층과 철저하게 분리돼야 하므로 애플리케이션의 엔티티에 대한 모델을 각 계층에서 유지보수해야 한다. 가령 ORM을 사용할 때, 영속성 계층의 엔티티가 도메인 계층에도 별도로 존재해야 한다.
포트와 어댑터 아키텍처
... ... ... Q1. 컴포넌트를 변경할 이유가 하나라면 다른 컴포넌트를 수정한다고 영향이 가지 않는다는 그런 이야기의 번역체
Q3. WritingEntity CommentingEntity
domain ExampleEntity WritingEntity
persistence @Entity ExampleEntity
domain CommentingEntity
웹 > 도메인 > 영속성
출처: https://reflectoring.io/spring-hexagonal/
~ 32p 까지