개인 프로젝트(보물섬_02 : Expo 사용여부 결정하기)

코드위의승부사·2020년 2월 17일
3

보물섬 project

목록 보기
2/3

React Native 프로젝트 진행시 expo vs vanilla React native

개발자로서 수많은 다운로드가 있는 앱을 만든다는건 하나의 꿈이지 않을까?
그 꿈을 이뤄보기 위해 첫걸음을 내딛어본다.
이전에 Expo를 통해서 앱개발을 했었는데 Expo를 사용시에 여러가지 단점이 있다고 들었다.
이 부분을 보다 정확히 알고나서 어떤걸 사용하여 앱을 만들어 나갈지 결정하기로했다.
(아래글은 레퍼런스글에 대한 번역본입니다. 오역이 있을 수 있으니 주의해주세요!)

Expo를 사용한 프로젝트

Expo는 React Native를 사용하여 빠르게 앱을 만들수 있도록 도와주는 하나의 툴체인이다.
개발과 RN app의 테스팅을 수월하게 해주는 여러가지 도구들이 제공되고 UI를 위한 컴포넌트들과 React Native 써드파티 서비스들이 항상 이용가능하다.

Expo의 장점

  • 빠르고 간단한 프로젝트 설치
  • 편리한 Expo CLI 활용(앱 상태, 작동 확인, production/development 모드 변경), Expo서버를 활용한 배포
  • Expo Client를 설치하여 XCode나 안드로이드 스튜디오 없이 개발 진행중에 프로젝트를 확인하고 공유할 수 있다.
  • Expo SDK는 기기 accelerometer, 카메라, 알림, 위치와 같은 기능들을 제공한다.
  • Over the Air : 앱스토어를 통한 재배포 없이 앱을 업데이트 할 수 있다.
  • ios앱을 맥OS없이 개발하고 테스트 할 수 있다.
  • 인증서 와 앱 서명의 자동관리

