클린 아키텍처

코딩하는스님·2022년 5월 19일
0

21. 소리치는 아키텍처

아키텍처의 테마

소프트웨어 아키텍처는 시스템의 유스케이스를 지원하는 구조
아키텍처는 프레임워크로부터 제공받는 것이 아니라 유스케이스 중심으로 만들어져야 한다.
nestjs/nextjs/react/spring ...

아키텍처의 목적

아키텍처의 목적은 유스케이스를 지원하는 것이지, 어떤 도구를 사용하는 것이 아니다.

웹은?

웹으로 전달되는 시스템은 웹이 전달 매개체일 뿐 그이상 그이하도 아니다.

프레임워크는 도구일 뿐, 삶의 방식은 아니다

프레임워크가 아키텍처의 중심을 차지하는 일을 막을 수 있는 전략을 세워야 한다.

테스트하기 쉬운 아키텍처

아키텍처가 유스케이스를 최우선으로 한다면, 유스케이스 전부에 대해 단위 테스트를 할 수 있어야 한다.
테스트를 위해 테스트 환경이 필요한 상황이 되어서는 안된다.

모델처럼 보이는 것을 확인했습니다. 뷰와 컨트롤러는 어디에 있죠?
그건 알 필요 없습니다.

22. 클린 아키텍처

프레임워크 독립성
테스트 용이성
UI 독립성
데이터베이스 독립성
모든 외부 에이전시에 대한 독립성

router
controller
service
repository
entity

의존성 규칙

소스코드의 의존성은 반드시 안쪽으로, 고수준의 정책을 향해야 한다.

엔티티

핵심 업무 규칙의 캡슐화

유스케이스

어플리케이션에 특화된 업무 규칙을 포함
엔티티로 들어오고 나가는 데이터 흐름을 캡슐화 및 구현

인터페이스 어댑터

데이터를 유스케이스와 엔티티에게 가장 편리한 방식에서 데이터베이스나 웹 같은 외부 에이전시에게 가장 편리한 방식으로 변환

프레임워크와 드라이버

안쪽 코드와 통신하기 위한 접합 코드 외에는 코드가 많지 않다.

원의 개수?

원의 개수는 상관없으나 안쪽으로 향해야 한다는 것은 불변

경계 횡단

바깥쪽을 호출해야 하는 경우에는 안쪽의 인터페이스를 호출하는 방식으로 구현하고, 바깥쪽에서 안쪽의 인터페이스를 구현하는 방식으로 의존성을 유지한다.

경계를 횡단하는 데이터

경계를 가로질러 데이터를 전달할 때, 데이터는 항상 내부의 우너에서 사용하기에 가장 편리한 형태를 가져야 한다.

시나리오

23. 프레젠터와 험블 객체

험블 객체 패턴

행위들을 두 개의 모듈 또는 클래스로 나눈다.
테스트하기 어려운 것들은 험블 객체, 나머지는 다른 객체에 옮긴다.

프레젠터와 뷰

뷰는 테스트하기 어렵다.
뷰는 데이터를 GUI로 이동시키고, 데이터를 직접 처리하지는 않음
프레젠터는 테스트하기 쉽다. 프레젠터는 어플리케이션으로부터 데이터를 받아 화면에 표현할 수 있는 포맷으로 만든다.
뷰는 뷰모델에서 표시할 값을 찾고, 프레젠터는 뷰모델에 데이터를 가공해서 넣는다.
모든 제어요소는 프레젠터와 뷰모델에서 이루어지므로 뷰는 Humble하다.

테스트와 아키텍처

테스트하기 쉬운 부분, 어려운 부분으로 아키텍처의 경계가 나뉜다.
뷰와 프레젠터가 이와 같은 경계에 해당한다.

데이터베이스 게이트웨이

유스케이스 인터랙터와 데이터베이스 사이에 데이터베이스 게이트웨이가 있다.
유스케이스 계층은 게이트웨이 인터페이스를 호출한다.
게이트웨이 인터페이스의 구현은 데이터베이스 계층에 위치하고, 구현체는 험블 객체이다.
인터랙터는 게이트웨이를 스텁이나 테스트 더블로 교체하여 테스트할 수 있다.

데이터 매퍼

ORM은 사실 존재하지 않는다.
데이터의 필드들은 모두 private로 선언되고 public 메서드만 볼 수 있다.
데이터 구조는 public 데이터 변수의 집합이다.

서비스 리스너

서비스 리스너는 서비스 인터페이스로부터 데이터를 수신하고 데이터를 어플리케이션에서 사용할 수 있게 간단한 데이터 구조로 포맷을 변경한다.

24. 부분적 경계

경계를 만드는 것은 비용이 많이 든다.
Boundary interface, 데이터 구조 (DTO), 배포 가능한 컴포넌트로 분리 및 의존성 관리
You aren't going to need it
부분적 경계를 고려할 수 있다.

마지막 단계를 건너뛰기

부분적 경계를 만드는 방법은 독립적으로 배포할 수 있는 컴포넌트를 만들고 경계를 관리하기 위한 인터페이스, DTO까지 전부 만든 다음에 컴포넌트만 분리하지 않고 만드는 것이다.

일차원 경계

Strategy pattern

퍼사드

Facade pattern

profile
👨🏻‍💻👨🏽‍🦲

0개의 댓글