๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

React Native Hermes๋ฅผ ์ ์šฉํ–ˆ๋Š”๋ฐ Codepush ๋ฐ›๊ณ  ์™œ ๋А๋ ค์ง€์ง€?

by LasBe 2026. 2. 25.
๋ฐ˜์‘ํ˜•

๐Ÿ“’ Hermes๋ฅผ ์ ์šฉํ–ˆ๋Š”๋ฐ Codepush ๋ฐ›๊ณ  ์™œ ๋А๋ ค์ง€์ง€?


React Native ์•ฑ์— Hermes๋ฅผ ์ ์šฉํ•˜๊ณ  ๋‚˜์„œ ์ฝœ๋“œ ์Šคํƒ€ํŠธ(cold start)๊ฐ€ ํ™•์‹คํžˆ ๋นจ๋ผ์กŒ๋‹ค๊ณ  ๋А๊ผˆ๋Š”๋ฐ, CodePush ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฐ›๊ณ  ๋‚˜์„œ ๋ญ”๊ฐ€ ์˜ˆ์ „์ฒ˜๋Ÿผ ๋А๋ ค์ง„ ๊ฒƒ ๊ฐ™์€ ๊ธฐ๋ถ„์ด ๋“œ๋Š” ๊ฒ๋‹ˆ๋‹ค.

 

ํ”Œ๋ผ์‹œ๋ณด์ธ๊ฐ€ ์‹ถ์—ˆ์ง€๋งŒ ๊ทธ๋ƒฅ ๋„˜๊ธฐ๊ธฐ์—” ์ฐœ์ฐœํ•ด์„œ ๋ฐ”๋กœ ํŒŒ๋ดค์Šต๋‹ˆ๋‹ค.

 

๐Ÿ“Œ Hermes๊ฐ€ ์™œ ๋น ๋ฅธ๊ฐ€

Hermes ์—”์ง„์€ Meta์—์„œ React Native๋ฅผ ์œ„ํ•ด ๋งŒ๋“  JavaScript ์—”์ง„์ž…๋‹ˆ๋‹ค.

 

๊ธฐ์กด JavaScriptCore(JSC)์™€์˜ ๊ฒฐ์ •์ ์ธ ์ฐจ์ด๋Š” ๋นŒ๋“œ ์‹œ์ ์— JS ์ฝ”๋“œ๋ฅผ ๋ฏธ๋ฆฌ ๋ฐ”์ดํŠธ์ฝ”๋“œ(Bytecode)๋กœ ์ปดํŒŒ์ผํ•ด ๋‘”๋‹ค๋Š” ๊ฒ๋‹ˆ๋‹ค.

 

์•ฑ ์‹คํ–‰ ์‹œ JS ํŒŒ์‹ฑ·์ปดํŒŒ์ผ ๊ณผ์ •์„ ๊ฑด๋„ˆ๋›ฐ๊ณ  ๋ฐ”๋กœ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฝœ๋“œ ์Šคํƒ€ํŠธ๊ฐ€ ๋นจ๋ผ์ง‘๋‹ˆ๋‹ค.

 

๋Ÿฐํƒ€์ž„์— ํ•  ์ผ์„ ๋นŒ๋“œ ํƒ€์ž„์— ๋ฏธ๋ฆฌ ํ•ด๋‘๋Š” ๊ฑฐ์ฃ .

 

๐Ÿ“Œ CodePush ํ›„ ๋ญ”๊ฐ€ ์ด์ƒํ•˜๋‹ค

Hermes์˜ ๋น ๋ฆ„์€ ๊ฒฐ๊ตญ ๋ฐ”์ดํŠธ์ฝ”๋“œ ๋ฒˆ๋“ค์—์„œ ๋‚˜์˜ต๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿฐ๋ฐ ์ฝ”๋“œ ํ‘ธ์‹œ(CodePush)๋กœ ์—…๋ฐ์ดํŠธ๋œ ๋ฒˆ๋“ค์ด ๋ฐ”์ดํŠธ์ฝ”๋“œ๊ฐ€ ์•„๋‹Œ ์ผ๋ฐ˜ JS ํ…์ŠคํŠธ๋ผ๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”.

 

์ƒํ™ฉ์„ ์ •๋ฆฌํ•˜๋ฉด ์ด๋ ‡์Šต๋‹ˆ๋‹ค.

  • ์•ฑ ์ตœ์ดˆ ์„ค์น˜: APK ๋‚ด๋ถ€์— Hermes ๋ฐ”์ดํŠธ์ฝ”๋“œ ๋ฒˆ๋“ค ํฌํ•จ → ๋น ๋ฆ„
  • CodePush ์—…๋ฐ์ดํŠธ ์ดํ›„: JS ํ…์ŠคํŠธ ๋ฒˆ๋“ค๋กœ ๊ต์ฒด → Hermes ์ด์  ์‚ฌ๋ผ์ง