Expo의 단점

  • Objective-C, Swift, Java, Kotlin으로 만들어진 네이티브 모듈을 추가할 수 없다.
    *(레퍼런스의 레딧글에 따르면 게임, 위치안내, 카메라 관련 앱들과 같이 네이티브 모듈의 사용이 잦은 앱들은 RN에서 모듈 사용 시 문제가 생길 수도 있다고 한다)
  • linking이 요구되는 네이티브 언어로 만들어진 패키지를 사용할 수 없다.
    (https://facebook.github.io/react-native/docs/linking-libraries-ios)
  • 모든 Expo Sdk solutions으로 만들어진 앱의 크기는 매우크다.(Hello World 앱의 크기가 25MB이다...)
  • 드물게 Expo client의 테스트중에서 작동하지만 분리된 앱에서는 특정 문제가 발생할 수 있다.

Expo를 추천하지 않는 이유

위의 단점이 전부는 아니다. 대부분의 문제는 개발과정 마지막 즈음에 발생한다.

제한성

Expo때문에 우리의 능력이 제한된다. 오직 Expo의 SDK와 Js로 쓰여진 패키지(링크를 필요로 하지않는)만 사용할 수 있다.
언젠간 이러한 문제점에 직면하게되고 native 모듈을 사용하길 꺼려지게 된다.(만약 detach가 필요할 경우)
detach는 최고의 방법은 아니고 많은 오류가 생긴다. 많은 시간과 비용의 소비를 가져온다.
만약 detach하게되면, ExpoKit(Expo SDK의 모듈들의 모음)이라는 부분이 프로젝트에 남게된다.
그러나 ExpoKit을 남겨두길 추천하지 않는다. 왜냐면 native code가 문제를 일으켜 디버깅하기를 어렵게 만들기 때문이다.
native module을 정말 필요할 경우 Expo를 포기하고 다른 패키지를 찾는게 낫다.
ExpoKit을 사용하면 QR로 프로젝트를 공유할 수 없고, Expo를 통한 앱 구출 그리고 Over the Air update도 사용할 수 없다. 알림을 위해서는 인증서가 연결되어 있어야 할 것이다.

Expo 인프라에 의존성

가끔 과부하때문에 Expo서버를 사용이 제한되서 앱 개발이 불가능한 경우도 있다. Expo는 이런 의존성을 없애는 업데이트를 계획중이나 아직 완료되지 못했다.(1년전 글이라 확인이 필요할 것 같다.)

특정 React Native 버전에 대한 의존성

Expo는 그들이 사용하는 특정 RN 버전과 묶여있다. 종종 RN의 몇가지 에러가 생기면 수정후 업데이트가 되는데 Expo가 어떤 버전의 RN을 사용할지 결정하기 때문에 수개월을 기다려야 할 수도 있다.
Expo에 대한 버그 또한 몇개월에 한번 릴리즈 된다.

나의 개인적인 의견으로는 Expo는 패키지를 link해야하는 특별한 기능 없이 개발할 경우 올바른 선택이라고 본다.

Expo 없는 프로젝트

장점

  • 다양한 언어로 쓰여진 native 모듈, linking이 필요한 패키지의 사용가능성
  • 어떤 RN 버전을 쓸지 직접 결정

단점

  • macOS없이 iOS를 개발할 수 없음
  • RN으로 시작하거나 Expo에서 RN으로 변경할 경우 많은 시간이 소요

Vanila RN으로 프로젝트를 시작해야 좋을까

Native modules

native modules를 사용하는 패키지를 연결 가능하고 native언어로 쓰여진 네이티브 모듈을 사용할 수 있다.
background 위치 실행을 만들어볼 기회도 있다.
앱을 향상 시켜줄 이미지나 비디오 압축 패키지를 포함한 다른 여러가지 패키지들을 사용할 수 있다.
React Native 버전도 선택할 수 있기 떄문에 최신버전을 사용함으로 새로운 기회를 얻을 수 있다.
게다가 기본 코드를 포크하고 개선점을 추가할 수 있다

React Native Fabric architecture

React Native의 새로운 아키텍쳐를 적용할 수 있다.
Expo가 React Native 버전을 결정하기 때문에 어떤 이슈에 대한 업데이트가 어느정도 시간이 걸릴 수가 있다.

OTA alternative

Expo의 Over the Air(OTA)기능(앱스토어에 추가적인 배포없는 업데이트)는 정말 간편하지만 CodePush라는 더 나은 대안이 있다.
알림을 위해서는 Onesignal 라이브러리를 사용하면 된다.

프로젝트에서 Expo를 사용해야할까?

요구사항들과 어떤 기능을 만들고 싶은지에 따라 다르다.
Expo에 대한 주요 단점들을 적어놨는데 이 단점들이 큰 이슈가 아니라면 엑스포가 올바른 선택지일것이다.
그러나 특정 기능이 필요하고 native 모듈들이 필요하다면 Vanilla RN이 나을것이다.
개인적으로 Expo를 사용하지 않는다면 프로젝트 셋업에 대한 시간이 더 소요될 뿐이다. 패키지 linking의 작동과 Android Studio나 XCode를 통해 셋업 하는 방법을 알고있다면 Expo없이 쉽게 프로젝트 개발이 가능하다.

나의 메모

✅ 특정 기능들을 제공하는 외부의 라이브러리(안드로이드나 xCode의 설정을 요구하는)를 사용해야 할 때 linking이 필요한 경우가 있다.
https://reactnative.directory/
위 사이트에서 특정 라이브러리의 엑스포 지원여부를 알 수 있다.

✅ 1년 3개월전 글이기 때문에 최신내용에 대한 확인이 필요하다. Expo는 지속적으로 발전하기 때문에 네이티브 모듈의 필요성이 줄어들고 있다.

✅ 위의 글과 달리 Expo를 사용하여 프로젝트 진행하는 것에 긍정적인 글도 보았다.
빠르게 초기 설정후 네이티브 모듈이 필요할 경우 eject하는 방법
네이티브 모듈을 직접 만드는 방법

✅ 비슷한 논쟁으로 RN과 네이티브앱의 선택에 대한 논쟁도 있다.
네이티브 모듈이 많이 필요한 앱(예:위치안내앱, 게임, 카메라앱, AR)의 경우 네이티브 앱, 기본적인 CRUD앱은 RN이 적합하다고 한다.

나의 결론

우선 내 앱에서 필요한 기능을 알아봐야하고, 그 기능들을 지원하는 라이브러리가 Expo에서 지원하는지 확인이 필요할 것 같다.
native directory를 잠깐 확인해본 바로는 Expo에서 지원되지 않는 라이브러리를 사용해야 할것 같다.

Reference

profile
함께 성장하는 개발자가 되고 싶습니다.

0개의 댓글