objective-C 와 swift 공부를 react native 로 했어요! NativeModule 과 RCTBridge

반응형

 

React Native 는 React 의 철학 중 Learn once, Write everywhere 에 맞게 모바일 앱 개발에 있어서도 View 단의 라이브러리를 제공하고 이를 중간에서 연결해주는 브릿징 기술을 제공한다. React Native 는 Android 와 iOS 의 네이티브 모듈의 기능을 가져와 사용할 수 있다. (다른 OS 도 가능하다) 이러한 기능을 제공하는 것이 NativeModules 이며 이는 iOS 에서는 RCTBridgeModule 이라는 프로토콜을 구현한 Objective-C 클래스이다. 아직 타입이라던가 지원이 잘 안되는 네이티브 기능들도 있는데 TurboModules 라는 것이 나오게 되면 개선될 것이라 한다. 업그레이드에 대비하자. 현재는 React Native 의 경우 android 는 java , iOS 는 Objective-C 기준이다.

 

Calendar Manager 를 NativeModules 로 구현한 React Native 공식 홈페이지의 사례.

https://reactnative.dev/docs/native-modules-ios

==> 번역된 글

https://devh.kr/2020/Native-Modules-iOS/

실제 Firebase Analytics 모듈을 NativeModules 로 구현한 사례.

http://blog.cowkite.com/blog/2004271123/

 

React Native 쪽에서 aes 양방향 대칭키 암호화 라이브러리를 찾던 중 굉장히 간단히 깔끔하게 구현된 소스를 발견하였다.

