Clean Architecture(DDD?)

2024. 9. 17. 01:17머리속에 궁금했던 것들

친한 동생들과 얘기하던 중 면접 중에 Clean Architecture에 대해서 물어봤다고해서 띠용 이게 뭐지? 라는 생각이 들어서 찾아봤다.
 
 

Clean Architecture

Clean Architecture는 프로젝트 구성을 사용 목적에 따라 계층으로 분류하고 각 계층끼리 의존성을 제어하며 실행되는 시스템 구조를 의미한다. 
 
이런 구조가 왜 나오게 된 것일까?
 
1. 테스트 편의성
각 계층은 하위 계층이 어떻게 구현된지 모르는채 개발하는 것이 중요한 구조이다. 따라서 다른 계층의 코드의 영향 없이 각 계층의 로직만 테스트 코드를 작성해주면 된다.
 
e.g)
1. Bussiness 로직만 구현한 코드만 테스트 코드 작성
2. DB를 조회하는 코드만 테스트 작성
 
즉 각 계층의 역할을 서로 신경쓰지 않고 테스트 코드를 작성하기 편리하는 구조가 되는 것이다.
 
2. 확장 편의성, 구현 편의성
각 계층이 어떻게 구현된지 모르고 의존 역전의 법칙 때문에 각 객체를 직접 불러서 함수를 호출하는 것을 금지하고 있다. 그래서 직접적인 Business 로직과 외부 접근 로직 사이에 중간 계층을 담당하는 interface가 사용된다. Business 로직은 interface 객체를 받아서 함수를 호출하고 실질적으로 interface가 구현된 객체가 실행되게 만들어서 확장성을 좋게 만들 수 있다. 
 
interface 조건만 만족한다면 domain layer에서는 mysql이거나 mongodb 등과 같은 다른 DB가 실행되도 코드 변경이 필요한 부분이 적을 것이다.
 
 
3. 유지 보수가 편함.
각 계층은 특정 interface를 통해 구현되기 때문에 특정 몇몇의 함수를 통해서 호출된다. 그렇기 때문에 코드에 변경이 발생해도 비즈니스 로직이 변경되지 않는다면 되도록이면 작은 변경으로 코드를 작성할 수 있다.
 
 
의존성
아까 말했다 시피 엔티티에서는 DB가 어떻게 작동되는지 전혀 알필요가 없다. 즉 내부에서는 외부로의 의존성을 신경쓰지 않아도 되지만 외부에서는 내부로 의존성을 가질 수 있다.
 
장치, 웹, DB, UI: 직접적인 DB 구현이 되어 있는 계층
Interface & Drivers: 외부의 DB 등을 호출해주는 Interface가 존재하는 계층
UseCases:에서는 Entities의 제어하는 역할을 함. 실행시키거나 어떤 조건에 의해 다른 business 로직등을 실행시킴 즉 Application 계층을 하는 것으로 알면 됨.
Entities: 에서는 Usecases에서 호출되고 사용된다. 실질적인 비지니스 로직이 포함되어있는 계층이다.
 

 
 

하지만 너무 DDD랑 비슷하잖아???

 
기존에는 DDD로 코드를 작성하는데 DDD와 Clean Architecure와 크게 다른 점이 느껴지지 않았다. 
 
저 각 계층이 DDD에도 그대로 적용되어서 사용할 수 있을 것 같았다. 그래서 DDD와 Clean Architecture가 어떤 점이 다른지 정리해보려고 한다. 
 
사실 내가 오해한 것이 이었다. DDD는 Domain 중심적으로 규칙을 정해 상호작용 하는 것을 잘 표현하기 위해서 탄생한 방법론 같았다. 
Clean Architecture는 외부 환경 변경 등이 있어도 이를 최소한의 변화로 적용할 수 있는 시스템 구조를 구성하는 방법인 것 같았다. 
 
즉 DDD는 쇼핑몰 주문에 있어 상품, 고객, 구매 등을 하나의 Entity로 보고 규칙을 정의한다. 즉 기술적 구조보다는 각각의 도메인에 중심을 맞추어 개발하는 것을 의미한다.
 
Clean Architecture는 DDD에서 구현한 것에 다양한 변화가 생성될 수 있다. 데이터베이스가 변경되거나 앱에서 실행되거나 하는 등의 문제가 있을 수 있는데 이러한 변화가 있어도 비즈니스 로직에 문제 없이 서비스가 될 수 있도록 프로젝트를 구성하는 것을 의미한다.
 
 
요약
DDD: 프로젝트의 각각의 요소를 도메인으로 보고 각 도메인의 비즈니스 로직을 중심으로 개발하는 것을 의미함.
 
Clean Architecture: 개발 및 외부의 변화가 있어도 서비스가 실행될 수 있도록 아키텍처를 구성하는 방법을 의미함.
 
그래서 DDD를 적용 후 Clean Architecture를 적용하게 되면 더 좋은 서비스를 개발 할 수 있다.

'머리속에 궁금했던 것들' 카테고리의 다른 글

http와 https의 차이  (0) 2024.09.16
L4, L7 Loadbalancer 차이  (0) 2024.09.10
서버 성능 테스트(1)  (0) 2021.11.18
Go, Java Garbage Collector  (0) 2021.06.08