클릭아키텍처는 추상화 개념으로 관심사를 분리시키고 의존도를 낮추는 것에 목적을 둔 아키텍처이다.
그 동안 MVVM패턴을 구현하면서 클린아키텍처를 공부했지만 좀 더 명확하게 정리를 해볼까 한다.
MVVM 패턴은 클린아키텍쳐를 구현하기위한 설계 과정이라 보면된다.
MVVM 패턴의 목적은 View (UI 로직), ViewModel (프레젠테이션 로직), Model (비즈니스 로직 및 데이터 액세스) 간의 역할을 명확하게 분리하는 것 인데,
여기서 도메인 데이터 레이어를 구별하고 DTO를 사용하거나 레이어간 의존성 제거를 위해 DI등을 사용하며 전체적인 설계를 하는것이 클린아키텍처다
Presentation/Data/Domain로 레이어를 나눌때 Presentation레이어에서 구현하는것이 MVVM 이라 보면 된다.
클린아키텍처의 기본적인 원리는 종속성 규칙(Dependency Rule)을 지키는 것이다.
각 코드의 종속성은 외부에서 내부로 안쪽으로만 가리킬 수 있고, 고수준 정책이 저수준 정책의 변경에 영향을 받지 않도록 하는 것
레이어 구조를 보면
여기서 안쪽에 있을수록 고수준 정책이고, 바깥쪽에 있을수록 저수준 정책이다
클린 아키텍처의 핵심 원칙, 의존성은 바깥쪽으로 향하도록 내부의 코드는 외부 코드에 의존하면 안 되고, 외부 코드는 내부 코드의 변경에 영향을 받지 않아야한다.
세부 사항은 추상화에 의존해야 한다
구체적인 구현은 추상적인 인터페이스에 의존하게 되고, 이로 인해 코드의 유연성과 재사용성이 향상된다.
RDS, Repository 처럼 데이터 액세스 로직을 추상화 한것
SOLID 원칙은 객체 지향 설계의 핵심 원칙들이다.
객체 간의 의존성을 줄이고, 코드의 재사용성과 유지보수성을 높일 수 있다.
1.SRP (Single Responsibility Principle, 단일 책임 원칙)
한 클래스는 하나의 책임만 가져야 한다.
즉, 클래스가 변경되는 이유는 하나여야 한다.
이 원칙을 준수하면 클래스의 복잡성을 줄이고, 유지 관리를 용이하게 할 수 있다.OCP (Open-Closed Principle, 개방-폐쇄 원칙)
소프트웨어 개체(클래스, 모듈, 함수 등)는 확장에 대해서는 열려 있어야 하고, 수정에 대해서는 닫혀 있어야 한다.
기존의 코드를 변경하지 않고도 기능을 추가하거나 변경할 수 있어야 한다.LSP (Liskov Substitution Principle, 리스코프 치환 원칙)
자식 클래스는 언제나 자신의 부모 클래스를 대체할 수 있어야 한다.
상속을 통한 재사용성을 증가시킬 수 있다.ISP (Interface Segregation Principle, 인터페이스 분리 원칙)
클라이언트는 자신이 사용하지 않는 인터페이스에 의존하지 않아야 한다.
한 클래스에 자신이 필요하지 않는 인터페이스는 구현하지 않아야 한다.DIP (Dependency Inversion Principle, 의존 역전 원칙)
상위 모듈이 하위 모듈에 의존해서는 안 되고, 둘 다 추상화에 의존해야 한다.
모듈 간의 결합도를 줄이고 유연성을 증가시킬 수 있다.
재사용 가능한 코드는 함께 릴리즈되어야 한다
재사용 가능한 컴포넌트는 그룹화되어 함께 버전 관리되고, 릴리즈되어야한다.
이를 통해 컴포넌트의 재사용성을 높이고, 개발자들이 필요한 컴포넌트의 버전을 쉽게 찾고 이해할 수 있다.
같이 변경될 가능성이 있는 코드는 함께 모아두어야 한다
같이 재사용될 코드는 함께 모아두어야 한다
코드 간의 의존성이 순환적이어서는 안 된다