본문 바로가기
iOS/설명

[iOS] iOS에서의 Multi-Layer Architecture

by Sky Titan 2023. 1. 23.
728x90

출처:

https://medium.com/2-minutes-read-tip/how-to-organize-your-ios-project-like-a-pro-and-maximize-your-productivity-5d580b7dc4a3

 

iOS Project Structure Like a Pro

Improved code organization, separation of concerns, reusability, testing

medium.com

Multi-layer architecture

 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하지 못한다.

728x90

댓글