Hermes๋ฅผ ๊ณต๋“ค์—ฌ ์ ์šฉํ•ด ๋’€๋Š”๋ฐ, CodePush ํ•œ ๋ฒˆ์— ํšจ๊ณผ๊ฐ€ ๋‚ ์•„๊ฐ€๋Š” ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค.

 

๐Ÿ“Œ ๋ฒˆ๋“ค ํƒ€์ž… ์ง์ ‘ ํ™•์ธํ•˜๊ธฐ

์ถ”์ธก์œผ๋กœ ๋๋‚ด์ง€ ์•Š์œผ๋ ค๋ฉด ๋ฒˆ๋“ค ํƒ€์ž…์„ ์ง์ ‘ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

iOS๋Š” ํŒŒ์ผ ์‹œ์Šคํ…œ ์ ‘๊ทผ์ด ์ œํ•œ์ ์ด๋ผ ๋ฒˆ๋“ค์„ ๊บผ๋‚ด ๋ณด๊ธฐ๊ฐ€ ๊นŒ๋‹ค๋กญ์ง€๋งŒ, Android๋Š” APK๋ฅผ ์••์ถ• ํ•ด์ œํ•˜๊ฑฐ๋‚˜ adb shell๋กœ ๊ธฐ๊ธฐ์— ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์–ด ํ™•์ธ์ด ํ›จ์”ฌ ์‰ฝ์Šต๋‹ˆ๋‹ค.

 

Android ๊ธฐ์ค€์œผ๋กœ ๋‘ ๊ฐ€์ง€๋ฅผ ๋ดค์Šต๋‹ˆ๋‹ค.

 

APK์— ๋“ค์–ด์žˆ๋Š” ๊ธฐ๋ณธ ๋ฒˆ๋“ค๊ณผ, CodePush๊ฐ€ ๋‚ด๋ ค๋ฐ›์€ ๋ฒˆ๋“ค.

 

๐Ÿ”Ž ๋ฒˆ๋“ค ํŒŒ์ผ ์ง์ ‘ ํ™•์ธ

์šฐ์„  ํƒ€์ž… ํ™•์ธ ์ „ ๋ฒˆ๋“ค์„ ์ง์ ‘ ์ฝ์–ด ๋ณธ๋‹ค๋ฉด ์–ด๋–ค ๋ชจ์–‘์ผ์ง€ ๊ถ๊ธˆํ•ด ๋น„๊ตํ•ด๋ดค์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋ƒฅ ๋”ฑ ๋ด๋„ ๊ตฌ๋ถ„์ด ๋˜์ฃ ?

 

  • JS ๋ฒˆ๋“ค

 

  • ๋ฐ”์ดํŠธ์ฝ”๋“œ ๋ฒˆ๋“ค

 

๊ทธ๋Ÿผ ์ด์ œ ๋ฒˆ๋“ค์„ ์ง์ ‘ ํ™•์ธํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

๐Ÿ”Ž APK ๋ฒˆ๋“ค ํ™•์ธ

APK ํŒŒ์ผ์ด ์žˆ๋Š” ๊ฒฝ๋กœ์—์„œ ์••์ถ•์„ ํ’€์–ด์ค๋‹ˆ๋‹ค.

$ unzip app-release.apk

์••์ถ•์„ ํ’€๋ฉด assets/index.android.bundle์ด ๋ฒˆ๋“ค ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. file ๋ช…๋ น์–ด๋กœ ํƒ€์ž…์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

$ file assets/index.android.bundle

๊ฒฐ๊ณผ๋Š” ์•„๋ž˜ ๋‘˜ ์ค‘ ํ•˜๋‚˜๋กœ ๋‚˜์˜ต๋‹ˆ๋‹ค.

 

  • Hermes JavaScript bytecode, version 96 → Hermes ๋ฐ”์ดํŠธ์ฝ”๋“œ (์ •์ƒ)
  • ASCII text → ์ผ๋ฐ˜ JS ๋ฒˆ๋“ค

๊ธฐ๋ณธ ๋ฒˆ๋“ค์ด ๋ฐ”์ดํŠธ์ฝ”๋“œ๋กœ ๋‚˜์˜จ๋‹ค๋ฉด Hermes ์„ค์ • ์ž์ฒด๋Š” ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿผ ๋‹ค์Œ์€ CodePush ๋ฒˆ๋“ค์„ ํ™•์ธํ•  ์ฐจ๋ก€์ž…๋‹ˆ๋‹ค.

 

๐Ÿ”Ž ๊ธฐ๊ธฐ์— ๋‚ด๋ ค๋ฐ›์€ CodePush ๋ฒˆ๋“ค ํ™•์ธ

CodePush ๋ฒˆ๋“ค์€ ๊ธฐ๊ธฐ ๋กœ์ปฌ์— ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— adb shell๋กœ ์ง์ ‘ ์ ‘๊ทผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

