이번 포스팅은 현업에서 iOS 개발자로 활동한 뒤로 오랜만에 올리게 되는 개인 포스팅인 것 같다 🥲
배경
8월 즈음, 동아리 활동을 하면서 좋은 동료 iOS개발자와 협업하여 앱을 출시하게 되었다..! 👏🏻👏🏻 한달만에 앱을 출시하는 거라 우리의 목표는 비교적 간단했고 요약하자면 이렇다. 첫째는 이전 포스팅부터 적용해보던 클린아키텍처로 모듈 책임 분리를 명확히하여, Tuist (Xcode 프로젝트)관리 툴을 이용하여 Swift 언어를 사용한 타겟 분리 및 모듈을 관리에 있었다. 둘째는 Xcode Cloud를 사용하여 CI/CD 배포 자동화를 구성하는 것이였다.
모듈 분리에 관하여🤔
윗 그림은 여러번 이전에 포스팅에 사용한 적이 있다. 그림에서 나와있듯이 iOS 클린 아키텍처의 가장 주목할 점은 Domain으로 의존성이 주입된다는 점이였다. 즉, Domain이라는 계층은 외부 계층을 전혀 알지 못하는데에 있다. 반다라트 이전 프로젝트까지는 클린아키텍처를 적용해보았지만 타겟으로 분리하지 않았어서, 지금와서 돌이켜보면 폴더 구성이나 의존성 부분에 있어서 부족한 부분이 있었다. 이를 Tuist를 이용하여 프로젝트를 나눠보고, 모듈을 명확히 적용하기로 하였다.
Tuist🧞♂️
Tuist를 사용하면 Swift 언어로 룰을 정해주고 tuist generate라는 명령어 라인을 입력하면 데모앱, 타겟구성을 자동으로 구성해주는데에 큰 이점이 있었다. 현재 다니고 있는 회사는 XcodeGen을 사용하여 yml로 프로젝트를 관리하는데, Tuist는 Swift언어기 때문에 동료 개발자들이 이해하기 편하고, 수정하기도 비교적 간단함을 느꼈다. 타겟 구성이나 작은 데모앱으로 쪼개는데에 있어서는 관리하기가 확실히 편했다.
몇번의 수정끝에 어느정도 정돈된 반다라트의 타겟 구성 모습이다. (Core == Data, Feature == Presentation 계층 개념으로 사용하였다. ) 타겟자체는 이러한 분리로 구성하였고, 클린아키텍처 룰을 적용해보았다. 위의 그림의 모습을 의존성 관계를 설명하여 그림으로 간단하게 그려보면 이러하다..!
반다라트 모듈의 의존성 관계
반다라트의 모듈 의존성은 이렇게 적용되었다. 놀랍게도 Domain계층의 Import된 다른 계층은 존재하지 않는다. 즉 Domain에 존제하는 Entity, Interface UseCase 3개의 Target들 전부 외부 아무 계층도 알지 못한다. Domain은 Core의 있는 Network를 사용하려 할 때, 어떻게 사용하여야 할까? 이는 Interface를 통하여 사용된다. 여기서 SOLID원칙의 개념인 D: Dependency Inversion Principle 의존성 역전 법칙이 적용된다. Network에 사용되는 인터페이스들은 모두 Protocol로 Interface타겟에 간접적으로 명시되어있고, 그 인터페이스를 Domain 계층에 넣게 되면서, UseCase는 인터페이스를 이용하여 메소드를 불러올 뿐 구체타입은 전혀 알지 못한다. 그리고 실체 인스턴스는 init에서 주입시켜 Domain은 Core존재를 모르는 의존성 역전이 성립된다.
막상 적용시켜보니, 이전 포스팅에서 했던 프로젝트에서 타겟을 나누지 않았을 때의 의존성이 명확하지 않았던 부분을 알게되었다. 타겟을 나누면서 모듈 분리를 하고, 의존 관계를 명확히 하면서 인스턴스 하나하나마다 테스트 코드에 쉽게 주입 수 있는 코드를 완성하게 되었다.
Xcode Cloud 적용기
Tuist나 XcodeGen을 이용하여 프로젝트를 구성하다보면 Xcode Cloud를 적용하는데 workspace의 생성 때문에 난해하다고 들었다. 결론적으로는 걱정하는 것만큼 적용하는데 오래 걸리지는 않았다. Tuist는 workspace를 자동생성해주는데에 번들만 생성하고 tuist generate 명령을 간접으로 돌리도록 구성한다면 손쉽게 생성되어 자동 배포화를 쉽게 할 수 있었다..! 😳 10번안에 성공하고 기뻣던 경험이였다.
여담 및 TMI
초 중반까지는 코드리뷰를 그래도 동료와 빡세게 해보려구 하였다. 항상 느끼는 거지만, 코드리뷰를 하면 작은거에 집중하면 큰거를 놓칠때가 있는거같다. 그래서 조금더 실용적, 기능적인 부분을 보려고 노력하였고, 으쌰으쌰도 잊지 않았다 💪🏻
동료와 열심히했던 PR의 흔적들...
https://github.com/Nexters/BandalArt-iOS/pull/20
https://github.com/Nexters/BandalArt-iOS/pull/23
3시간의 회의 여정...
진짜 찐개발자 같은 뿌듯한모습들..!
모각코도 오랜만에 하는거라 새로웠고, 막판에는 새벽까지 주로 만나서 밤샘 작업하였다. 너~무 좋은 동료들과 산책하며 사진도 많이 찍었고 놀러다니기도 많이해서 성취감, 즐거움 둘다 가졌던 것 같다.