리액트 네이티브와 웹 공존 문제 해결 접근법
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
앱 개발
대상자
리액트 네이티브와 웹 연동 개발자, 프레임워크 전환 과정에서 애로사항을 겪는 팀
난이도: 중급~고급 (소스코드 이해 및 디자인 패턴 적용 필요)
핵심 요약
- onMessage 기반 통신의 한계:
- onMessage
에서의 무한 분기 처리로 유지보수성 저하
- 양쪽 플랫폼에서 동일한 통신 함수 재선언 필요로 개발 효율성 저하
- 비동기 처리 문제:
- 일방향 통신으로 성공/실패 여부 확인 불가, Promise
구조 도입 필요
- tRPC 영감을 받은 브리지 패턴 도입으로 타입 안전성 및 양방향 통신 가능
- 버전 호환성:
- 앱 스토어 업데이트 지연으로 인한 과거 버전 호환성 문제 해결 방안 제시
섹션별 세부 요약
1. 서비스 배경 및 기존 문제점
- Cordova 기반 서비스 전환 필요성:
- Vue2 기반 웹 앱을 앱 스토어에 배포하기 위해 Cordova 사용
- Lighthouse 점수 저하로 인한 라이브러리 업데이트 필요성
- 리액트 네이티브로의 전환 과정:
- 기존 Vue.js 코드를 WebView로 래핑 후 리액트 네이티브와 공존 구조 확보
- 인앱 브라우저, 네이티브 네비게이션, 공유 데이터 통신 필요성 제기
2. 기존 WebView 통신 방식의 한계
- onMessage 기반 통신:
- postMessage
로 메시지 전송, onMessage
로 처리 (단일 방향)
- 예시 코드:
```javascript
// 웹에서 리액트 네이티브로 메시지 전송
window.ReactNativeWebView.postMessage('openInAppBrowser');
// 리액트 네이티브에서 웹으로 JavaScript 주입
this.webviewRef.injectJavaScript('console.log("Received")');
```
- 문제점:
- onMessage
내 분기 처리로 코드 복잡도 증가
- 동일한 기능이 웹/앱 양쪽에서 재선언 필요
- 비동기 처리 불가로 성공 여부 판단 불가
3. 새롭게 제안된 브리지 패턴
- tRPC 영감을 받은 구조:
- 타입 안전성 보장, 별도 스키마 정의 없이 API 구축 가능
- 서버-클라이언트 구조 모방 (리액트 네이티브: 서버, WebView: 클라이언트)
- 브리지 구현 방식:
- createWebView
에 브리지 주입
- linkBridge
실행 시 openInAppBrowser
등 기능 직접 사용 가능
- Promise 구조로 성공/실패 처리 가능
- 미선언 함수 실행 시 에러 발생으로 안정성 보장
4. 구현 시 고려사항
- 타입 안전성:
- tRPC
의 procedure
선언 방식 도입 (서버/클라이언트 간 타입 동기화)
- 버전 호환성:
- 앱 스토어 업데이트 지연으로 인한 기능 호환성 검증 필요
- 사용자 에이전트 확인 통해 기능 선택적 실행
결론
- 리액트 네이티브와 웹 간 통신 문제 해결:
- onMessage
기반 방식 대신 브리지 패턴 도입
- tRPC 영감을 받은 타입 안전성 및 양방향 통신 구조 확보
- Promise 기반 비동기 처리로 성공/실패 여부 판단 가능
- 실무 적용 팁:
- 기존 코드의 onMessage
분기 처리를 브리지 기반으로 재구성
- 리액트 네이티브에서 WebView 통신 함수 선언 후, 웹에서 해당 함수 직접 사용
- 버전 호환성 검증 로직 추가 (사용자 에이전트 기반 기능 조건 처리)