2. 목차
• 모듈화 개발 시작 with Tuist
• 어떻게 기능을 개발해야할까?
• 응집도와 결합도
• View(Controller)
• 리소스
• Interactor, Router
• Repository
• Builder
3. 모듈화 개발 시작(with Tuist)
• Tuist 적용 이후
• 프로젝트 파일을 매번 생성하여 프로젝트 파일의 머지 충돌이 없어졌음
• 프로젝트에서 다른 모듈을 의존성 가지더라도 Tuist에서 의존성 추적으로 프로젝
트 파일에 의존성을 자동으로 추가해주기 때문에 별도로 작업할 필요가 없음
• 따라서 프로젝트 관리가 쉬워짐
4. 모듈화 개발 시작(with Tuist)
• 새로운 프로젝트를 만들기 쉬워졌음
• Application 프로젝트에 있는 코드를 새로운 프로젝트로 분리하기 쉬워짐
• 의존성 그래프를 보면서 어디에 프로젝트를 생성하고 배치할지 알 수 있음
• 각 프로젝트마다 필요에 따라 쉽고 빠르게(기존에 비해) 새로운 프로젝트로 분리하
여 개발될 수 있음.
7. 응집도와 결합도
• Application프로젝트에서는 모든 소스가 한 프로젝트에 있었음.
• 이는 파일 단위로 폴더 구조로 보면 응집도가 높다고 할 순 있음.
• 해당 소스은 역할별로 분리되어 있음.
• 하지만 프로젝트, 모듈 단위로 보면 응집도가 아닌 결합도가 높은 것임
• 유용하게 구현된 코드가 있으면 바로 접근하여 사용이 가능하기 때문
16. View(Controller)
• View를 그리는 주체도 View에 넘겨준다면 Preview 기능을 더욱 활용할 수 있음.
• ViewController의 view를 Custom View로 교체
• ViewController는 View에 출력하기 좋게 상태를 가공해서 넘겨줄 수 있음.
19. 리소스
• Image, Color, Storyboard, Xib는 리소스
• Image, Color는 각 기능마다 동일한 값을 반환해야함.
• 별도의 모듈로 관리해야 기능의 UI모듈에서 가져다 사용할때 동일하게 반영됨.
• ex) X 버튼의 이미지 색상이 바뀌었을 때 모든 모듈의 화면이 동일하게 반영되
어야 함.
• Storyboard, Xib에서 이미지 사용시 같은 번들에 있어야 사용이 가능함.
• Storyboard, Xib를 위해 해당 번들에 이미지가 중복해서 존재하면 안됨.
26. Interactor
• 비즈니스 로직을 처리하는 곳
• (Optional)View로 부터 Action을 전달받고, State를 넘겨줌.
• 기존에는 Presentable이라는 프로토콜을 정의하고 ViewController는 해당 프로토
콜을 따르도록 사용하였음.
• 이는 ViewController가 Interactor 역할을 알게되는 상태임.
• ViewController와 Interactor간의 커플링 발생
44. 코드와 개발자 간의 관점의 차이
• 코드의 시점
• UI는 상태를 받아서 보여주고, 이벤트를 넘겨줌
• Interactor는 상태를 만들어서 넘겨주고, 이벤트를 받음
• Interactor는 UI를 직접적으로는 몰라야함
• 이는 Interactor가 UI에 의존적이지 않도록 하기 위함
45. 코드와 개발자 간의 관점의 차이
• 전지적 시점
• UI와 Interactor, Router 둘의 코드를 알고 있음.
• 하지만 Interactor는 UI에 대한 직접적인 의존 관계는 형성되면 안됨.
• Interactor를 검증하기 위해 UI 의존 관계가 추가됨.
• Interactor는 넘겨줄 상태와 받을 이벤트를 정의함.
• 사실상 UI와 동일하게 정의한 상태와 이벤트임.(중복이지만 중복이 아닌)
• UI와 Interactor간의 직접적인 의존 관계를 깨트리고 간접적인 의존 관계가 형성됨
52. Repository
• Service는 Interactor에서 복잡한 로직을 대신 처리해주는 역할을 담당함.
• 현재 네트워크 요청, 앱로그, Property 호출은 Interactor가 아닌 Service에서 호출
하고 있음.
• Service는 네트워크, 앱로그, 환경설정 등의 의존성을 가지고 있음.
55. Repository
• 현재 구조로는 도메인 모듈은 네트워크 요청, 앱 로그, 환경 설정 모듈을 의존성 가짐.
• Service는 비지니스 로직을 처리하는데, 외부 모듈이 필요할때 의존성 주입을 받을 수
있다면?
• 해당 의존성 주입을 받게 되면 도메인 모듈은 직접적인 외부 모듈과의 의존관계가
없어짐.
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. • 모듈 수가 많아짐에 따라 프로젝트 수가 많아질 수는 있음.
• 같은 도메인에 해당하는 모듈을 모아 한 프로젝트에서 작업도 가능
69. 정리
• 모듈화는 격리화를 통해 지금까지 못했던 독립적인 기능을 구현할 수 있음
• 모듈이 계층으로 묶여서 계층 단위의 추상화를 제공하며, 직교적 시스템을 설계가 가능함
• 다른 코드에 영향을 끼치지 않으면서 기반 구현을 구현할 수 있으므로 유연성이 높아짐
• 모듈 단위의 개발로 빠른 피드백을 받을 수 있음
• 각 모듈을 검증하는데 비용이 줄어들며, 모듈을 연결해 통합 검증하는 비용도 줄어듬
• 설계를 통해 코드 유지보수 비용을 일정 수준에서 관리가 가능한 지속 가능한 코드가 됨
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