문제 해결
React Native WebView Process Terminated 대응기
돌핀코딩
2025. 4. 24. 17:13
React Native로 하이브리드 앱을 개발하면서 WebView를 활용하는 경우가 많다.
하지만 iOS 환경에서 특정 페이지를 반복적으로 접근하거나 무거운 리소스를 로드할 때,
예상치 못한 흰 화면(백화) 현상이 발생했다.
에러 로그를 확인해보니 아래와 같은 메시지가 찍혔다.
Webview Process Terminated
onContentProcessDidTerminate triggered
이번 글에서는 이 문제의 원인과 해결 과정을 정리 해볼까한다.
문제 상황
- 환경
React Native WebView 사용
주요 대상: iOS 디바이스 (Android에서는 발생하지 않음) - 현상
- 특정 페이지(WebView로 로드된 지도 화면 등)를 반복 접근
- 갑자기 화면이 흰색으로 멈춤, 백화 현상 발생 (렌더링 중단)
- 콘솔에 Process Terminated 로그 발생
- 초기 대응
WebView의 onContentProcessDidTerminate 콜백 이벤트를 활용해 재로딩 시도
<WebView
source={{ uri: webUrl }}
onContentProcessDidTerminate={(e) => webViewRef.current?.reload()}
ref={webViewRef}
/>
종료된 시점의 화면을 다시 불러오는 콜백 로직 (방어 소스)
임시방편일 뿐 근본적인 해결은 아님
원인 분석
- iOS의 WebView 메모리 관리 정책
- iOS는 WKWebView에서 메모리 사용량이 과도할 경우, 프로세스를 강제로 종료시켜 앱 전체 안정성을 확보함
- 특히 리소스가 무거운 페이지(지도, 대용량 이미지)에서 자주 발생
- React Native WebView 한계
- React Native의 WebView는 기본적으로 네이티브 브릿지를 통해 동작하기 때문에, 자원 누수가 발생할 가능성이 있음
- 페이지 이동 시 캐시, 세션, 히스토리가 적절히 관리되지 않으면 누적 부담
- 반복적인 페이지 접근
- 동일한 WebView 컴포넌트를 계속 마운트/언마운트 하면서 메모리 해제가 원활하지 않은 경우 발생
해결 과정
1. 불필요한 리소스 최소화
- WebView 내에서 사용하는 JS, CSS, 이미지 최적화
- Lazy Loading 적용
- 지도와 같은 무거운 화면은 SPA(Single Page Application) 구조로 유지하고, 새로고침을 줄임
2. WebView 캐시 & 세션 관리
- 화면 전환 시 불필요한 데이터 클리어
useEffect(() => {
return () => {
webViewRef.current?.clearCache(true);
};
}, []);
clearCache() 호출 시 localStorage는 유지되지만, 세션 스토리지와 캐시만 삭제됨
3. onContentProcessDidTerminate 핸들링 강화
- 단순히 reload()만 하지 않고, 사용자에게 안내 메시지 추가
const handleProcessTerminate = () => {
Alert.alert('안내', '페이지가 새로고침됩니다.');
webViewRef.current?.reload();
};
<WebView
source={{ uri: webUrl }}
onContentProcessDidTerminate={handleProcessTerminate}
ref={webViewRef}
/>
4. WebView 재사용 구조 설계
- WebView 컴포넌트를 매번 새로 생성하지 않고, 하나의 인스턴스로 관리
- React Navigation과의 연계 시에도 최대한 Unmount 방지
최종 정리
- 완벽한 근본 해결은 어렵지만, 리소스 최적화 + 캐시 관리 + 사용자 친화적 대응으로 실사용 문제는 충분히 방지 가능
- 특히 WebView를 활용한 앱이라면, 메모리 관리 전략을 초기에 설계하는 게 중요