Ce diaporama a bien été signalé.
Le téléchargement de votre SlideShare est en cours. ×

iOS Modular Architecture with Tuist

Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Publicité
Chargement dans…3
×

Consultez-les par la suite

1 sur 75 Publicité

iOS Modular Architecture with Tuist

Télécharger pour lire hors ligne

Cookpad - 코드 생성을 이용한 iOS 앱 멀티 모듈화를 위한 종속 솔루션 - https://techlife.cookpad.com/entry/2021/06/16/110000
Modular iOS Architecture @ Just Eat - https://tech.justeattakeaway.com/2019/12/18/modular-ios-architecture-just-eat/
App Modularization at Wayfair - https://www.aboutwayfair.com/tech-blog/app-modularization-at-wayfair-how-we-unlocked-our-code-and-android-and-ios-teams-at-scale
iOS-Clean-Architecture-MVVM - https://github.com/kudoleh/iOS-Clean-Architecture-MVVM
Android Clean Architecture - https://medium.com/@kimtaesoo188/android-clean-architecture-2e789d6cefc6
Blog - Clean Architecture is not Domain-Data-Presentation - https://markonovakovic.medium.com/clean-architecture-is-not-domain-data-presentation-e368d7ff8579
Youtube - Micro/feature frameworks - https://www.youtube.com/watch?v=w139Vcmr1GY&ab_channel=CocoaHeadsNL
iOS Architecture at Lyft - https://scottberrevoets.com/2021/10/14/ios-architecture-at-lyft/

Cookpad - 코드 생성을 이용한 iOS 앱 멀티 모듈화를 위한 종속 솔루션 - https://techlife.cookpad.com/entry/2021/06/16/110000
Modular iOS Architecture @ Just Eat - https://tech.justeattakeaway.com/2019/12/18/modular-ios-architecture-just-eat/
App Modularization at Wayfair - https://www.aboutwayfair.com/tech-blog/app-modularization-at-wayfair-how-we-unlocked-our-code-and-android-and-ios-teams-at-scale
iOS-Clean-Architecture-MVVM - https://github.com/kudoleh/iOS-Clean-Architecture-MVVM
Android Clean Architecture - https://medium.com/@kimtaesoo188/android-clean-architecture-2e789d6cefc6
Blog - Clean Architecture is not Domain-Data-Presentation - https://markonovakovic.medium.com/clean-architecture-is-not-domain-data-presentation-e368d7ff8579
Youtube - Micro/feature frameworks - https://www.youtube.com/watch?v=w139Vcmr1GY&ab_channel=CocoaHeadsNL
iOS Architecture at Lyft - https://scottberrevoets.com/2021/10/14/ios-architecture-at-lyft/

Publicité
Publicité

Plus De Contenu Connexe

Diaporamas pour vous (20)

Similaire à iOS Modular Architecture with Tuist (20)

Publicité

Plus par 정민 안 (9)

Plus récents (20)

Publicité

