도서/만들면서 배우는 클린 아키텍처

5~6장

joje* 2024. 2. 7. 00:03
  • 어플리케이션
    : 특정 기능이나 작업을 수행하기 위해 설계된 소프트웨어 프로그램

시스템 아키텍처에서 어플리케이션은 다음과 같은 관점에서 고려되어야 한다.

1. 기능성
 : 어플리케이션은 특정 기능이나 작업을 수행하기 위해 설계되며, 사용자나 다른 시스템과의 인터페이스를 통해 이런 기능들을 제공할 수 있어야 한다. 

2. 모듈성
 : 복잡한 시스템에서는 여러 어플리케이션들이 모듈화되어 각각의 기능이나 서비스를 독립적으로 제공할 수 있어야 한다.

3. 상호작용
 : 시스템 내의 다른 어플리케이션 또는 컴포넌트와 상호 작용하여 데이터를 교환하거나 서비스를 제공할 수 있어야 한다.

4. 성능 및 확장성
 : 아키텍처는 어플리케이션의 효율성, 확장성, 안정성을 고려해 설계되어야 한다.

 

 

: 클린 아키텍처에서 어플리케이션이란 시스템의 핵심 비즈니스 로직과 규칙을 담당하는 주요 부분을 의미한다. 즉, 사용자의 요청을 처리하고 데이터를 가공하며 비즈니스 로직을 실행하는 역할을 수행하는 주요 컴포넌트 모듈을 의미한다.

 

  • 클린 아키텍처 패키지 구조
adapter 
	- in : 컨트롤러(application을 호출을 주도하는 어댑터)
	- out : persistence(데이터베이스와 가장 가까운 계층, 
    		application에 의해 호출이 주도되는 계층)

application(비즈니스 로직 계층-서비스 계층)
	- 비즈니스 로직 구현체 
	- port 
		- in : 비즈니스 구현체 클래스를 호출하는 인터페이스
		- out : persitence adapter를 호출하는 인터페이스 

domain

 

  • 클린 아키텍처 핵심 규칙
    : 도메인 코드가 바깥으로 향하는 어떤 의존성도 없어야 한다.
    : 의존성 역전 원칙의 도움으로 모든 의존성이 도메인 코드를 향하고 있어야 한다.

 

  •  도메인 주도 설계란
    : 소프트웨어 시스템을 구축할 때, 도메인 모델과 비즈니스 로직에 중점을 둔 설계방법

도메인이란
: 소프트웨어로 해결해야 할 문제의 영역
=> 소프트웨어는 도메인에 관련된 문제를 해결해야 하는 능력에 존재 가치가 있다.

 

: 잘 설계된 도메인 모델은 속성 뿐 아니라 비즈니스 행위를 가지고 있다.이러한 도메인 객체들은 서비스의 책임을 분산시켜 서비스 클래스의 책임을 줄이고 결과적으로 코드양을 줄이고 재사용성을 높여준다.

: 기존 계층형 아키텍처는 도메인 레이어가 인프라 레이어(서비스 레이어)에 의존하고 있다. 이는 고수준 모듈(도메인 레이어)이 저수준 모듈(서비스 레이어)에 의존하고 있는 형태이다. 

: 저수준 모듈이 고수준 모듈에 의존하도록 만들기 위해 기존의 레이어드 아키텍처에 DIP(의존성 역전 원칙)를 적용한다.즉 서비스 레이어를 구현체와 인터페이스로 분리해 고수준 모듈이 인터페이스에 의존하는 형태로 만들어준다.

: 하지만 이러한 구조체도 단방향 계층구조라는 점에서 다양한 인터페이스를 지원하기 힘들다는 한계점을 지니고 이를 극복하기 위해 다방면으로 열려있는 헥사고날 아키텍처와 클린 아키텍처가 등장하게 된다. 

: 헥사고날 아키텍처와 클린 아키텍처에서는 스프링 DI 기능을 이용해 bean 객체의 관리 권한을 스프링에게 위임하여 코드의  재사용성, 유연성, 테스트 용이성을 높일 수 있도록 한다. 

 

5장- 웹 어댑터 구현하기

  • 웹 어댑터의 책임범위

1. HTTP 요청을 자바 객체로 매핑
2. 권한 검사
3. 입력 유효성 검증
4. 입력을 유스케이스의 입력 모델로 매핑
5. 유스케이스의 호출
6. 유스케이스의 출력을 HTTP로 매핑
7. HTTP 응답을 반환

 

  • 컨트롤러 나누기
컨트롤러는 각 패키지 별로(기능별로) 각각의 개별 컨트롤러를 만들어 쪼개는 방식이 추후 관리가 유지보수 관리가 용이하다.

 

 

6장- 영속성 어댑터 구현하기

  • 영속성 어댑터의 책임

1. 입력을 받는다.
2. 입력을 데이터베이스 포맷으로 매핑한다.
3. 입력을 데이터베이스로 보낸다.
4. 데이터베이스 출력을 애플리케이션 포맷으로 매핑한다.
5. 출력을 반환한다.

 

  • 포트 인터페이스와 영속성 어댑터 나누기

포트 인터페이스는 자신이 필요로 하는 메서드만 알면 되도록 넓은 인터페이스를 특화된 인터페이스로 분리해야 한다.

영속성 어댑터는 도메인을 기준으로 나눈다.

 

  • 데이터베이스의 트랜잭션은 어떻게 해야할까?
트랜잭션은 하나의 특정한 유스케이스에 대해 일어나는 모든 쓰기 작업에 걸쳐 있어야 한다.

'도서 > 만들면서 배우는 클린 아키텍처' 카테고리의 다른 글

1~2장  (2) 2023.11.26