Upgrade to Pro — share decks privately, control downloads, hide ads and more …

카카오페이 앱 리빌딩 스토리

kakao
December 08, 2022

카카오페이 앱 리빌딩 스토리

#Android

카카오페이앱을 리빌딩하면서 겪은 과정들을 소개해 드리려고 합니다.

발표자 : skyler.shin
카카오페이 안드로이드 주식 서비스 업무를 맡고 있는 스카일러입니다.

eddy.kang
카카오페이 안드로이드 계정 서비스 업무를 맡고 있는 에디입니다.

kakao

December 08, 2022
Tweet

More Decks by kakao

Other Decks in Programming

Transcript

  1. 신문규 Skyler.Shin, 강진호 Eddy.Kang, 이호용 Yong.E 카카오페이 Copyright 2022. Kakao

    Corp. All rights reserved. Redistribution or public display is not permitted without written permission from Kakao. if(kakao)2022 : DI, 모듈화, UI를 중심으로 카카오페이 앱 리빌딩 스토리
  2. 카카오페이 앱 DI 구현 상황 - Koin 라이브러리 사용 -

    쉽게 사용이 가능한 factory, single 함수 사용 빈도가 잦음 - 올바른 scope로 객체가 생성 되었는지 알 수 없음 // 호출할 때마다 객체를 새로 생성 factory { PayPaymentOfflineLocalDataSource() } // 앱 내에 하나의 객체만 생성 single { PayPaymentOfflineLocalDataSource() }
  3. DI를 바꾼다면? Koin Dagger Hilt 실행 Runtime Compile Compile 사용

    현황 카카오페이 앱 카카오톡 / 카카오페이 비즈니스 없음 사용 난이도 (Scope) 중간 중간 매우 쉬움
  4. DI를 바꾼다면? Koin Dagger Hilt 실행 Runtime Compile Compile 사용

    현황 카카오페이 앱 카카오톡 / 카카오페이 비즈니스 없음 사용 난이도 (Scope) 중간 중간 매우 쉬움
  5. Hilt 장점 SingletonComponent @Singleton ActivityRetainedComponent @ActivityRetainedScoped ActivityComponent @ActivityScoped FragmentComponent @FragmentScoped

    ViewWithFragmentComponent @ViewScoped ViewComponent @ViewScoped ServiceComponent @ViewScoped ViewModelComponent @ViewModelScoped
  6. Hilt 도입의 어려운 점 - Custom scope인 경우 hilt의 미리

    정의된 scope와 맞출지 판단 필요 Fragment Fragment Fragment Custom Scope
  7. - Custom scope인 경우 hilt의 미리 정의된 scope와 맞출지 판단

    필요 - Navigation graph scope로 문제 해결 // parent fragment scope val viewModel: PayOfflineViewModel by navGraphViewModels(R.id.payment_offline_graph) // child fragment val parentsViewModel: PayOfflineViewModel by viewModels({requireParentFragment()}) Hilt 도입의 어려운 점
  8. Feature based module :app :money :payment :stock :home :design§system :core

    :util NonïFeature Feature :core :resource :util :widget
  9. Feature based module :app :money :payment :stock :home :design§system :core

    :util NonïFeature Feature :core :resource :util :widget
  10. 화면과 화면 사이 연결하기 - Navigator를 활용해 feature간 activity 실행

    정리 - Dependency graph 최적화 과정 필요 :feature¶payment¶presentation :domain :data :core :design§system :feature¶money¶presentation
  11. 화면과 화면 사이 연결하기 - Navigator를 활용해 feature간 activity 실행

    정리 - Dependency graph 최적화 과정 필요 :feature¶payment¶presentation :domain :data :core :design§system :feature¶money¶presentation
  12. 화면과 화면 사이 연결하기 - Navigator를 활용해 feature간 activity 실행

    정리 - Dependency graph 최적화 과정 필요 :feature¶payment¶presentation :domain :data :core :design§system :feature¶money¶presentation
  13. 화면과 화면 사이 연결하기 - Navigator를 활용해 feature간 activity 실행

    정리 - Dependency graph 최적화 과정 필요 :feature¶payment¶presentation :domain :data :core :design§system :feature¶money¶presentation
  14. 화면과 화면 사이 연결하기 - Navigator를 활용해 feature간 activity 실행

    정리 - Dependency graph 최적화 과정 필요 :feature¶payment¶presentation :domain :data :core :design§system :feature¶money¶presentation
  15. 화면과 화면 사이 연결하기 - Navigator를 활용해 feature간 activity 실행

    정리 - Dependency graph 최적화 과정 필요 :feature¶payment¶presentation :domain :data :core :design§system :feature¶money¶presentation
  16. 화면과 화면 사이 연결하기 - Navigator를 활용해 feature간 activity 실행

    정리 - Dependency graph 최적화 과정 필요 :feature¶payment¶presentation :domain :data :core :design§system :feature¶money¶presentation
  17. Navigator로 Feature 사이 연결 - Activity 실행 기능 - Fragment

    실행 기능 - Scheme 실행 기능 // Activity 실행 navigator.start(this@PayHomeFragment, Direction.NotificationFeed) // Scheme 실행 openSchemeList.collect { navigator.start(activity = this, directionsList = it) }
  18. 모듈화 전 모듈화 후 빌드 시간 10m 48s 9m 32s

    Module 5 37 kotlin line 186628 102138 모듈화 결과 Full build 기준 결과
  19. 모듈화 전 모듈화 후 빌드 시간 10m 48s 9m 32s

    Module 5 37 kotlin line 186628 102138 빌드 시간 변화 Full build 기준 결과
  20. 모듈화 전 모듈화 후 빌드 시간 10m 48s 9m 32s

    Module 5 37 kotlin line 186628 102138 모듈 수 변화 Full build 기준 결과
  21. 모듈화 전 모듈화 후 빌드 시간 10m 48s 9m 32s

    Module 5 37 kotlin line 186628 102138 코드량 변화 Full build 기준 결과
  22. 모듈화 전 모듈화 후 현재 빌드 시간 10m 48s 9m

    32s 21m 45s Module 5 37 122 kotlin line 186628 102138 331325 1.8배 23배 2배 개편 전 그리고 현재 Full build 기준 결과
  23. 더 세분화 된 모듈 :money :app :stock :core :utils :navigator

    :offline :membership Feature :bankAccounts :send :receive :charge
  24. 더 세분화 된 모듈 :money :app :stock :core :utils :navigator

    :offline :membership Feature :bankAccounts :send :receive :charge
  25. 카카오페이 디자인 시스템 Foundation Component Module Template Color Theme Resource

    TypoGraphy . . . Badge Button Chip Checkbox RadioButton . . . AppBar Tab TextField Dialog BottomSheet BridgePage
  26. <com.google.android.material.button.MaterialButton android:id="@+id/btn_success" style="@style/Widget.MaterialComponents.Button.UnelevatedButton" android:layout_width="0dp" android:layout_height="52dp" android:background="@android:color/transparent" android:insetLeft="0dp" android:insetTop="0dp" android:insetRight="0dp" android:insetBottom="0dp"

    android:minWidth="0dp" android:minHeight="0dp" android:padding="0dp" android:text="@string/pay_ok" android:textAppearance="@style/PayApp.Text.Medium.Bold" android:textColor="@color/pay_grey800_daynight" app:backgroundTint="@color/pay_grey200_daynight" app:backgroundTintMode="src_atop" app:cornerRadius="0dp" app:rippleColor="@color/pay_grey300_daynight" /> Case1. 디자인 시스템 도입 전 버튼 활용 예시 필요에 따라 일부 Style 및 attribute로 작성
  27. - Color - Size - Typography <com.google.android.material.button.MaterialButton android:id="@+id/btn_success" style="@style/Widget.MaterialComponents.Button.UnelevatedButton" android:layout_width="0dp"

    android:layout_height="52dp" android:background="@android:color/transparent" android:insetLeft="0dp" android:insetTop="0dp" android:insetRight="0dp" android:insetBottom="0dp" android:minWidth="0dp" android:minHeight="0dp" android:padding="0dp" android:text="@string/pay_ok" android:textAppearance="@style/PayApp.Text.Medium.Bold" android:textColor="@color/pay_grey800_daynight" app:backgroundTint="@color/pay_grey200_daynight" app:backgroundTintMode="src_atop" app:cornerRadius="0dp" app:rippleColor="@color/pay_grey300_daynight" /> Case1. 디자인 시스템 도입 전 버튼 활용 예시 필요에 따라 일부 Style 및 attribute로 작성
  28. CustomView + Style으로 간단하게 구현 가능 Case1. 디자인 시스템 도입

    전 버튼 활용 예시 <com.kakaopay.fit.button.FitButton android:id="@+id/btn_success" android:layout_width="match_parent" android:layout_height="52dp" android:text="@string/pay_ok" style="@style/Widget.Fit.FitButton.Primary" />
  29. Case 2. 확장성이 고려되지 않은 Custom View 특정 상황에 맞추어

    개발이 되어 있음 기능 추가 또는 수정이 어려움 확장성이 낮다보니 새로운 View 개발
  30. 기존 방식의 한계점 - Background 색상이 달라지면, System Bar 색상도

    변경해주어야 함 - 휴먼 에러 발생 확률이 높음 / / StatusBar 색상 변경 setStatusBarColor(R.color.Red) / / NavigationBar 색상 변경 setNavigationBarColor(R.color.Red)
  31. ViewGroup 확장하기 ViewGroup ViewCompat.setOnApplyWindowInsetsListener(view) { view, insets -> val systemInsets

    = insets.getInsets(WindowInsetsCompat.Type.systemBars()) view.setPadding( top = view.paddingTop + systemInsets.Top, bottom = view.paddingBottom + systemInsets.bottom ) }
  32. ViewGroup 확장하기 ViewGroup ViewCompat.setOnApplyWindowInsetsListener(view) { view, insets -> val systemInsets

    = insets.getInsets(WindowInsetsCompat.Type.systemBars()) view.setPadding( top = view.paddingTop + systemInsets.Top, bottom = view.paddingBottom + systemInsets.bottom ) }
  33. ViewGroup 확장하기 ViewGroup ViewCompat.setOnApplyWindowInsetsListener(view) { view, insets -> val systemInsets

    = insets.getInsets(WindowInsetsCompat.Type.systemBars()) view.setPadding( top = view.paddingTop + systemInsets.Top, bottom = view.paddingBottom + systemInsets.bottom ) }
  34. ViewGroup 확장하기 ViewCompat.setOnApplyWindowInsetsListener(view) { view, insets -> val systemInsets =

    insets.getInsets(WindowInsetsCompat.Type.systemBars()) view.setPadding( top = view.paddingTop + systemInsets.Top, bottom = view.paddingBottom + systemInsets.bottom ) }
  35. Action Items 1. 모듈 세분화 2. 빌드 시간 개선 3.

    Compose 기반 디자인 시스템 개발