스타트업 1인 개발자의 생각
앞에 썼던 글들이 모두 이 주제를 이야기하기 위한 포석이었다는 생각이 든다. 하이브리드 앱을 도입하기로 한 건 회사에 막대한 영향을 미치는 선택이었기에 여전히 옳은 선택이었을까 싶다. 그래서 나를 계속 설득하는 과정이 필요했고 앞선 브런치 글들의 뿌리는 결국 이 최종 선택을 스스로 합리화하는 것이었다. 이제 고민의 결과를 정리하는 시간만 남아있다.
우선 하이브리드 앱 도입을 하기 전 현 상황을 명확하게 파악할 필요가 있었다. 기존의 놀담은 선생님, 학부모가 하나의 앱을 같이 사용했지만 이로 인해 여러 가지 불편함이 생겼고 결국 선생님용 앱을 따로 분리하기로 했다.
어플리케이션을 하나 더 개발해야 했고 그러면 또 안드로이드, iOS 각각 따로 개발해서 총 2개의 프로젝트를 더 진행해야 했다. 그리고 기존의 앱도 선생님용 앱과 분리시켜서 완전히 학부모만을 위한 사용자 경험을 주기 위해 대대적인 업데이트를 진행할 계획을 세웠다. 거의 새로운 어플로 만들 생각이므로 결국 총 4개의 프로젝트를 새로 진행해야 하니 앞이 까마득했다.
결국 다음의 선택을 강요받은 상황이 되었다.
1. 안드로이드 개발자 구인
2. 네이티브를 버리고 하이브리드앱이나 웹앱으로 전환
처음엔 1번을 택했지만 당장 개발자를 구해야 한다는 점과 인건비라는 벽이 있었고 이후에도 총 4개의 프로젝트를 유지 보수해야 한다는 단점도 있었다. 2번을 선택해야 했지만 하이브리드와 웹앱이 퀄리티가 떨어질 거라는 편견에 쉽게 결정을 내리지 못하고 있었다. 그러다 우연히 ReactNative를 접하게 되었고 상상 이상의 퀄리티와 크로스 플랫폼이라는 효율에 에 한눈에 반해버렸다. 당장 ReactNative와 다른 하이브리드 앱 프레임워크에 관해 알아보았고 결국 ReactNative를 도입하기로 결정했다.
자마린은 우선 배제하였고 Ionic과 ReactNative 중에서 선택해야 했지만 한치 망설임도 없이 ReactNative로 선택했다. 이유는 다음과 같다.
1. 패스트캠퍼스에서 ReactJS를 배운 경험이 있어 진입장벽이 높지 않았다.
2. 아이오닉에 비해 성능이 좋다는 평가가 많았고 AngularJS를 배우기에는 시간이 부족했다.
네이티브를 버리는 건 매우 아쉬운 선택이긴 했지만 ReactNative는 최소의 비용으로 좋은 성능의 앱을 만들려는 목표에 가장 적합하다고 판단하였다. 바로 공부를 시작했고 현재 선생님 프로젝트를 ReactNative로 개발 중이다.
공부를 시작하고 개발을 한 지 1개월 반 정도 지난 지금 다시 한번 ReactNative를 돌아보며 느낀 점들을 적어볼 생각이다. ReactNative에 흥미가 생겼거나 도입을 고민 중인 분들에게 이 글이 아주 조금이라도 선택에 영향을 줄 수 있다면 좋겠다. 기본적인 ReactNative의 스펙이나 성능 비교보다는 직접 개발하며 느낀 점들에 집중하겠다.
굉장히 빠르다. create-react-native-app을 이용하면 알아서 세팅을 다 해주고 라이브 리로드(코드가 변경되면 앱에서 바로 리로드)로 인해 개발 효율이 아주 높다. 심지어 더 빠른 핫 리로드도 있다. JavaScript 하나로 iOS와 안드로이드를 둘 다 커버할 수 있어 각각 따로 개발하는 것에 비하면 정말 빠르다. 혁신적이다.
웹 프론트의 flex 방식을 사용하기 때문에 flex만 잘 안다면 레이아웃은 순식간에 만들 수 있다. 혹시라도 flex 방식이 익숙하지 않다면 flexboxfroggy.com를 추천한다. 이거 하나로 flex는 완벽하게 이해할 수 있다.
하나의 컴퍼넌트로 iOS와 Android 구분 없이 사용할 수 있고 OS의 차이로 인해 생기는 약간의 차이는 Platform.OS === "ios" ? A : B 이 한 줄로 쉽게 구분 지을 수 있는 경우가 많다.
나는 나름 네이티브 앱 퀄리티에 부심을 갖고 있었고 하이브리드 앱이나 웹앱의 UI나 반응속도가 네이티브에 한참 못 미칠 거라 생각했다. 근데 ReactNative는 전혀 하이브리드 앱 같은 느낌을 주지 않았다. 사용자 경험이 거의 네이티브 앱에 가까웠다. 사용자 경험으로 네이티브에 견줄 수 있다는 건 엄청난 장점이다.
아... 어렵다. 처음엔 정말 어렵다. 패스트캠퍼스가 아니었다면 React 자체를 공부할 수 없었을 것이다. 사실 뭔가를 배우는 것에 큰 어려움이 없었고 잘 배운다고 자부했었는데 React는 확실히 어려웠다. 내가 그동안 해오던 방식과 너무 달랐다. 가장 어려웠던 건 Redux 구조와 데이터를 주고받는 방식이었다. 기존에는 하나의 데이터가 인스턴스와 함께 생성되고 소멸되기에 화면 간 데이터 전송을 하기 위해 인텐트를 사용하거나 뷰 컨트롤러 인스턴스를 생성하여 전달해왔다. 그런데 Redux는 state, action, dispatch 등을 이용하여 전혀 다른 방식으로 데이터를 관리한다. 나에게 있어 기존의 패러다임을 완전히 바꿔버려야 했기에 쉽지 않았다.
하이브리드앱은 태생적으로 앱만을 위해 만들어진 네이티브에 비해 성능이 떨어질 수밖에 없다. 컴퍼넌트가 많지 않을 때는 티가 나지 않지만 화면이 조금 복잡하면 확실히 성능의 저하를 체감할 수 있다. 컴퍼넌트를 따로 최적화해주는 추가 작업이 필요하다.
구글링을 해보니 iOS의 경우 네이티브에 비해 성능이 크게 떨어지지 않지만 안드로이드 경우는 아직 많이 부족하다는 의견이 많다. 실제로 만들어봐도 안드로이드가 iOS에 비해 느리거나 뭔가 2% 부족하다. ReactNative가 점점 더 발전해가길 기대하는 수밖에.
레퍼런스가 정말 부족하다. 높은 러닝 커브에 한몫하는 단점이다. 에러의 원인을 찾는 건 괜찮은 편이지만 구조에서 오는 궁금증은 해결하기가 어렵다. 예를 들어 create-react-native-app을 이용하여 앱을 만든 경우 expo를 이용하여 앱을 실행시킬 수 있다. 그럼 기존의 방식처럼 기기에 아이콘을 갖는 하나의 독립적인 앱으로 테스트해보고 싶다면 어떻게 해야 할까? iOS 프로젝트와 안드로이드 프로젝트를 연동해서 이러쿵저러쿵 뭔가를 해야 하는데 이게 참 쉽지가 않다. 공식 홈페이지에 매뉴얼이 있고 가이드도 많지만 아무리 해도 되지를 않았다. 그러다 잘 찾아보니 eject를 했어야 했다. 그럼 eject를 하고는 어떻게 관리를 하는 게 좋을까? 검색하기도 애매하고 이런 과정을 체험해보고 남긴 후기도 찾아보기 어렵다. 카카오나 네이버 API 연동은 어떻게 해야 할까? 레퍼런스가 부족하니 이런 궁금증을 해결하기가 정말 어렵다.
이건 장점일 수도 단점일 수도 있다. 페이스북이나 카카오톡 로그인을 연동하려 하니 필연적으로 네이티브 프로젝트와의 상호작용이 필요했다. 이 경우 난 네이티브를 개발했던 경험이 충분했기에 iOS와 안드로이드 각각에 필요한 작업을 쉽게 할 수 있었다. 하지만 모바일 프로그래밍을 처음부터 ReactNative로 한다면 이런 점에서 어려움을 겪을 것이다. ReactNative에서 소화할 수 없는 기능들을 네이티브 모듈로 만들어서 사용할 수 있는데 이런 점은 네이티브 개발이 가능하다면 장점이지만 아니라면 단점인 양날의 검이다.
ReactNative는 정말 좋다. 효율적인 개발과 동시에 퀄리티도 챙길 수 있다. 이미 이 글은 ReactNative에 빠져 한쪽으로 치우친 글이 되었고 마무리도 그러할 것이다. 난 ReactNative의 도입을 적극 추천한다. 물론 더 개발하다 보면 여태껏 느끼지 못했던 어려움들이 있을 것이고 그때 가서 생각이 달라질 수도 있지만 그럴 확률은 낮아 보인다. 심지어 웹도 ReactJS를 사용하여 관리하여 스펙을 React 하나로 통일할 계획에 있고 이로 인해 유지보수의 효율성도 매우 높아질 예정이다.
다만! 나의 경우에 그렇다는 것이다. 적지 않은 돈을 투자하여 미리 React를 접할 수 있었다는 점과 iOS, 안드로이드 개발 경험이 있었기 때문이다. 만약 이 글을 읽고 있는 당신이 JavaScript에 익숙하지 않거나 React를 배워본 경험이 없는데 ReactNative로 앱 개발을 하고 싶다면 다시 한번 생각해보라 말하고 싶다.
반면 자신이
1. JavaScript 문법에 익숙하고
2. React를 접해봤거나 교육받을 기회가 있거나,
3. iOS나 안드로이드 둘 중 하나라도 개발해봤고 모바일 프로그래밍에 익숙해진
사람이라면 절대 망설이지 말고 도입해보기를 권한다.