클린 아키텍쳐를 프로젝트에 적용해본 적은 있지만, 개념정도만 이해하고 예제를 보면서 적용하다보니 쓰면서 굉장히 헷갈렸던 기억이 있습니다..💦
그래서 이번에 진행하게된 프로젝트에서는 확실히 이해하고 적용해보고자 하나하나 뜯어보려고 합니다.
이 분은 클린 코드라는 책의 저자이자, 애자일 창시자 중 한명인 소프트웨어 엔지니어 로버트 C 마틴인데요.
이 분이 고안한 게 바로 그 유명한 클린 아키텍쳐입니다!
클린 아키텍쳐를 작동시키는 가장 우선적인 규칙은 Dependency Rule
입니다.
바깥쪽부터 Frameworks & Drivers
와 Interface Adapters
, UseCases
, Entities
네가지 레이어로 이루어져있습니다.
다이어그램에서는 네가지이지만 레이어의 개수가 절대적인 것은 아닙니다.
outer circle에서 inner circle로만 의존하는 Dependenct Rule을 지키고,
안쪽으로 갈 수록 추상화 수준이 증가하면 됩니다.
앞서 살펴본 레이어를 보면
DB → Controllers(Presenters) → UseCases → Entities
이런 식으로 Dependency Rule을 가지고 있었죠?
하지만 UseCases가 Prseneters를 호출할 수도 있습니다.
직접 Presenter를 호출하는 것이 아니라 UseCase에서는 인터페이스를 호출하고,
Presenter가 해당 인터페이스의 세부사항을 구현합니다.
결론적으로 안쪽에 있는 레이어인 UseCase가 바깥쪽 레이어에 있는 Presenter에 직접적으로 접근하는 것이 아니라
UseCase내에 인터페이스를 Prseneter가 구현하므로써 간접적으로 UseCase가 Presneter에 접근할 수 있게 되는 것입니다!
클린 아키텍쳐와 MVVM을 적용한 예제입니다.
예제는 영화 제목을 검색하면 겸색 결과 리스트가 나오고, 상세 뷰를 볼 수 있는 간단한 영화 검색 앱입니다! +캐시를 이용해서 검색어 저장해줌
예제에서는 UseCase와 Entities를 Domain Layer
라고 그루핑하여서
Presentation
, Data
, Domain Layer
가 총 세가지 레이어가 존재하게 됩니다.
Domain이 원 가장 안쪽에 자리하게 되고,
Presentation과 Data가 각각 Domain에 의존성을 가지게 됩니다.
폴더링과 매핑해보면, 전체적으로 이런 식의 구조로 되어있습니다!
이제 각자 레이어가 무슨 일을 하는지 자세히 알아보겠습니다!!
도메인 레이어의 핵심은 다른 레이어(Presentation의 UIKit/SwiftUI나 Data 레이어의 Mapping Codable)의 어떤 것도 포함시키면 안되는 것이라고 하네요.
예제 프로젝트에서도 Data layer의 DefaultMoviesRepository에서 API로 받은 결과를 domain 모델로 매핑하거나, 리퀘스트를 dto로 매핑해줍니다!
예제 프로젝트에서는클린 아키텍쳐와 MVVM 뿐만 아니라,
코디네이터와 DI컨테이너라는 것도 적용했는데요,,,,, ◠‿◠
코디네이터는 제가 저번에 포스팅했던 주제로 델리게이트 패턴을 통해 화면을 전환하는 패턴입니다. 그리고 DI컨테이너는 코디네이터 패턴과 비슷한데 의존성 주입을 담당하는 컨테이너라고 생각하면 될 것 같습니다..
기회가 된다면 해당 프로젝트에 적용된 DI컨테이너와 actions, behavior도 추가적으로 뜯어보는 시간을 ...... 가져보고 싶네요..
저의 머리로 이해하기에는 진짜 구조가 🐶복잡해서 한번 흐름을 그림으로 표현해보았습니다..
조금이라도 도움이 되기를 바라며...