Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
Tags
- 애니캐스트
- 바이너리서치
- Mobile Communication
- baekjoon 17406
- 채널톡
- 트위스티드페어케이블
- internetprotocol
- 서로소 집합
- ethernet_frame
- 알고리즘
- the composable architecture
- 단편화
- 최단거리 알고리즘
- 패킷교환네트워크
- premble
- 합집합 찾기
- 다익스트라최단경로
- Algorithm
- 네트워크 전송방식
- 네트워크
- swift_tca
- Multi Access
- Swift
- 광섬유케이블
- ios
- 스위프트
- 이더넷프레임
- 의존성역전
- Python
- 패킷
Archives
- Today
- Total
INEEDACHACHA
Clean Architecture on iOS (MVVM) 본문
Summary
- CleanArchitecture는 로버트 마틴이 고안한 아키텍쳐로 소프트웨어를 다양한 계층(Layer)로 분리해서 다음과 같은 목적을 추구한다.
- 아키텍처는 소프트웨어 라이브러리의 존재 자체에 의존하지 않음
- 비즈니스 로직은 UI, DB, 웹, 섭버 또는 기타 외부 요소 없이 테스트 할 수 있음
- UI는 시스템을 변경하지 않고도 쉽게 변경 가능(ex. 비지니스 로직을 변경하지 않고 UI 변경 가능)
- 비즈니스 로직이 DB에 바인딩 되지 않음
- 비즈니스 로직은 outside world에 대해 전혀 알지 못함
- 소프트웨어에서 맡은 역할에 따라 레이어를 나눈 후, 완전 분리시켜서 의존성을 최대한 낮추는 게 목적이다.
DataLayer
- 데이터 레이어는 하기를 포함한다.
- Repository 구현체
- 여러 Data Source
Data Source
- 데이터를 가져오는 곳을 만한다.
- API 객체
- 로컬 DB(CoreData, Key Chain, plist등)
- 캐시
RepositoryImpl
- 여러 DataSource에서 데이터를 가져오고 저장하기 위한 객체 입니다.
- API에서 받을 경우
- Alamofire, URLSession등 데이터를 가져오는 코드가 담겨있는 객체
- 로컬 DB에서 데이터를 가져온다면
- 해당 DB와 상호작용을 처리하는 코드를 구현
- API에서 받을 경우
- 데이터 소스에서 받아온 데이터를 Entity로 매핑
- Entity에 CRUD를 수행하고, Domain Model을 변형시킨다.
++
- Repository 구현체는 보통 Repository Interface와 함께 구현되어 Interface를 통해 데이터를 가져오는 방법을 정의한다.
- Repository Interface는 Domain Layer의 UseCase에서 DataLayer에서 데이터를 받아올 때 발생하는 (의존성 역전)을 해결하기 위해 정의된 인터페이스이다.
- Data Layer에서 Repository 구현체를 구현하고 Domain Layer에서 Repository Interface를 가짐으로써 Data Layer가 변경되더라도 Domain Layer에 영향을 미치지 않도록 한다.
UI Layer + Presenter Layer
View
- ViewController, SwiftUI View, UIKit을 상속하는 모든 View Class를 말한다
- Presenter(ViewModel)을 통해 Domain Layer에 간접적인 접근을 하는 것이 권장된다.
ViewModel
- UI Layer를 통해 유저의 입력을 UseCase를 호출해 비즈니스 로직을 수행하는 계층
- MVVM 패턴으로 구현되며, ViewModel에서는 UI 로직을 하지 않는 것이 좋다
Domain Layer
Domain의 개념
- 도메인이란 소프트웨어 시스템이 구축되는 대상 영역을 말한다.
- 데이터 거래 앱이라고 가정하면, 데이터 거래라는 도메인에 대한 지식과 요구사항을 분석하여 기능을 구현하게 된다.
- 즉, 도메인은 앱이 제공하는 기능과 서비스의 범위를 말한다.
- Domain Layer는 이러한 도메인 지식과 요구사항을 반영한 비즈니스 로직을 담당하는 계층이다.
Entity
- 여러 DataSource에서 가져온 데이터 그 자체를 말한다.
- 일반적으로 Codable을 채택하고 가져온 소스를 맵핑하는 그 객체이다.
Use Case
- 앱의 비즈니스 로직이 정의되어 있는 객체.
- Presenter Layer에서 호출되어 사용된다.
- 좋은 아키텍쳐는 UseCase 중심으로 구현되어있다.
Repository Interface
- Domain Layer에서 사용자의 요청을 처리하다보면, Data Layer에 읜존성을 갖는 의존성 역전 현상이 발생하게 된다.
- Repository Interface를 정의하고, 구현은 Data Layer에서 구현해서 의존성 역전 현상을 해소할 수 있다.
Data Flow
- Domain Layer는 응용프로그램의 핵심 로직을 담당하기 때문에 Presenter Layer, Data Layer 사이에서 중간 역할을 한다.
- Presentation Layer(View,ViewModel)에서 유저 요청을 받고
- Data Layer(API, Network, Domain Model)에서 데이터를 받아오고 가공하고
- Domain Layer(UseCasem Entity)에서 유저 요청 + 가져온 데이터를 조합한다.
- 사용자 요청에 맞는 데이터를 Presentation Layer로 보낸다.
- 이를 통해 두 Layer 사이의 의존성을 낮추고, 유연성과 재사용성을 늘릴 수 있다.
'iOS' 카테고리의 다른 글
TCA with SwiftUI (The Composable Architecture) (0) | 2024.08.01 |
---|---|
[UIKit] Tabbar - Programmatic (0) | 2024.05.15 |
Dependency Inversion Principle feat.Swift (의존성 주입, 역전) (0) | 2024.03.31 |
Combine - Subscriber (컴바인 구독) (0) | 2024.03.20 |
Combine - Publisher (컴바인 퍼블리셔) (0) | 2024.03.17 |