Clean Architecture with .net
안녕하십니까.
이 글은 Clean 에 대한 글이며 다음과 같은 자료를 참고하였습니다.
- 로버트 C. 마틴(Robert C. Martin)의 책인 Clean Architecture
- Youtube Clean Architecture with ASP.NET Core 2.1
Clean Architecture |
Clean Architecture
Clean Architecture는 Hexagonal Architecture라고도 불리며 port and adapter 라고도 불리는 개념 입니다. 개인적으로 DDD, MSA를 공부하게 되는 일이 생겨서 공부하게 되었습니다.
아래 그림은 동영상의 Overview 피피티 입니다.
아래 그림의 원 모양을 경우에 따라서는 다각형으로 표현하여 이에 대하여 Hexagonal Architecture라고 부르고 각 Layer끼리의 연결은 port and adapter 형식으로 한다고 합니다.
각 레이어를 분리하여 이를 통하여 비즈니스 로직, 프레임워크 의존적인 로직, 데이터 베이스 로직, 뷰 로직등을 각각 분리 합니다.
각각 레이어 상의 의존성은 안쪽으로만 가능하도록 합니다.
각 Layer의 관계를 추상화, interface (port)로 연결하여 느슨한 결합이 가능하도록 합니다.
Clean Architecture의 Core가 추상화인듯 합니다.
이러한 분리를 통하여 원할한 테스트, 프레임 워크, 디비가 변동하여도 쉽게 변동 가능한 이점이 존재 합니다.
Domain Layer
도메인 레이어는 아래와 같이 Entities, Value Object와 같은 도메인 객체를 표현 합니다.
Annotation
데이터를 표현하는데에 있어서 보통 OOP 관점으로 데이터에 Annotation을 통하여 제약을 주곤 합니다.
발표자는 그러한 어노테이션 보다는 아래 코드와 같이 해당 로직을 바깥으로 빼는것을 추천 하였습니다.
--code--
--code--데이터를 표현하는데에 있어서 보통 OOP 관점으로 데이터에 Annotation을 통하여 제약을 주곤 합니다.
발표자는 그러한 어노테이션 보다는 아래 코드와 같이 해당 로직을 바깥으로 빼는것을 추천 하였습니다.
위와 같은 로직을 통하여 디버깅이 가능하고, 새로운 개발자의 진입 장벽이 낮아진다고 합니다.
private set;
데이터를 선언할때 보통 아래와 같이 get;set;으로 선언 합니다.
public ICollection<OrderDetail> OrderDetails { get; set; }
이렇게 하면 아무때나 다시 초기화 할 수 있으니 개발자에게 혼동이 올 수 있다고 하는데요.
아래와 같이 set을 private로 설정함으로 인하여 개발자의 혼돈을 막을 수 있다고 합니다.
public ICollection<OrderDetail> OrderDetails { get; private set; }
도메인에서는 아래와 같이 정리 할 수 있습니다.
Application Layer
CQRS
CQRS는 read와 writes를 분리하는 개념 입니다.
책임을 분리함으로 인하여 확장성을 키우고 그에 따라 성능 항상이 가능 합니다.
하지만 데이터베이스도 결국은 분리가 가능해야 잘썻다고 할 수 있습니다.
중재자 패턴을 제외한 코드들은 중재자 코드에만 의존성을 가지게 되고, 다른 의존성들은 중재자만 가지게 됩니다.
중재자 코드에 로깅, 검증 등 기타 다른 필요 구성요소를 넣을 수 있습니다.
책임을 분리함으로 인하여 확장성을 키우고 그에 따라 성능 항상이 가능 합니다.
하지만 데이터베이스도 결국은 분리가 가능해야 잘썻다고 할 수 있습니다.
중재자 패턴
중재자 패턴을 통하여 어플리케이션 레이어를 요청, 응답, 쿼리의 형태로 일관합니다.중재자 패턴을 제외한 코드들은 중재자 코드에만 의존성을 가지게 되고, 다른 의존성들은 중재자만 가지게 됩니다.
중재자 코드에 로깅, 검증 등 기타 다른 필요 구성요소를 넣을 수 있습니다.
Persistence Layer
Unit or Work and Repository Patterns
DB에 덜 의존적인 코드를 만들기 위하여 Entity Framework인 DbContext를 사용하는 패턴.https://justhackem.wordpress.com/2014/05/25/tdd-using-repository-uow/
그렇지만 ORM을 사용하지 않는 회사에서는 쓸모 없는 내용인듯 하다.
Infrastructure Layer
외부 인프라에 대하여 의존성을 낮춘다.
아래와 같이 연결이 필요한 부분을 클래스로 두고 Dependency Inversion을 통하여 외부 요소와 연결 고리를 낮게 한다.
인프라 레이어가 다른 레이어에 의존적이면 안된다.
외부 인프라에 대하여 의존성을 낮춘다.
아래와 같이 연결이 필요한 부분을 클래스로 두고 Dependency Inversion을 통하여 외부 요소와 연결 고리를 낮게 한다.
인프라 레이어가 다른 레이어에 의존적이면 안된다.
Presentation Layer
swagger를 사용하여 Angular와 같은 Presentation layer를 생성 한다.
댓글
댓글 쓰기