이전에 클린아키텍처에 대한 저의 생각을 적어 보았습니다. 그럼 이번에는 프로젝트에 직접 적용해 보도록 하겠습니다.
https://www.canva.com/design/DAGF2OC79uc/WQkKSiTJWpftVdkyoyOq2Q/edit
전체적인 다이어그램 설계는 Canva를 통해 했으며 아직 프로젝트의 일부인 레시피를 서버에서 fetch해서 보여주고 검색어를 입력하여 특정 레시피를 화면에 보여주는 기능만 먼저 설계해 보았습니다.
먼저 Presentation레이어 입니다.
Presentation레이어는 전체적인 UI 요소와 Interactor로 받은 결과물들을 Mapper를 통해 해당 UI에 맞는 요소들로 맵핑한 뒤 ViewController를 통해 화면의 구성을 구성합니다.
다음은 Doamin 레이어 입니다.
이전 게시물에서는 ViewModel로 정의를 했었는데 UI의 ViewModel과 모호할거 같아 찾아보니 CleanSwift나 Viper 패턴에서는 앱의 비즈니스 로직을 가지고 있는 단위가 Interactor로 사용 되길래 ViewModel은 햇갈리는 경향도 있고 좀 더 Domain 계층에서 비즈니스 로직을 수행하는 역할로는 사용하기에는 Interactor이 더 좋을거 같다는 생각을 했습니다
마지막으로 Data 레이어 입니다.
Data레이어에서는 서버와의 통신을 처리하면 DTO를 이용해 데이터를 앱에 사용하는 도메인 모델로 변환합니다. Json 형식의 데이터를 도메인의 Recipe 형식으로 변경한후 각각의 repository에 전달해 주고 있습니다.
그럼 전체적인 다이어 그램과 함께 어떤식으로 앱이 작동되고 클린 아키텍처를 적용하면서 일어났던 일에 대해서 한번 이야기 해보겠습니다.
현재 각레시피 리스트들을 보여주는 화면에서만 설명을 한다면
Presentation레이어
1. ViewController에서 viewDidLoad 시 Interactor의 fetchFeedList 메서드를 호출합니다.
• 화면의 생명주기가 시작될 때, ViewController는 Interactor의 fetchFeedList 메서드를 호출하여 데이터를 요청합니다.
Doamin 레이어
2. Interactor는 FetchFeedListUseCase를 실행합니다.
• Interactor는 비즈니스 로직을 담당하며, 데이터를 가져오는 역할을 하는 FetchFeedListUseCase를 실행합니다.
3. FetchFeedListUseCase는 Repository를 호출하여 데이터를 요청합니다.
• FetchFeedListUseCase는 Repository를 호출하여 데이터를 가져오는 로직을 실행합니다. Repository는 데이터 소스를 추상화한 계층입니다.
Data 레이어
4. Repository는 Network Layer를 통해 서버에 요청을 보내고 데이터를 받아옵니다.
• Repository는 Network Layer를 통해 실제 네트워크 요청을 보내고, 서버로부터 데이터를 받아옵니다.
5. Network Layer는 데이터를 받아와 DTO로 변환하여 Repository에 전달합니다.
• Network Layer는 서버로부터 받은 데이터를 DTO형태로 변환하여 Repository에 전달합니다. DTO는 네트워크 응답 데이터를 어플리케이션 내부의 모델로 변환하는 역할을 합니다.
6. DTO는 데이터를 도메인 모델로 변환하여 사용합니다.
• DTO는 받은 데이터를 도메인 모델로 변환합니다. 도메인 모델은 애플리케이션 내에서 사용되는 실제 데이터 구조입니다.
Doamin 레이어
7. Repository는 도메인 모델을 FetchFeedListUseCase에 전달합니다.
8. FetchFeedListUseCase는 데이터를 Interactor에 전달합니다.
9. Interactor는 해당 View에 맞는 데이터를 매핑합니다.
• Interactor는 도메인 모델을 View에 맞는 데이터 형식으로 매핑하여, ViewController에서 사용할 수 있도록 준비합니다.
Presentation레이어
10. Interactor는 매핑된 데이터를 ViewController에 전달합니다.
• Interactor는 매핑된 데이터를 ViewController에 전달하여, ViewController가 데이터를 사용할 수 있도록 합니다.
11. ViewController는 데이터를 사용하여 화면을 업데이트합니다.
• ViewController는 전달받은 데이터를 사용하여 화면을 업데이트합니다. 이 과정에서 CollectionView 같은 UI 컴포넌트를 사용하여 데이터를 사용자에게 표시합니다.
설계 하면서 발생한 문제
여기서 문제가 발생하였습니다
바로 9번째 Interactor는 해당 View에 맞는 데이터를 매핑합니다.
라는 부분이였습니다.
클린 아키텍처가 어떤 아키 텍처인지 다시 생각해 보자면
각 계층을 분리하고 고 수준에서 저 수준으로 의존성을 향하며
고 수준객체는 재 사용성이 가능해야 합니다.
하지만 도메인 계층인 Interactor에서 해당 View에 맞는 데이터를 맵핑한다면 고수준 객체인 Interactor는 해당 View에서만 사용이 가능하고 다른 View에서의 재 사용성이 현저히 떨어진다는 것을 알수 있었습니다.
그렇기에 Interactor에서는 매핑처리하는것은 부적절 하기 때문에 매핑은 ViewController에서 진행하며 엔티티를 ViewController까지 전달한 후 해당 View에 맞게 매핑 처리 하도록 로직을 변경할 계획 입니다.
다음 포스팅에서는 어떤 식으로 변경을 했는지에 대해 좀 더 자세히 작성해 보겠습니다 오늘도 긴 글 읽어 주셔서 감사합니다.
'Swift' 카테고리의 다른 글
클린아키텍처 적용해보기 in iOS - 2 (0) | 2024.08.27 |
---|---|
Swift - Closures (0) | 2024.08.18 |
MVC패턴과 MVVM 패턴에 대한 나의 생각 (0) | 2024.07.31 |
F-Lab iOS 수료 후기 (3) | 2024.07.27 |
내가 생각하는 Clean Architecture - in iOS (1) | 2024.06.19 |