iOS

[If kakao 후기] 카카오뱅크 iOS 프로젝트의 모듈화 여정: Tuist를 활용한 모듈 아키텍처 설계 사례

Duno 2023. 2. 17. 04:00

본문 내용은 모두 if kakao에서 진행된 세션을 바탕으로 정리되었고, 사진 자료 또한 발표 자료에서 가져왔음을 밝힙니다.

https://if.kakao.com/2022/session/88


 

아키텍쳐 알아보기

 

1. MVVM의 데이터 바인딩을 이용하여 모델과 UI 간의 동기화

- > 비대해지는 viewModel

- > Routing이 정형화되어 있지 않음

 

2. 2019년에 MVVM => RIBs로 전환함

RIBS는 템플릿을 제공하여 일관성 있는 코딩을 하게 해주고, 프로토콜 지향 프로그래밍으로 테스트 코드가 가능하다.

응집도 높은 코드와 Routing 기능이 된다.

단점은 기능 단위로 많은 파일이 생성된다는 점이 있다.

 

모듈화의 필요성

 

2020년 8월 31일 기준 11,000개 파일에 104만줄의 코드가 존재한다. 개발 인원이 많아지고, 프로젝트 규모가 빠르게 커진 것이다.

 

RIBs를 이용해 응집도 높은 코드를 구현했지만, 메인 프로젝트에서 작업하여 다른 도메인에 쉽게 접근이 가능했고, 코드의 결합도가 증가했다. 메인 프로젝트에서 많은 파일이 존재해서 빌드 시간이 증가하고 파일 개수가 늘어나 빌드가 실패하는 문제가 생겼다.

 

프로젝트 규모가 증가하고 새로운 기능을 개발하려 하니, 개발자가 더 필요해졌고 개발자가 늘어나서 코드가 증가하며 코드들간의 결합도도 증가했다. 이는 다시 빌드 시간을 증가시키고 개발 시간도 증가시켰다. 노동의 효율이 떨어졌다.

 

모듈화를 한다면 빌드 시간을 줄이고 악순환의 고리를 끊을 수 있다. 결합도가 높은 것들을 분리할 수 있다.

17년 3개 모듈에서, 현재 21년에는 49개의 모듈이 만들어졌다. 모듈 개수가 증가하는 속도가 줄어든 것은 특정 모듈을 늘리고 관리하는 것이 힘들어졌다는 것이다.

 

Tuist의 사용

 

Xcode 자체에서 존재하는 Framework, library를 관리하는 UI는 어떤 것을 embed하고 하지 않을지에 대한 판단을 하기가 쉽지 않다.

도구를 사용하여 복잡한 모듈을 설정하고, 템플릿을 통해서 프로젝트를 생성할 수 있다면?

 

그러한 도구가 Tuist이며, 지금 기준으로 모듈이 110개가 존재한다. 최근에는 일주일에 2-3개 이상의 모듈이 추가되고 있다고 한다.

 

모듈 수가 증가하면, 빠른 증분빌드가 가능하고, 빠른 코드를 실행할 수 있어 졌다. 빌드가 빨라져서 테스트도 쉬워졌고 안정적인 상품 개발이 가능했다. 또한 데모앱을 이용하여 빠른 실행도 가능했다.

 

빠른 빌드가 되면, UI및 비즈니스 로직을 빠르게 실행할 수 있게 된다.

 

모듈 분리가 어려운 이유

그러나 모듈 분리 작업은 쉽지 않은데, 수동으로 프로젝트와 프레임워크를 관리하기가 쉽지 않다.

동적 프레임워크는 embed 하지 않을 시에 런타임 에러가 발생한다. 따라서 시간 손실이 발생한다.

정적 프레임워크와 라이브러리를 사용하면 코드가 중복 복사될 수 있다. 중복 복사된 코드는 예상치 못한 에러를 만들 수 있다.

 

swiftPM의 configuration은 debug와 release만 제공하기 때문에, 실제 Xcode에서 제공하는 configuration보다는 훨씬 적다. 따라서 카뱅에서는 사용하지 못했다.

 

프로젝트 생성 도구 조건, Tuist의 역할

 

swift 언어로 manifest를 작성 가능해야하고 : swift라면 배우고 사용하는 비용이 작아진다.

프레임 워크 및 라이브러리의 embed 설정이 가능해야 한다. : 의존성 관리를 도구에서 지원해야 한다.

조건에 따라 워크스페이스와 프로젝트를 다르게 설정 가능해야 한다 : 환경 변수를 이용하여 조건문으로 분기처리, 특정 프로젝트를 기준으로 워크스페이스 구성

의존성 그래프를 바탕으로 어떤 모듈을 어떻게 사용해야 하는지에 대해 효과적으로 파악 가능하다.

 

Tuist의 Runtime Error 방지

위와 같은 구조를 구현하려 할 때, 기존 Xcode에서 하던 방식으로 한다면 수동으로 Embed를 해야 ModuleC의 library Error가 발생하지 않는다. Tuist에서는 단순히 dependencies에 ModuleA와 ModuelB만 추가하는 것으로 Embed가 처리된다. 

 

위와 같이 모듈에 대한 데모앱도 설정 가능하다.

 

카카오뱅크 모듈 아키텍쳐 설계

Tuist 모듈화의 장점

 

전체적인 의존 관계 파악 가능

증분 빌드 활용 : 데모앱을 실행하여 UI를 빠르게 확인하고, 테스트 사이클이 빨라짐, InjectionIII/Lookin/RevealApp/Xcode Preview등 UI 개발 도구를 활용한 개발이 가능

코드에서 모듈로 관점 변경 : 안정적인 모듈 구축, 동작 예상 가능, 모듈 조립으로 새로운 상품 구현

안정적인 모듈 구축 -> 모듈 사용시 예상 가능한 동작 -> 새로운 상품과 기능을 빠르고 쉽게 작성 -> 프로젝트 구조가 안정적으로 개선


Tuist 및 모듈화에 관심을 갖게 되고 꽤 시간이 지났지만 현업에서 적용되고 있는 모습과 효과에 대해서는 알기 어려웠다. 지난 세션을 들으며 현업에서 tuist를 통한 모듈화가 왜 필요했고, 어떻게 도입되었는지에 대해 납득할 수 있었다. 민소네님 블로그에 모듈화 관련 내용이 많으니 그를 바탕으로 이유 있는 설계를 연습해보려 한다.