BackendSquid / buckpal

만들면서 배우는 클린 아키텍처 - 코틀린
2 stars 0 forks source link

1장 2장 3장 #1

Open kihyuk-sung opened 2 years ago

kihyuk-sung commented 2 years ago

~ 32p 까지

kihyuk-sung commented 2 years ago

01. 계층형 아키텍처의 문제는 무엇일까?

문제점의 이유

  1. 의존성의 방향에 따라 데이터베이스 주도 설계를 유도한다.
  2. 제약이 적어 지름길을 택하기 쉬워진다.
  3. 지름길을 택하다보면 테스트하기 어려워진다.
  4. 도메인 서비스의 너비에 대한 규칙을 강제하지 않아 유스케이스를 숨긴다.
  5. 동시 작업이 어려워진다.
    • 데이터베이스 주도 설계를 한다면 레이어 별로 작업하기 어렵다.
    • 코드에 넓은 서비스가 있다면 서로 다른 기능을 동시에 작업하기 어렵다.

02. 의존성 역전하기

단일 책임 원칙

컴포넌트를 변경하는 이유는 오직 하나뿐이어야 한다.

의존성 역전 원칙

코드상의 어떤 의존성이든 그 방향을 바꿀 수 있다.

클린 아키텍처

결론

03. 코드 구성하기

  1. 계층으로 구성하기
  2. 기능으로 구성하기
  3. 육각형 아키텍처에서 사용하는 요소들을 이용한 패키지 구성
    buckpal
    |----account
       |------in
       |          |----web
       |                   |----------AccountController
       |------out
       |          |----persistence
       |                   |-----------AccountPersistenceAdapter
       |                   |-----------SpringDataAccountRepository
       |
       |------domain
       |         |----Account
       |         |----Activity
       |
       |------application
                 |----SendMoneyService
                 |
                 |----port
                        |----in
                        |       |----SendMoneyUseCase
                        |
                        |----out
                                |----LoadAccountPort
                                |----LoadAccountPort

의존성 주입의 역할

polynomeer commented 2 years ago

계층형 아키텍처의 문제는 무엇일까?

계층형 아키텍처는 데이터베이스 주도 설계를 유도한다

계층형 아키텍처의 토대는 데이터베이스인데, 웹 계층 -> 도메인 계층 -> 영속성 계층에 의존하면서 데이터베이스에 의존하게 된다.

비즈니스는 상태가 아니라 행동을 중심으로 모델링 하지만, 아키텍처는 도메인 로직이 아닌 데이터베이스를 토대로 설계하게 된다. 이는 ORM 사용 시 특히 두드러진다. 특히 영속성 계층과 도메인 계층의 결합이 발생하게 된다.

지름길을 택하기 쉬워진다

헬퍼, 유틸리티, 레포지토리 컴포넌트들을 영속성 계층으로 모두 끌어내릴 가능성이 커진다.

테스트하기 어려워진다

유스케이스를 숨긴다

레거시에 새로운 기능을 추가할 때 어디에 추가할 지 몰라서 가장 편한 곳에 추가하게 된다. 그러면 유스케이스를 찾기가 어려워진다. 즉, 서비스 클래스가 엄청 비대해질 수 있다.

동시 작업이 어려워진다

서로 다른 기능을 동시에 작업하기 어렵다. 예를 들어, 사용자 서비스를 만들기 위해서 한 명이 엔티티와 레파지토리 등 틀을 어느정도 잡아주면 그에 종속되어서 개발할 수 밖에 없다. 이때 맨먼스는 당연히 의미가 없어진다.

유지보수 가능한 소프트웨어를 만드는 데 어떻게 도움이 될까?

계층형 아키텍처도 올바르게 구축하면 쓸만하다.


의존성 역전하기

단일 책임 원칙

컴포넌트를 변경하는 이유는 오직 하나뿐이어야 한다.

'책임'은 '변경할 이유'에 대응된다. 하나의 변경사항에 대해서 적용할 때 하나의 컴포넌트만 변경하면 되도록 잘 쪼개어서 설계해야한다.

의존성 역전 원칙

코드상의 어떤 의존성이든 그 방향을 바꿀 수(역전시킬 수) 있다.

클린 아키텍처

도메인 계층이 영속성이나 UI같은 외부 계층과 철저하게 분리돼야 하므로 애플리케이션의 엔티티에 대한 모델을 각 계층에서 유지보수해야 한다. 가령 ORM을 사용할 때, 영속성 계층의 엔티티가 도메인 계층에도 별도로 존재해야 한다.

헥사고날 아키텍처

포트와 어댑터 아키텍처

jihye-woo commented 2 years ago

계층형 아키텍처의 한계

1. 도메인이 아닌 데이터베이스 모델을 기반으로 코드를 작성하게 됨

의존성 역전하기

1. 단일 책임 원칙

3. 클린 아키텍처

image

4. 헥사고날(육각형) 아키텍처

_코드 구성하기

계층으로 구성하기

의존성 주입의 역할

kyupid commented 2 years ago

01. 계층형 아키텍쳐의 문제점은 무엇일까?

계층형 아키텍쳐는 데이터베이스 주도 설계를 유도한다.

지름길을 택하기 쉬워진다.

테스트하기 어려워진다.

유스케이스를 숨긴다

동시 작업이 어려워진다

유지보수 가능한 소프트웨러를 만드는 데 어떻게 도움이 될까?

02. 의존성 역전하기

단일 책임 원칙

Q1. 이해 안가는점

부수효과에 관한 이야기

의존성 역전 원칙

클린 아키텍쳐

유지보수 가능한 소프트웨러를 만드는 데 어떻게 도움이 될까?

03. 코드 구성하기

계층으로 구성하기

기능으로 구성하기

... ... ... Q1. 컴포넌트를 변경할 이유가 하나라면 다른 컴포넌트를 수정한다고 영향이 가지 않는다는 그런 이야기의 번역체

Q3. WritingEntity CommentingEntity

domain ExampleEntity WritingEntity

persistence @Entity ExampleEntity


domain CommentingEntity

janeljs commented 2 years ago

01 계층형 아키텍처의 문제

계층형 아키텍처

웹 > 도메인 > 영속성

계층형 아키텍처는 데이터베이스 설계를 유도한다.

지름길을 택하기 쉬워진다.

테스트하기 어려워진다.

유스케이스를 숨긴다.

동시 작업이 어려워진다.

02 의존성 역전하기

단일 책임 원칙

의존성 역전 원칙

클린 아키텍처

헥사고날 아키텍처

image 출처: https://reflectoring.io/spring-hexagonal/

03 코드 구성하기

패키지 구조

의존성 주입의 역할