[리액트네이티브] Expo와 Expo Eject

Expo에 대해서 알아보다 보면, Expo는 웹 기반 개발을 하다가 RN을 시작한 개발자들에게는 매우 좋은 여러가지 이점을 제공하는 것을 분명히 알 수 있었다.

장점을 간단하게 정리해보면 Expo를 통해 앱 배포까지 손쉽게 할 수 있고, 네이티브를 조금 더 알아야 하는 AndroidManifest.xml 파일과 같은 설정을 직접안해도 된다는 장점이 있다. 또 Expo Go 앱을 통해서 쉽게 앱을 테스팅할 수도 있다. 이밖에도 여러가지 이유로 React-native 프로젝트로 시작하는 것에 비해서 확실히 개발 시간을 단축할 수 있다는 장점이 있다. 개발자 계정을 통해 signing 해야하는 과정 등도 생략된다.

그리고 Expo에서는 여러가지 API를 제공하고 있고, 해당 API를 통해 폰의 네이티브 기능을 사용할 수도 있다. 하지만 말그대로 Expo에서 제공되는 부분만 사용할 수 있고, Expo에서 지원하지 않는 기능들, 즉 네이티브 라이브러리를 사용하기 위해서는 eject가 필요하다.

그리고 빌드와 배포 또한 따로 번거로운 빌드 작업을 매번 배포해줄 필요 없이 expo에서 배포까지도 손쉽게 도와준다.

1. expo eject란?

expo 프로젝트로 생성한 프로젝트를 expo에서 지원하지 않는 기능을 사용하기 위해 native로 바꾸는 명령어가 바로 expo eject이다. eject를 통해 프로젝트를 엑스포 모바일 클라이언트에서 꺼낼 수 있는데, eject를 할 때 ExpoKit 라이브러리를 남겨놓고 expo에 내장된 다양한 API를 이용하여 네이티브 기능을 비교적 쉽게 이용하게 끔 할 수 있다.

일반 웹 개발자라는 가정하에, eject는 매우 신중하게 결정해야할 작업이다. eject를 하면 expo를 이용할 때는 설정하지 않아도 될 작업들을 매우 많이 설정해주어야 하는데, 난이도가 easy에서 갑자기 hard로 올라가는 작업이라고 할 수 있다. 그렇기 때문에 굳이 eject 해야하는 경우라면, 애초에 native 프로젝트로 진행하는 편이 나을 수 있다.

그렇기 때문에 프로젝트를 시작할 때, 내가 원하는 프로젝트에 필요한 기능들이 무엇인지 생각해보고, 해당 기능들을 전부 expo에서 지원하는지 여부를 파악하는 것이 선제되어야 한다.

2. expo에서 native 라이브러리는 못쓴다..?

expo에서 native 라이브러리를 사용하지 못하는 이유를 알기 위해서는 expo의 동작 환경에 대해서 알아야 한다. expo는 로컬 개발환경에서 두 개 서버를 띄워 동작하는데 expo 모바일 클라이언트에 RN이 번들링한 js파일을 내려주기 위한 서버와, expo-cli와 expo 모바일 클라이언트 둘 사이의 통신을 담당하는 서버를 띄운다. 중요한 것은 작성한 코드가 모바일 네이티브에서 직접 구동되는 것이 아니고 받아진 RN 앱을 엑스포 클라이언트에서 실행시킨다는 것이다.

우리가 expo기반으로 작성한 js 코드는 expo 모바일 클라이언트 안에서만 동작하기 때문에 네이티브 언어로 된 라이브러리는 당연하게 사용할 수 없다. 다만 expo 앱이 네이티브 앱이기 때문에 OS 레이어와의 상호작용이 가능하다. 그렇기 때문에 expo에서 리액트 컴포넌트로 구현해놓은 모듈들을 통해 웹뷰 수준을 넘어 네이티브 기능까지 구현 가능하지만, 그게 expo에서 제공하는 기능 까지에만 국한된다는 단점이 있다. expo에서는 계속하여 새로운 모듈들을 업데이트 하고 있지만, expo에서 지원하지 않는 기능을 사용하기 위해서는 결국은 eject를 하게 되는 경우가 발생한다.

3. eject

결국 eject를 하면 해당 앱은 더이상 expo 클라이언트에서 동작하는 앱이 아닌 네이티브 환경에서 동작하는 앱으로 변경되는 것이다. 내가 구현하려는 서비스가 expo에서 제공하지 않는 네이티브 모듈이 필요하다던가 RN Core를 사용해야하는 경우라면 어쩔 수 없이 eject해야 한다.

그리고 상황에 따라서 eject한 앱을 다시 엑스포 앱으로 변경하는 방법도 있다. 하지만 eject로 인해 소실된 정보를 수기로 다시 세팅해주어야 하기 때문에 손쉬운 작업은 아니라고 할 수 있다.

정리

expo에 대해 정리해보면서 든 생각은 RN 개발 시에 expo의 장점이 너무나도 많다는 것이다. 그렇기 때문에 정말 어쩔 수 없는 상황이 아니고서야 expo 기반으로 개발하는 것이 생산성 측면에서, 훨씬 빠르고 손 쉽게 개발 및 배포 까지 할 수 있다고 생각한다.

그렇기 때문에 RN을 통해 앱 개발을 하기로 했다면 먼저 살펴볼 것은, 내가 개발하려는 프로젝트의 기능을 과연 expo 모듈을 통해 개발할 수 있는지 여부를 살펴보아야 하는 것이다. expo 도큐멘테이션으로 훑어보고 가능하면 expo를 사용하는게 무조건 좋은 방법이라고 생각한다.

그래서 이번에 진행하는 프로젝트도 사실 카카오 맵을 사용이나 다른 네이티브 기능들 때문에 expo로 가능할지에 대한 확신은 들지 않지만, 일단 핵심 기능들을 가능한 expo로 개발한 이후에 혹시 부가 기능 중 또는 핵심 기능 개발 중 eject를 해야할 방법 밖에 없다는 것을 알게되면 그 시점에 eject하는 것을 고려하고 있다. 물론 개발하면서 그러한 시행착오들을 겪겠지만, 그러한 경험도 큰 도움이 될 것으로 생각된다.


출처

  1. React Native : EXPO와 이별하기
  2. expo documentation

Written by@[Ykss]
고이게 두지 않고 흘려보내는 개발자가 되자.

GitHubInstagramLinkedIn