React Native Kakao SDK

image.png

react-native-kakao라는 패키지를 개발하는 중이다.

현재 User모듈이 완료되어서 이미 커뮤니티에 있는 카카오 로그인보다 많은 기능을 제공한다.

Documentation도 패키지 사용에 필요한 내용들을 정리해가며 사용자가 쉽게 쓸 수 있게 작성하고있다.

패키지를 만든 이유는 Documentation 홈페이지에 대략적으로 적어두었다.

패키지의 구성

패키지는 lerna를 이용한 monorepo형식으로 구성되어있다. 이러한 모습은 react-native-firebase의 형태를 많이 모방했다.

지원 범위

사실 만들자 하고 생각하고 3일정도 걸려서 지금까지 설정을 모두 하고 Core, User 패키지를 만들었는데, 지원 범위를 어떻게 할 것인가에 대한 고민이 조금 있었다.

크게 다음과 같은 항목들이 있다. 지금 패키지는 모두 지원하는 형태이다.

  • Old Architecture
  • New Architecture(Turbo Module, Fabric)
  • Expo

사실 Expo는 지원을 안해도 config plugin을 잘 사용하면 쉽게 쓸 수 있지만 이왕 하는거 같이 지원해보자라는 생각으로했고, 사실 Old Architecture를 지원할까 말까 고민을 좀 했다.

코딩을 하며 살펴본 결과 실제 이 프로젝트를 구성해나가는데 병목사항은 Kakao iOS SDK가 Swift만을 지원해서 따로 Objc - Swift 브릿지 코드까지 적어야 해서 꽤나 귀찮다는 점이였고 Old Architecture를 지원해서 얻는 단점이 빌드테스트를 두 번 해야된다는 점 정도 말고는 뚜렷하지 않아 일단 포함시킨 상태이다.

Turbo Module은 최근에 개발했던 React Native Naver Map에서 Fabric을 쓰던것에 비해 Backward Compatibility를 지원하기가 그리 까다롭지 않다고 판단되었다.

그런데, 아쉬운 점은 JSI로 synchronized하게 호출 할 수 있는 API도 Promise를 거쳐서 설계가 되어야 한다는 점인데, Kakao SDK의 특성상 그런건 크게 많지 않으니 괜찮다.

과정

일단 이 패키지를 만드는 과정은 딱히 설명할건 많지 않지만 대략적으로 다음과 같이 진행했다.

React Native Firebase의 구조를 살펴보면서 JS, Android(Gradle), iOS(Pod)에서 각각 의존성 관리가 어떻게 이루어지고 Example app같은건 어떤 방식으로 모노레포 패키지들에 번들러를 이어두었는지 살펴보았다.

Gradle은 스크립트를 만들어서 Package Json의 버전들을 가져와 필요한 버전들을 @react-native-kakao/corepackage.json에 적어두고 가져오는 방식이 되고 Pod도 비슷하게 require json을 통해 진행되어서 비슷하게 Gradle Script를 만들어 진행했다.

또한 Core 모듈에 다른 모듈들이 네이티브적으로는 의존성을 가지고 gradle api, pod dependencies JS에서는 peer dependencies로만 설정을 해주는 방식이였다.

그런데 나는 lerna에서 version을 independent 로 관리하지 않고 한 번에 bump가 되게 모노레포 패키지 구성을 가져가는게 좋다고 생각되었고 아직 js단에서 core 패키지에 의존성이 필요한 일이 없어서 네이티브에서만 각 네이티브 모듈들끼리 의존성을 가지게 해두었다.

그다음 타입스크립트랑 코틀린이랑 스위프트랑 오브젝티브씨랑 정신없이 IDE를 바꿔가면서 브릿지 코드 슉슉 짜가면서 했다. 이 과정은 너무 번거롭다고 느껴질 때가 있다.

그리고 지금 Linter도 Clang Format, Swift Format, ESLint, Prettier, TypeScript까지 벌써 5개가 존재하고 Kotlin에도 달아야될 것 같으니 상당히 곤란하다.

CI를 구축하는 것에 있어서도 생각해보았는데 일단 CI는 PR이 날라오면 검사를 하는 용도로만 사용하고 배포는 내 로컬에서 하는것이 좋을 것 같다.

하지만 CI에서 검사를 하는 것이 Xcode Build와 Gradle Build를 같이 포함하게 한다면 굉장히 오래걸리고 사실 번거로운 작업이 될 것 같아 이 부분은 어떻게 할 지도 고민중이다.

Comments