RN + Native
최근 카카오뱅크, 토스 등 Native 위에 RN(ReactNative)를 얹는 방식으로 개발을 진행하고 있는 회사들이 많이 있다.
왜 이러한 개발 방식을 사용하는거고, 어떤 이점이 있는것일까?
뭐 Cross Platform이니까 개발 공수 감소, UI의 통일성..각자의 여러 이유가 있을 것이라 생각한다.
하지만 내가 생각하는 가장 큰 장점은 CodePush라고 생각한다. 배포는 선물 포장과 같아서 한 번 배포하고 나서 오류를 발견한다면 다시 수정하기가 참 번거롭다.
그런데 이런 배포가 주 단위로 일어나는 활발한 앱들이라면 어떨까? 매일 달라지는 디자인의 이벤트 공지 팝업도 띄워야되고,
오류가 난 Feature가 있을 경우 앱 전체를 정지시킬 순 없으니 기능을 잠시 막아두거나 워닝 메세지를 띄워야 하는 일도 많이 있을것이다.
하지만 이럴때마다 Native에서는 1-2일, 길면 3-4일이 걸리는 앱 심사를 통해 앱을 업데이트하고, 또 사용자가 자동 업데이트를 켜놓지 않았으면 업데이트 버전을 런칭해도 소용이 없는 경우까지 있다.
이런 경우에 CodePush를 통해서 사용자가 앱을 실행함과 동시에 patch를 통해 이러한 부분들을 업데이트 해 줄 수 있는 점이 Native + RN의 가장 큰 장점 아닐까?
그러면 이런 생각이 든다. 그럼 그냥 Native고 RN이고 그냥 PWA (Progressive Web App)을 사용하면 되는거 아니야?
당연히 맞는 말이다. 사실상 모든 OS 플랫폼의 First Party인, WEB을 사용하면 끝나는 문제긴 하다.
하지만 모두가 그렇게 하지 않는 이유는 분명히 있을 것이다.
첫 번째, PWA는 많은 부분이 네트워크 의존적이다. 네트워크 연결이 되어있지 않으면 아예 전체 화면이 나오지 않는 상황도 허다하기 때문에 사용자 경험 측면에서 손해를 볼 수 밖에 없다.
이에 반해 RN은 디바이스에 직접 JS코드를 다운받아서 그리는 형식이기 때문에 이런 불편함에서 조금 벗어날 수 있다고 생각한다.
두 번째, 웹은 웹이다. 모바일을 사용하다보면, 그리고 모바일에서 업데이트되는 많은 기능들. 예를 들면 Bluetooth 연결, FaceID, 카메라 등 여러 모듈간의 상호작용이 필요한 부분이 많은데,
이러한 모듈 존재를 모르고 있는 웹은 한계점이 있을 수 밖에 없다고 생각한다. (RN은 Native 맵핑이기 때문에 어느정도 이러한 모듈 연동이 가능)
세 번째, UI적으로 웹과 앱의 컴포넌트들은 각각 다르게 정의되어있고, 생명주기도 다르게 돌아간다. iOS의 HIG (Human Interface Guidelines), Android의 Material Design이 괜히 있는 것이 아니다.
각 모바일, 웹 환경별로 다른 태생을 가진 이러한 컴포넌트들이 혼재되어 사용되는 순간, 다른 앱을 사용할 때의 사용성과 이질감이 생겨날 것이라고 생각한다.