React Native 0.70 업그레이드 후 Hermes 엔진 적용기

배경

사내 React Native 앱이 0.66 버전에서 멈춰있었다. 0.70이 stable로 나온 지 2개월 정도 지나서 업그레이드를 진행했다. 이번 버전부터 iOS도 Hermes가 기본 엔진이 되어서 함께 적용했다.

주요 변경사항

Android Hermes 활성화

기존에는 android/app/build.gradle에서 설정했는데, 0.70부터는 gradle.properties에서 관리한다.

hermesEnabled=true

iOS Hermes 적용

iOS는 Podfile에서 설정을 제거하면 자동으로 Hermes가 적용된다.

# 기존 JSC 사용 설정 제거
# :hermes_enabled => true # 이제 기본값

발생한 문제들

1. Intl API 이슈

Hermes는 Intl polyfill이 필요하다. Date.toLocaleString() 사용하는 부분에서 런타임 에러가 발생했다.

// index.js 최상단에 추가
import '@formatjs/intl-getcanonicallocales/polyfill';
import '@formatjs/intl-locale/polyfill';
import '@formatjs/intl-pluralrules/polyfill';

2. Proxy 객체 동작 차이

MobX를 사용하는 부분에서 Proxy 객체 동작이 JSC와 약간 달랐다. observable 객체를 직접 비교하는 로직을 수정했다.

// Before
if (storeA === storeB) { ... }

// After
if (toJS(storeA) === toJS(storeB)) { ... }

3. Flipper 충돌

Hermes와 Flipper 버전 호환 문제가 있어서 Flipper를 최신 버전으로 업데이트했다.

성과

  • Android APK 크기: 42MB → 38MB (약 10% 감소)
  • iOS 앱 시작 시간: 약 15% 단축
  • JavaScript 실행 속도: 체감상 개선

결론

Hermes 마이그레이션은 생각보다 순조로웠다. Intl polyfill만 제대로 추가하면 대부분의 앱에서 큰 문제 없이 적용 가능할 것으로 보인다. 성능 개선 효과가 명확해서 만족스러웠다.