출처:
Multi-layer architecture는 application을 분리된 layer들로 나누는 것으로, 각각의 layer는 저마다 특정한 목적을 가진다.
이 architecture의 가장 중요한 목적은 code 구조, concern의 분리, 재사용성, 협업 능력, 테스팅과 확장성을 향상시키는 것이다.
각 layer는 application을 유지하고 이해하기 더욱 쉽도록 특정한 목적을 가지도록 디자인 되었다. layer들은 일반적으로 각 layer가 하위에 있는 layer와 상호작용하도록 연결되어 있다. 이러한 구조는 app의 다른 part들을 독립적으로 개발가능하게 하고 결합될 수 있도록, modularity를 향상시키게 된다.
Multi-layer iOS architecture
1. User interface (UI) layer
UI layer는 user에게 UI를 표현하는 것과 user input을 핸들링을 담당한다. 대부분 UI관련 코드를 포함하고 있다. 이 layer는 MVC, MVVM, 혹은 VIPER와 같은 아키텍처 패턴을 이용해 구현될 수 있다.
2. Business logic layer
Business logic layer는 data validation과 calculation과 같은 application의 business logic들을 담당한다. 이 layer는 UserLoginService, CommentsService와 같은 business를 담당하는 class들을 포함하고 있다.
그리고 Dependency Inversion(의존성 역전) 원칙을 고수하기 위해서, 이 class들은 private으로 유지되어야하며 오직 protocol들만이 public으로 되어야 한다.
3. Data access layer
Data access layer는 application의 data 저장소, 즉 database나 API와 상호작용을 담당한다. 여기에는 data를 fetching persisting하는 모든 logic들이 포함되어있고, CoreData와 file system으로의 접근을 담당한다. 그리고 이곳에서 Model 파일들과 mamaged object들을 두게 되고 project에서 매우 heavy한 data를 사용할 때 쓰이는 batch saving, batch updating을 위한 class들이 모여있다.
4. Service layer
Service layer에는 application의 layer들에서 쓰일 수 있는 재사용 가능한 Service들이 포함되는데 logging, localization과 같은 것들이 포함된다. helper나 vanilla extension 또한 이 layer에 포함시킬 수 있다.
Multi-layer architecture를 사용할 때 따라야하는 rule들
Single Responsibility (단일 책임 원칙)
각 layer들은 독립적이고 특정한 목적을 가지도록 설계되어야 한다. 그리고 각 layer들은 하위의 layer들과 상호작용이 가능하도록 연결되어야 하는 것 또한 중요하다.
Dependency Inversion (의존성 역전 원칙)
Service class들은 모두 private이여야하며 오직 protocol들만 public이여야 한다. 이것은 dependency injection(의존성 주입)을 활용하여, 모든 service들을 container안에서 초기화하고 ViewModel이나 Interactor에 주입할 수 있게 해준다. 그리고 구현의 전환이 쉬워지므로 testing 또한 쉬워진다.
Decoupling
각 layer는 하위에 있는 layer를 직접 import할 수 있다. 예를 들어 UIProject는 BusinessProject를, BusinessProject는 DAOProject, 그리고 위의 모든 것들은 ServiceProject를 import할 수 있다.
그리고 ServiecProject는 아무것도 import하지 못한다.
'iOS > 설명' 카테고리의 다른 글
[iOS] Pod 폴더 충돌 해결 (0) | 2023.02.05 |
---|---|
[iOS] Podfile.lock (0) | 2023.02.05 |
[iOS] iOS에서의 대표적인 Design Pattern들 (0) | 2023.01.21 |
[iOS] nibName에 따른 ViewController 초기화 (0) | 2023.01.21 |
[iOS] Keyboard와 동일한 애니메이션 적용하기 (0) | 2023.01.07 |
댓글