react-native-aes-crypto (https://github.com/dmk3141618/react-native-aes) 나의 깃헙에 포크하였다.

aes 는 aes-256-cbc 를 구현해놨다.

 

React Native 에서 원하는 기능을 하는 안정적인 네이티브 모듈이 없을 경우 직접 만들어야 할 경우 현재는 java 언어 기준 android 와 objective-c 기준 ios 개발 쪽을 학습해야 한다. 이 둘을 모두 다루는 것은 어려울 수 있어 우선 ios 쪽만 생각한다. ios 의 object-c 언어 중심으로 위와 같이 NativeModules 를 구현하는 식으로 연동하는 개발을 할 경우 일반적인 ios 개발만을 하는 것보다 더욱 고차원적으로 ios 개발에 빨리 다가갈 수 있는 장점도 있다. 물론 요즈음 swift 언어가 거의 표준이지만 조만간 이도 연동될 것이라 본다. 사실 현재도 swift 로 작성된 네이티브 모듈을 RN 으로 브릿징이 가능하다. https://dev.to/akinncar/how-to-use-swift-in-your-react-native-app-46mj 코틀린도 가능할 것 (https://bitfrit.com/writing-a-native-module-for-react-native-using-kotlin/)이다. 단지 기본적으로 RN 이 c++ 만들어졌고 이를 swift 와 interop 하는 것은 아직 거의 불가능해서 object-c 로 계속 진행을 하며 또한 objective-C 기반으로 작성된 것이 많기 때문에 RN 의 core 에서 직접 swift 와 연동되도록 지원하는 것을 만들 계획도 앞으로 없다고 한다. 다음 코어 아키텍처인 TurboModule 에서도 type 자동 생성과 UI 쓰레드와의 분리 등이 계획되어 있는데 type 자동 생성에 있어서도 swift 를 지원하지는 않을 계획이라고 한다. 이유는 c++ 로 만들어졌기 때문이며 c++ 과 swift 의 interop 할 수 있는 것을 작성하기가 거의 불가능하다고 한다. 하지만 결국 objective-c 를 통해서 swift 의 메소드와 브릿징 해주면 되기 때문에 swift 를 사용할 수 있다. 단지 기본적으로 RN 와 연동되는 것은 objective-c 일 뿐이다. 

 

How to use Swift in your React Native app

In this post, we will integrate a React Native app with share on social media feature on iOS using...

dev.to

 

RN 의 다음 코어 엔진 구조인 TurboModule

https://github.com/react-native-community/discussions-and-proposals/issues/40#issuecomment-463968708

https://github.com/facebook/react-native/issues/31469

0.64 버전부터 서서히 반영될 것이라 한다. 지금이 0.64 이니 좀 있으면 곧 반영될 것 같다.

https://github.com/react-native-community/discussions-and-proposals/issues/92

네이티브와 JS 브릿징에서 자동으로 타입 코드를 만들어주는 그래서 자동화할 수 있는 것을 TurboModule 에 반영할 계획이라 한다.

 

Flutter 는 swift, kotlin 도 공식적으로 지원하는 듯 하다. 그래도 Flutter 보다 RN 이 좋아보인다. RN 도 안되는 것이 아니다. 기본이 objective-C 일 뿐.

https://flutter-ko.dev/docs/development/platform-integration/platform-channels

 

그냥 android 와 ios 를 각각 개발하면 안되겠냐고 생각할 수도 있겠지만 각각 네이티브로 만들 경우 5명 이상의 개발자를 안정적으로 수년간 고용할 여건이 되지 않는다면 시도하지 않는 것이 좋다고 생각한다. 따라서 React Native 를 사용한 개발이 현실적이다. Flutter 나 Ionic, Xamarin 등은 모두 사용해보았지만 큰 의미가 없다. 특히나 Learn once, Write everywhere 가 매우 중요하다. 웹의 생태계까지도 생각하면 다른 기술들을 사용할 바엔 그냥 각각의 네이티브로 개발하는 것이 좋다.

 

각각의 네이티브들은 아직도 MVC 기준 개발이 이루어지는 듯 보이고 이러한 개발 방식에 고급 개발자 수준이 되면 함수형 개발방법을 고려해 줄 수 있을 것이다. 이 정도 수준의 개발을 진행하려면 연봉이 꽤나 높은 개발자 몇명이 필요할 것이다. React Native 는 React 진영의 기술을 그대로 사용한다. 때문에 Redux 및 Component 같은 함수형 개발 방법론을 기본으로 하며 UI 쪽 개발에 이러한 방향의 개발은 매우 중요하다. 사실 쓰레드 기반으로 앱 개발을 한다면 분명히 차후 유지보수에 문제가 많이 생길 것이며 시간이 가면 갈 수록 앱의 안정성이 떨어져 서비스에 실패할 가능성이 높아진다. 이러한 개발 측면에 있어서도 React Native 를 사용하면 각각의 네이티브에서 개발할 경우 고려되어야 할 매우 고차원적인 수준의 개발 방법론을 애초에 적용하여 개발할 수 있게 된다.

 

React 기술은 UI 개발에 있어서는 현존 세계 최고의 기술이라고 생각한다. 그리고 React Native 에서 Component 및 flex layout 기반의 UI 구성의 생산성은 각각의 네이티브로 UI 를 만들 때와 비교하면 10배 이상의 생산성 차이가 있다고 생각한다. 웹과의 기술적인 통일성까지 고려할 경우 20배도 넘는 차이라고 본다.

 

React 웹 개발도 가능하지만 React Native 를 기본으로 하며 iOS 개발 정도까지의 범위를 생각하는 것이 좋아보인다.

 

개인적으로는 java 개발을 좀 했었기에 Android 와 좀 더 친숙할 수 있지만 iOS 의 개발 생태계가 더욱 좋아보인다. 그렇지만 iOS 쪽의 개발언어들은 매우 어려운 언어임에는 틀림없다. 궁극적으로는 Apple 쪽의 개발을 자유자재로 할 수 있는 사람이라면 컴퓨터를 못 할 것이 거의 없을 것이다. 하지만 언어가 매우 어려운 것은 맞다. 새로운 기술도 가장 먼저 적용되는 언어이기도 하다. 

 

반응형

댓글

Designed by JB FACTORY