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

Dophi·2023년 1월 20일
1

컨퍼런스

목록 보기
6/14

소개글

각종 컨퍼런스에 나온 강연들을 정리해보면서 공부해보고 있습니다.
이번 포스팅은 if(kakao) 2022에서 안정민님께서 강연해주신 내용을 정리했습니다.
제목은 "카카오뱅크 iOS 프로젝트의 모듈화 여정: Tuist를 활용한 모듈 아키텍처 설계 사례"이며 제목 그대로 카카오뱅크 앱의 코드들을 모듈화하는 과정에 대한 내용입니다.
말투는 편한 말투로 작성하니 양해 부탁드립니다.

영상 다시보기
문서 자료

발표내용

프로젝트 여정

아키텍처

카카오뱅크 앱은 과거에는 MVVM 아키텍처를 따름

  • 장점
    • 데이터 바인딩으로 UI와 Model 간의 동기화
  • 단점
    • 비대해지는 ViewModel 구조
    • 정형화되지 않은 Routing

아쉬운점이 있어서 2019년에 RIBs 아키텍처로 전환

  • 장점
    • 명확한 템플릿
    • 프로토콜 지향 프로그래밍 가능
    • 응집도 높은 코드
    • Routing 기능
  • 단점
    • 많은 파일 생성

프로젝트 규모

2022년 8월 31일 기준으로 11000개 파일, 104만줄의 코드가 존재

  • 결합도 증가 (손쉽게 코드 접근)
  • 빌드 문제 (빌드 시간 증가, 빌드 실패)

  1. 새로운 상품 개발과 프로젝트 유지보수를 위한 개발 인력 필요
  2. 채용으로 인해 개발자 수가 증가했고, 이와 함께 파일과 코드도 빠르게 증가하고 결합도도 증가
  3. 파일과 코드가 늘어나니 빌드 시간이 늘어났고 이는 개발시간 증가로 이어짐
  4. 그래도 개발을 완료하긴 했지만, 이 악순환이 계속 반복되면서 코드 품질은 점점 나빠짐

모듈로 개발할 수 있다면 해결할 수 있지 않을까?

  • 응집도가 높고 격리된 코드를 작성 가능
  • 증분 빌드가 빨라져 개발 속도도 빨라짐

코드를 모듈로 분리하는 작업 진행

  • 모듈 개수의 증가폭이 줄어듦
  • 직접 모듈을 만들고 관리하기가 어려워졌기 때문

어떤 프레임워크를 embed 하거나 하지 말아야 하는지 알기 어려움


도구를 사용해서 복잡한 설정을 대신 관리해주고, 템플릿을 활용해 모듈 생성을 규격화할 수 있다면?

  • 모듈을 대량으로 생산하면서 안정적으로 프로젝트 관리 가능
  • 2022년 8월 31일 기준으로 110개의 모듈을 생성함

  1. 이전과 마찬가지로 프로젝트를 위해 개발자를 채용했고 코드가 증가함
  2. 하지만 이전과 달리 모듈을 만들어서 개발함으로써 빠르고 안정적으로 개발 가능

결과

모듈 조립

  • 안정적으로 상품과 기능을 개발

빠른 빌드

  • 필요한 코드와 모듈만 빌드하여 빌드 시간이 단축됨
  • UI와 비즈니스 로직을 빠르게 개발 및 실행 가능

정리하자면 아래와 같이 됩니다.
1. MVVM 아키텍쳐를 사용했지만 아쉬운 점이 많았음
2. RIBs 아키텍쳐로 변환했지만 코드가 많아지고 결합도가 높아짐
3. 모듈화를 통해 이 문제를 해결했지만 모듈을 만들기가 어려움
4. 모듈 생성에 도구를 활용함으로써 쉽게 만들 수 있게 됨

어떤 도구를 활용했는지 아래에서 이어서 설명합니다.

개발 생산성 개선 방법 알아보기

  • 새로운 상품에는 여러가지 기능들이 필요함
  • 각 기능을 별도의 프로젝트로 분리해 모듈로 만들어야함
  • 그래야 응집도 높은 코드가 되고, 필요한 곳에서 모듈을 불러서 사용 가능하기 때문

모듈 분리가 어려운 이유

  • 프로젝트와 프레임워크를 수동으로 생성하고 관리한다면 실수하기 쉬움
    • 어플리케이션에서 동적 프레임워크를 embed하지 않으면 런타임 에러 발생
    • 정적 프레임워크 / 라이브러리 사용시 코드가 중복 복사되는 문제 발생
  • SwiftPM 제약 사항
    • Configuration은 Debug, Release만 제공
    • 여러 환경의 Configuration 설정은 어려움 (Develop, Test, Stage, Production 등)
  • 모듈로 구성된 어플리케이션에 관한 오픈소스나 참고자료 등이 부족