์ ‘๊ทผํ•˜๋ ค๋ฉด ์•ฑ์ด debuggable ๋ชจ๋“œ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. android/app/src/main/AndroidManifest.xml์„ ์ˆ˜์ •ํ•œ ๋’ค ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค.

<application
    ...
    android:debuggable="true"
>

๋นŒ๋“œ ํ›„ ์‰˜๋กœ ์ ‘๊ทผํ•ฉ๋‹ˆ๋‹ค.

$ adb shell
$ run-as com.yourapp.package
$ cd /data/user/0/com.yourapp.package/files/CodePush/{ํ•ด์‹œ๊ฐ’}/CodePush
$ file index.android.bundle

๊ฒฝ๋กœ์˜ ํ•ด์‹œ๊ฐ’์€ ๋ฒˆ๋“ค๋งˆ๋‹ค ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

 

์—ฌ๊ธฐ์„œ ASCII text๊ฐ€ ๋‚˜์˜จ๋‹ค๋ฉด CodePush๊ฐ€ Hermes ๋ฐ”์ดํŠธ์ฝ”๋“œ๊ฐ€ ์•„๋‹Œ JS ๋ฒˆ๋“ค์„ ๋‚ด๋ ค๋ณด๋‚ด๊ณ  ์žˆ๋Š” ๊ฒ๋‹ˆ๋‹ค.

 

์›์ธ์ด ์žกํ˜”์Šต๋‹ˆ๋‹ค.

 

ํ™•์ธํ•˜๋‹ˆ ASCII text๋กœ ํ‘œ์‹œ ๋๊ณ , ์ฝ”๋“œํ‘ธ์‹œ๋กœ ๋ฐ›์€ ๋ฒˆ๋“ค์ด JS ๋ฒˆ๋“ค์ด์—ˆ์Šต๋‹ˆ๋‹ค.

 

๐Ÿ“Œ ํ•ด๊ฒฐ: ๋ช…๋ น์–ด ํ•œ ์ค„

์›์ธ์„ ์ฐพ๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๊ฝค ๊ฑธ๋ ธ๋Š”๋ฐ, ํ•ด๊ฒฐ์€ ํ—ˆ๋ฌดํ•  ๋งŒํผ ๊ฐ„๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.

 

CodePush ๋ฐฐํฌ ๋ช…๋ น์–ด์— -useHermes ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•ด์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

$ code-push-standalone ... -useHermes

์ด ์˜ต์…˜์ด ์—†์œผ๋ฉด CodePush๋Š” Hermes ๋ฐ”์ดํŠธ์ฝ”๋“œ๊ฐ€ ์•„๋‹Œ ์ผ๋ฐ˜ JS ๋ฒˆ๋“ค์„ ๊ทธ๋ƒฅ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.

 

์˜ต์…˜์„ ๋ถ™์ด๋ฉด ๋ฐฐํฌ ์ „์— Hermes๋กœ ๋ฒˆ๋“ค์„ ์ปดํŒŒ์ผํ•ด์„œ ์˜ฌ๋ ค์ค๋‹ˆ๋‹ค.

 

๋ฐฐํฌ ํ›„ ๋™์ผํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฒˆ๋“ค ํƒ€์ž…์„ ๋‹ค์‹œ ํ™•์ธํ•˜๋ฉด Hermes JavaScript bytecode, version 96์ด ์ถœ๋ ฅ๋˜๋Š” ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 


์›์ธ ๋ถ„์„์— ์ด๊ฒƒ์ €๊ฒƒ ํŒŒ๋А๋ผ ์‹œ๊ฐ„์„ ๊ฝค ์“ด ๊ฒƒ ์น˜๊ณ ๋Š” ํ•ด๊ฒฐ์ด ๋„ˆ๋ฌด ์‹ฑ๊ฒ๊ฒŒ ๋๋‚ฌ๋„ค์š”.

 

CodePush + Hermes ์กฐํ•ฉ์„ ์“ฐ๊ณ  ์žˆ๋‹ค๋ฉด ๋ฐฐํฌ ๋ช…๋ น์–ด๋ฅผ ๊ผญ ํ•œ ๋ฒˆ ์ ๊ฒ€ํ•ด๋ณด์‹œ๊ธธ ๊ถŒํ•ฉ๋‹ˆ๋‹ค.

 

Hermes๋ฅผ ๋นŒ๋“œ์— ์ ์šฉํ–ˆ๋‹ค๊ณ  ๋์ด ์•„๋‹ˆ๋ผ, CodePush ๋ฐฐํฌ ์‹œ์—๋„ -useHermes ์˜ต์…˜์ด ๋น ์ ธ ์žˆ์ง€ ์•Š์€์ง€ ๋ฐ˜๋“œ์‹œ ํ™•์ธํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€


์˜คํ”ˆ ์ฑ„ํŒ