클린 아키텍처란?
소프트웨어 세스템의 구조를 설계할 때 지켜야 할 원칙과 방법을 정의한 개념으로 복잡한 소프트웨어 시스템을 보다 관리 가능하고 유지보수 가능한 형태로 구축하기 위한 지침을 제공
소프트웨어의 유지보수성, 테스트 용이성 및 모듈간의 분리를 강조하여 안드로이드 애플리케이션을 더 구조화된 방식으로 개발할 수 있도록 도와준다.
기존의 계층형 아키텍처가 가지던 의존성에서 벗어나도록 하는 설계를 제공해줌
클린 아키텍처가 필요한 이유
소프트웨어가 가진 본연의 목적을 추구하려면 소프트웨어는 반드시 부드러워야한다.
즉 변경하기 쉬워야한다.
가장 중요한 장점 중 하나인 시스템의 각 부분을 독립적으로 개발하고 테스트 할 수 있는 환경을 조성할수 있다.
또한 시스템의 변경이나 업그레이드가 필요할 때 전체 시스템을 다시 작성하지 않아도 되며,
특정 부분만 수정하는 것이 가능해진다.
즉 비즈니스 로직은 바꾸지 않으면서, 언제든 DB와 프레임워크에 구애받지않고 교체할 수 있는 아키텍처인것
클린 아키텍처의 주요 원칙
● 의존성 역전 원칙 (Dependency Inversion Principle)
고수준 모듈은 저수준 모듈에 의존해서는 안되며, 양쪽 모듈 모두 추상화에 의존해야한다.
이를 통해 느슨한 결합을 유지할 수 있고 이 원칙을 따르면 상위 계층이 하위 계층에 의존하는 전통적인 의존 관계를 반전 (역전) 시킴으로써 상위 계층이 하위 계층의 구현으로부터 독립되게 할 수 있다.
● 경계 (Boundary)의 분리
경계 한편에 있는 요소가 반대편에 있는 요소를 알지 못 하도록 막는것으로 시스템(소프트웨어 요소)을 여러 영역으로 나누고, 각 영역 사이의 인터페이스를 정의하여 각 영역의 독립성을 보장한다.
● 인터페이스 분리 원칙 (Interface Segregation Principle)
클라이언트가 자신이 사용하지 않는 메서드에 의존하지 않아야함 즉 인테퍼이스는 클라이언트의 요구에 딱 맞는 형태로 분리되어야한다.
클린 아키텍처의 장점
● 유지 보수 용이성
계층까지 분리가 되있어 한 계층을 변경해도 다른 계층에는 영향을 주지 않아 유지보수가 쉽다.
● 테스트 용이성
의존성을 주입하여 유닛 테스트 및 통합 테스트를 수행하기 편하다
● 모듈간의 분리
계층마다 자체 역활을 가지며, 이로 인해 코드의 재사용성이 높아집니다.
● 데이터베이스 or Ui 프레임워크 변경 용이성
중요한 비즈니스 로직은 외부 프레임워크와 분리되어 있어 해당 프레임워크를 변경하더라도 기존에 작성한 전체 코드를 다시 작성할 필요가 없다.
클린 아키텍처의 계층
-> 클린 아키텍처는 다양항 계층(Layer)으로 구성되며, 각 계층은 특정한 역활과 책임을 가지고 있다.
● 프레젠테이션 계층(Presentation Layer) -> UiLayer 이라고도 하는 듯?
- 뷰(view) : 플랫폼 의존적인 구현, 즉 Ui 화면 표시와 사용자 입력을 담당하고있고 단순하게 프레젠터가 명령하는 일만 수행한다.
- 프레젠터(presenter) : MVVM의 ViewModel과 같이 사용자 입력이 왔을떄 어떤 반응을 해야하는지 판단하는 영역으로 무엇을 그려야 할지도 알고 있는 영역
UpStream관점으로 사용자의 이벤트를 받아 비즈니스 로직을 실행시키는 책임
DownStream관점으로 상위 레이어(Domain or Data)로부터 받은 데이터를 UI에 바인딩해준다.
● 도메인 계층(Domain Layer)
- 유즈 케이스(Use Case) : 비즈니스 로직이 들어 있는 영역이다.
- 모델(Entity) : 앱의 실질적인 데이터이다.
ViewModel의 중복 코드가 정의되는 책임
ViewModel의 책임 이외에 필요한 비즈니스 로직이 정의되는 책임
● 데이터 계층(Data Layer)
- 레파지토리(Repository) : 유즈 케이스가 필요로 하는 데이터의 저장 및 수정 등의 기능을 제공하는 영역으로써 데이터 소스를 인터페이스로 참조하여 로컬 DB와 네트워크 통신을 자유롭게 할수 있다.
- 데이터 소스(Data source) : 실제 데이터의 입출력이 실행되는 곳
● Repository
UpStream관점에서 앱 내 필요 데이터를 DataSource에 요청하는 책임
DownStream관점에서 DataSource로부터 받아온 데이터를 가공하여 하위 레이어(Domain or Ui)에
전달해주는 책임
● DataSource
UpStream관점으로 Repository가 필요한 데이터를 Remote or/and Local Server에 요청한다.
DownStream관점으로 Repository에 데이터를 제공한다.
※ 3가지 레이어들의 통신은 단방향 데이터 흐름으로 통신하게 된다.
단방향 데이터 흐름이란?
데이터가 오로지 한 방향으로만 흐르는것을 의미하는 것으로 Up stream방식 과 Down Stream방식이 있다.
● Up stream
사용자가 클릭 등의 이벤트를 발생시키면
UI -> Domain -> Data로 전달함으로써 상위레이어로 전달하는 방식이다.
● Down stream
Remoete 또는 Local Server로부터 받은 데이터를 Data -> Domain -> UI로 전달함으로써
하위레이어로 전달하는 방식이다.
'App' 카테고리의 다른 글
Hilt (1) | 2024.02.15 |
---|---|
디자인 패턴 (1) | 2023.12.17 |
firebase(파이어베이스)란? (1) | 2023.12.17 |
Life Cycle(Android Activity Lifecycle) (1) | 2023.12.15 |
Native Application과 Cross-Platform Application의 차이점 (0) | 2023.12.15 |