iOS Modular Architecture with Tuist

  1. 1. 모듈화 시대 시작 with Tuist 개발 관점의 변화 안정민
  2. 2. 목차 • 모듈화 개발 시작 with Tuist • 어떻게 기능을 개발해야할까? • 응집도와 결합도 • View(Controller) • 리소스 • Interactor, Router • Repository • Builder
  3. 3. 모듈화 개발 시작(with Tuist) • Tuist 적용 이후 • 프로젝트 파일을 매번 생성하여 프로젝트 파일의 머지 충돌이 없어졌음 • 프로젝트에서 다른 모듈을 의존성 가지더라도 Tuist에서 의존성 추적으로 프로젝 트 파일에 의존성을 자동으로 추가해주기 때문에 별도로 작업할 필요가 없음 • 따라서 프로젝트 관리가 쉬워짐
  4. 4. 모듈화 개발 시작(with Tuist) • 새로운 프로젝트를 만들기 쉬워졌음 • Application 프로젝트에 있는 코드를 새로운 프로젝트로 분리하기 쉬워짐 • 의존성 그래프를 보면서 어디에 프로젝트를 생성하고 배치할지 알 수 있음 • 각 프로젝트마다 필요에 따라 쉽고 빠르게(기존에 비해) 새로운 프로젝트로 분리하 여 개발될 수 있음.
  5. 5. 어떻게 프로젝트를 분리하고 개발해야할 것인가 논의가 필요한 시기
  6. 6. 어떻게 기능을 개발해야할까?
  7. 7. 응집도와 결합도 • Application프로젝트에서는 모든 소스가 한 프로젝트에 있었음. • 이는 파일 단위로 폴더 구조로 보면 응집도가 높다고 할 순 있음. • 해당 소스은 역할별로 분리되어 있음. • 하지만 프로젝트, 모듈 단위로 보면 응집도가 아닌 결합도가 높은 것임 • 유용하게 구현된 코드가 있으면 바로 접근하여 사용이 가능하기 때문
  8. 8. Application Interactor Router ViewController 인증 Builder Interactor Router ViewController 여신 Builder Interactor Router ViewController 수신 Builder 소스 
 가시화
  9. 9. Application Interactor Router ViewController 여신 Builder Interactor Router ViewController 수신 Builder • 수신과 여신은 서로 코드 접근이 가능 • 자기 도메인 및 역할에 필요한 값만 접근이 가능해야함. • 모듈로 분리 및 격리하여 수신과 여신간의 결합도를 감소 및 응집도를 증가할 수 있음.
  10. 10. Application Interactor Router ViewController 인증 Builder Interactor Router ViewController 여신 Builder Interactor Router ViewController 수신 Builder
  11. 11. Interactor Router View(Controller) Builder
  12. 12. Interactor Router View(Controller) Builder
  13. 13. View(Controller) • 역할 • View 컴포넌트가 잘 배치되었는지 • 넘겨받은 상태를 잘 표시하는지 • View에서 발생한 이벤트를 잘 넘겨주는지 • 필요요소 • View 컴포넌트 • Resource - Image, Color, Storyboard, Xib
  14. 14. View(Controller) • 상태를 받아서 잘 보여주고, 이벤트를 잘 넘겨줄 수 있다면 Preview로 화면을 볼 수 있음. • 즉, 외부 의존성 없이 View(Controller)만을 가지게 됨.
  15. 15. UI / LoanGoodsViewController.swift
  16. 16. View(Controller) • View를 그리는 주체도 View에 넘겨준다면 Preview 기능을 더욱 활용할 수 있음. • ViewController의 view를 Custom View로 교체 • ViewController는 View에 출력하기 좋게 상태를 가공해서 넘겨줄 수 있음.
  17. 17. UI / LoanGoodsViewController.swift UI / LoanGoodsView.swift
  18. 18. View ViewController
  19. 19. 리소스 • Image, Color, Storyboard, Xib는 리소스 • Image, Color는 각 기능마다 동일한 값을 반환해야함. • 별도의 모듈로 관리해야 기능의 UI모듈에서 가져다 사용할때 동일하게 반영됨. • ex) X 버튼의 이미지 색상이 바뀌었을 때 모든 모듈의 화면이 동일하게 반영되 어야 함. • Storyboard, Xib에서 이미지 사용시 같은 번들에 있어야 사용이 가능함. • Storyboard, Xib를 위해 해당 번들에 이미지가 중복해서 존재하면 안됨.
  20. 20. 수신 View ViewController 수신 UI 모듈 Image, Asset Storyboard 공통 UI 리소스 모듈
  21. 21. 수신 View ViewController 수신 UI 모듈 Image, Asset Storyboard 공통 UI 리소스 모듈 Preview
  22. 22. Preview • SwiftUI를 Wrapping해서 UIKit으로 Preview 가능 • 화면 작업시 Preview 기능만으로 화면 구성 • 유지보수 작업시 컴포넌트 변경 또는 추가에 빠른 대응 가능
  23. 23. UI / LoanGoodsViewPreview.swift
  24. 24. Interactor Router View(Controller) Builder
  25. 25. Interactor Router 모듈 수신 View ViewController 수신 UI 모듈 Image, Asset Storyboard 공통 UI 리소스 모듈
  26. 26. Interactor • 비즈니스 로직을 처리하는 곳 • (Optional)View로 부터 Action을 전달받고, State를 넘겨줌. • 기존에는 Presentable이라는 프로토콜을 정의하고 ViewController는 해당 프로토 콜을 따르도록 사용하였음. • 이는 ViewController가 Interactor 역할을 알게되는 상태임. • ViewController와 Interactor간의 커플링 발생
  27. 27. UI / ViewController.swift Domain / Interactor.swift
  28. 28. UI / ViewController.swift Domain / Interactor.swift
  29. 29. ViewController Interactor Presentable UI 모듈 모듈
  30. 30. ViewController Interactor Presentable UI 모듈 모듈
  31. 31. ViewController Interactor Presentable UI 모듈 모듈
  32. 32. Router • Routing을 처리하는 곳 • Child RIB을 생성하고 관리함. • (Optional)ViewController에 ViewableRouter의 ViewController를 Present, Dismiss 요청을 하는 곳. • ViewControllable 프로토콜로 인한 UI 모듈과 의존관계가 형성됨.
  33. 33. UI / ViewController.swift Domain / Router.swift
  34. 34. UI / ViewController.swift Domain / Router.swift
  35. 35. ViewController Router ViewControllable UI 모듈 모듈
  36. 36. ViewController Router ViewControllable UI 모듈 모듈
  37. 37. ViewController Router ViewControllable UI 모듈 모듈
  38. 38. Interactor Router 모듈 수신 View ViewController 수신 UI 모듈 Image, Asset Storyboard 공통 UI 리소스 모듈
  39. 39. Interactor Router 수신 Domain 모듈 수신 View ViewController 수신 UI 모듈 Image, Asset Storyboard 공통 UI 리소스 모듈
  40. 40. 코드와 개발자 간의 관점의 차이 • 개발시 관점 차이 • 개발자의 관점 • 전지적으로 모든 코드를 알고 접근 가능 • 모듈로 나누더라도 연결된 것이기 때문에 같은 것으로 보게 됨 • 모듈(코드)의 관점 • 내 영역에서 정의되거나 의존성을 가진 코드만 접근 가능
  41. 41. UI Interactor Router
  42. 42. UI Interactor Router Dependency Delegate
  43. 43. 개발자의 전지적 시점 + 모듈 격리화
  44. 44. 코드와 개발자 간의 관점의 차이 • 코드의 시점 • UI는 상태를 받아서 보여주고, 이벤트를 넘겨줌 • Interactor는 상태를 만들어서 넘겨주고, 이벤트를 받음 • Interactor는 UI를 직접적으로는 몰라야함 • 이는 Interactor가 UI에 의존적이지 않도록 하기 위함
  45. 45. 코드와 개발자 간의 관점의 차이 • 전지적 시점 • UI와 Interactor, Router 둘의 코드를 알고 있음. • 하지만 Interactor는 UI에 대한 직접적인 의존 관계는 형성되면 안됨. • Interactor를 검증하기 위해 UI 의존 관계가 추가됨. • Interactor는 넘겨줄 상태와 받을 이벤트를 정의함. • 사실상 UI와 동일하게 정의한 상태와 이벤트임.(중복이지만 중복이 아닌) • UI와 Interactor간의 직접적인 의존 관계를 깨트리고 간접적인 의존 관계가 형성됨
  46. 46. UI Interactor Router Dependency Delegate Adapter 
 (Presentation)
  47. 47. Domain / Presentation.swift UI / Presentation.swift
  48. 48. UI Interactor Router UI.State UI.Action Adapter 
 (Presentation) Action State
  49. 49. Domain / Presentation.swift
  50. 50. Domain / Presentation.swift
  51. 51. Interactor Router Service 수신 Domain 모듈 수신 View ViewController 수신 UI 모듈 Image, Asset Storyboard 공통 UI 리소스 모듈
  52. 52. Repository • Service는 Interactor에서 복잡한 로직을 대신 처리해주는 역할을 담당함. • 현재 네트워크 요청, 앱로그, Property 호출은 Interactor가 아닌 Service에서 호출 하고 있음. • Service는 네트워크, 앱로그, 환경설정 등의 의존성을 가지고 있음.
  53. 53. Interactor Router Service 수신 Domain 모듈 네트워크 모듈 로그 모듈 환경설정 모듈
  54. 54. Interactor Router Service 수신 Domain 모듈 네트워크 모듈 로그 모듈 환경설정 모듈
  55. 55. Repository • 현재 구조로는 도메인 모듈은 네트워크 요청, 앱 로그, 환경 설정 모듈을 의존성 가짐. • Service는 비지니스 로직을 처리하는데, 외부 모듈이 필요할때 의존성 주입을 받을 수 있다면? • 해당 의존성 주입을 받게 되면 도메인 모듈은 직접적인 외부 모듈과의 의존관계가 없어짐.
  56. 56. Interactor Router Service Repository Protocol Domain 모듈 Repository 모듈 Repository Impl Network AppLog Environment Properties
  57. 57. Repository / Repository.swift Domain / Service.swift
  58. 58. Repository / Repository.swift Domain / Service.swift
  59. 59. Builder • Repository 모듈은 Domain 모듈을 의존성 가지는데, Domain 모듈은 Repository 모듈을 모릅니다. • Domain 모듈에는 Service가 있고, Service는 Repository Protocol을 받도록 합 니다. • 그러면 Service에는 Repository 모듈의 구현체를 어떻게 넣어줘야 할까요? Domain 
 Service Repository ?
  60. 60. Builder • Builder가 UI, Domain, Repository 모듈을 의존합니다. • UI, Interactor, Router, Service, Repository를 생성하여 조립하여 각 모듈간의 연결을 도와줍니다.
  61. 61. Interactor Router Service Domain 모듈 수신 View ViewController UI 모듈 Image, Asset Storyboard 공통 UI 리소스 모듈 Repository Impl Repository모듈 API Network 모듈 Builder Builder 모듈
  62. 62. Builder / Builder.swift Domain / Builder.swift
  63. 63. Builder / Builder.swift Domain / Builder.swift
  64. 64. Buildable Routing Listener Domain 모듈 수신 Builder Builder 모듈 Buildable Routing Interactable Domain 모듈 인증 Builder Builder 모듈
  65. 65. Buildable Routing Listener Domain 모듈 수신 Builder Builder 모듈 Buildable Routing Interactable Domain 모듈 인증 Builder Builder 모듈
  66. 66. Buildable Routing Listener Domain 모듈 수신 Builder Builder 모듈 Buildable Routing Interactable Domain 모듈 인증 Builder Builder 모듈
  67. 67. 수신 인증 Domain 모듈 Interactor Router Service View ViewController UI 모듈 Image, Asset Storyboard 공통 UI 리소스 모듈 Repository Impl Repository모듈 API Network 모듈 Builder Builder 모듈 Domain 모듈 Interactor Router Service View ViewController UI 모듈 Repository Impl Repository모듈 Builder Builder 모듈
  68. 68. • 모듈 수가 많아짐에 따라 프로젝트 수가 많아질 수는 있음. • 같은 도메인에 해당하는 모듈을 모아 한 프로젝트에서 작업도 가능
  69. 69. 정리 • 모듈화는 격리화를 통해 지금까지 못했던 독립적인 기능을 구현할 수 있음 • 모듈이 계층으로 묶여서 계층 단위의 추상화를 제공하며, 직교적 시스템을 설계가 가능함 • 다른 코드에 영향을 끼치지 않으면서 기반 구현을 구현할 수 있으므로 유연성이 높아짐 • 모듈 단위의 개발로 빠른 피드백을 받을 수 있음 • 각 모듈을 검증하는데 비용이 줄어들며, 모듈을 연결해 통합 검증하는 비용도 줄어듬 • 설계를 통해 코드 유지보수 비용을 일정 수준에서 관리가 가능한 지속 가능한 코드가 됨
  70. 70. Reference • Cookpad - 코드 생성을 이용한 iOS 앱 멀티 모듈화를 위한 종속 솔루션 • Modular iOS Architecture @ Just Eat • App Modularization at Wayfair • iOS-Clean-Architecture-MVVM • Android Clean Architecture • Blog - Clean Architecture is not Domain-Data-Presentation • Youtube - Micro/feature frameworks • iOS Architecture at Lyft
  71. 71.
  72. 72. One more thing…
  73. 73. 진짜 끝

×