๐ 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 ์ต์
์ด ๋น ์ ธ ์์ง ์์์ง ๋ฐ๋์ ํ์ธํ์๊ธฐ ๋ฐ๋๋๋ค.
์คํ ์ฑํ
๋๊ธ