어려운 부분을 해결해줄 수 있는 도구가 있다면?

프로젝트 생성 도구 조건

  • Swift 언어로 Manifest 작성 가능할 것
    • Manifest Template이 지원된다면 구조 파악이 용이함
  • 프레임워크, 라이브러리의 Embed 설정 및 의존성 관리
    • 동적, 정적 프레임워크/라이브러리를 설정하는 방식이 다르기 때문에 이를 구분하여 처리해야함
  • 조건에 따라 프로젝트, 워크스페이스 동적 생성
    • 환경변수를 이용하여 조건문으로 분기 처리 가능해야함
    • 특정 프로젝트를 기준으로 워크스페이스를 구성할 수 있어야함
  • 의존성 그래프 생성 및 가시화
    • 전체 의존성 그래프 확인으로 확장 가능한 구조를 설계할 수 있음

Tuist vs XcodeGen

Manifest 사용 가능 언어가 Swift라는 점과, 조건에 따라 프로젝트를 동적 생성할 수 있다는 점때문에 Tuist 선택

프로젝트 관리

의존성 관리

  • 앱은 모듈A와 모듈B를 의존하고, 모듈A가 모듈C를 의존하는 상황
  • 앱은 모듈C를 의존하지 않기 때문에 모듈A와 모듈B만 embed하면 에러 발생
  • Tuist를 이용하면 모듈A와 모듈B만 embed 해도 자동으로 모듈C를 embed 해줌

  • 각 모듈에 대한 데모앱 생성 가능
  • 이를 통해 모듈을 빠르게 빌드, 실행 및 테스트 가능
  • 멀티 모듈, 멀티 어플리케이션 구조로 프로젝트 설계 가능

프로젝트 동적 생성

  • "TUIST"로 시작하는 환경변수 사용하여 조건에 따라 프로젝트 동적 생성 가능
  • 일반적인 로직처럼 작성 가능

  • 필요한 의존 모듈로 구성된 워크스페이를 만들 수 있음

그래프 생성

  • "$tuist graph" 명령어를 이용해 의존성 그래프 가시화 가능

모듈 분리 시작해보기

  1. 코드 정리
    • 유틸리티, 네트워크, 보안, 환경설정, 로그, UI 등의 폴더, 파일로 묶어서 정리
  2. Tuist를 활용하여 프로젝트 생성
    • 의존성이 적은 코드부터 새로운 프로젝트로 단계별 이전

프로젝트 생성 도구를 선택하기 위해 많은 조건이 있었는데, Tuist가 이 조건에 딱 맞는 도구여서 이를 활용한 것입니다.

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

  • 각각의 기능들을 모듈별로 나누고 하위 모듈을 관리하도록 함
  • 상품마다 데모앱을 만드는 작업 중에 있음 (입출금통장 데모앱, 정기예금 데모앱 등)

모듈 아키텍처 설계로 얻은 이점

  • 전체 의존관계 파악 가능
    • 코드의 의존관계 파악 및 해당 성격에 맞는 모듈로 이전하여 응집도 높임
  • 증분 빌드 활용
    • 코드를 수정하면 일부 모듈만 빌드하여 증분빌드 시간이 극단적으로 줄어들음
    • Tuist로 생성된 모듈의 데모앱 활용
      • Injectionlll, Lookin, RevealApp, Xcode Preview 등 UI 개발 도구를 활용한 UI 개발
      • 빠른 비즈니스 로직 개발, 실행 및 확인 가능
    • 빨라진 테스트 사이클
  • 코드에서 모듈로 관점 변경
    • 안정적인 모듈 구축
    • 모듈 사용시 예상 가능한 동작
    • 새로운 상품과 기능을 빠르고 쉽게 작성
    • 프로젝트가 안정적인 구조로 개선

앞으로 해야할 것

  • 아키텍쳐 설계 문서 만들기
    • 개발자끼리 경험을 공유하고 아키텍쳐 설계를 논의
  • 모듈의 세분화
    • 앞으로 어떻게 모듈을 만들고 조립할지 좋은 방법을 찾고 적립
  • 모듈의 문서화
    • 문서를 통한 지속적인 관리
  • 데모앱의 지속적인 관리
    • 많은 데모앱을 관리하기 어렵기 때문에 방치될 수 있음
profile
개발을 하며 경험한 것들을 이것저것 작성해보고 있습니다!

0개의 댓글