๐Ÿ“ฑ 76. React Native ์•ฑ ์—…๋ฐ์ดํŠธ ์™„์ „ ์ •๋ฆฌ

JM_Devยท2025๋…„ 8์›” 11์ผ
0
post-thumbnail

์•ฑ์€ ์ถœ์‹œ๊ฐ€ ๋์ด ์•„๋‹ˆ๋ผ ์‹œ์ž‘์ด๋‹ค.
๊ธฐ๋Šฅ ๊ฐœ์„ , ๋ฒ„๊ทธ ์ˆ˜์ •, ๋ณด์•ˆ ํŒจ์น˜ ๋“ฑ ์—…๋ฐ์ดํŠธ๋Š” ํ•„์ˆ˜๋‹ค.
์ด๋ฒˆ ๊ธ€์—์„œ๋Š” React Native ์•ฑ์˜ ์—…๋ฐ์ดํŠธ ์ „๋žต๊ณผ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•œ๋‹ค.


๐Ÿ’ก 1. ๊ฐ•์ œ ์—…๋ฐ์ดํŠธ (Mandatory Update)

๊ฐ•์ œ ์—…๋ฐ์ดํŠธ๋Š” ํŠน์ • ๋ฒ„์ „ ์ดํ•˜์˜ ์•ฑ ์‚ฌ์šฉ์„ ์ฐจ๋‹จํ•˜๊ณ , ๋ฐ˜๋“œ์‹œ ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๋„๋ก ์š”๊ตฌํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.
๋ณด์•ˆ ์ทจ์•ฝ์  ํŒจ์น˜, ์น˜๋ช…์  ๋ฒ„๊ทธ ์ˆ˜์ • ๋“ฑ ๊ธด๊ธ‰ํ•œ ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•œ๋‹ค.

์žฅ์ 

  • ๋ชจ๋“  ์‚ฌ์šฉ์ž๊ฐ€ ๋™์ผํ•œ ์ตœ์‹  ๋ฒ„์ „์„ ์‚ฌ์šฉ
  • ๋ณด์•ˆ ๊ฐ•ํ™”

๋‹จ์ 

  • ์‚ฌ์šฉ์ž ๋ถˆํŽธ ์ฆ๊ฐ€
  • ์—…๋ฐ์ดํŠธ ๊ฑฐ๋ถ€ ์‹œ ์•ฑ ์‚ฌ์šฉ ๋ถˆ๊ฐ€
// versionCheck.ts
import { Alert, Linking } from 'react-native';

export function checkAppVersion(currentVersion: string, latestVersion: string, storeUrl: string) {
  if (currentVersion < latestVersion) {
    Alert.alert(
      '์—…๋ฐ์ดํŠธ ํ•„์š”',
      '์•ฑ์„ ๊ณ„์† ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜์„ธ์š”.',
      [
        { text: '์—…๋ฐ์ดํŠธ', onPress: () => Linking.openURL(storeUrl) },
      ],
      { cancelable: false }
    );
  }
}

๐Ÿ’ก 2. ์†Œํ”„ํŠธ ์—…๋ฐ์ดํŠธ (์•Œ๋ฆผ ์—…๋ฐ์ดํŠธ)

์†Œํ”„ํŠธ ์—…๋ฐ์ดํŠธ๋Š” ๊ธฐ๋Šฅ ์‚ฌ์šฉ์— ์ œํ•œ ์—†์ด ์‚ฌ์šฉ์ž์—๊ฒŒ ์—…๋ฐ์ดํŠธ๋ฅผ ๊ถŒ๊ณ ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.
์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ €ํ•ด๊ฐ€ ์ ์œผ๋ฉฐ, ์ ์ง„์ ์ธ ์—…๋ฐ์ดํŠธ ์œ ๋„์— ์ ํ•ฉํ•˜๋‹ค.

// updateNotice.tsx
import { Alert } from 'react-native';

export function showUpdateNotice(latestVersion: string) {
  Alert.alert(
    '์ƒˆ๋กœ์šด ์—…๋ฐ์ดํŠธ ์•ˆ๋‚ด',
    `๋ฒ„์ „ ${latestVersion}์ด ์ถœ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ํ™•์ธํ•ด๋ณด์„ธ์š”!`
  );
}

โšก 3. OTA ์—…๋ฐ์ดํŠธ (Over-the-Air)

OTA ์—…๋ฐ์ดํŠธ๋Š” ์•ฑ์Šคํ† ์–ด๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  JS ๋ฒˆ๋“ค์„ ๊ต์ฒดํ•ด ์ฆ‰์‹œ ๋ฐ˜์˜ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.
Microsoft CodePush๋‚˜ Expo Updates๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ€๋Šฅํ•˜๋‹ค.

์žฅ์ 

  • ์•ฑ์Šคํ† ์–ด ์‹ฌ์‚ฌ ์—†์ด ์ฆ‰์‹œ ๋ฐฐํฌ ๊ฐ€๋Šฅ
  • JS/Asset ์ˆ˜์ •์— ์œ ๋ฆฌ

๋‹จ์ 

  • ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€
  • ์Šคํ† ์–ด ์ •์ฑ… ์œ„๋ฐ˜ ๊ฐ€๋Šฅ์„ฑ
npm install react-native-code-push
// App.tsx
import CodePush from 'react-native-code-push';

let App = () => {
  return (
    // App ์ฝ”๋“œ
  );
};

App = CodePush({ checkFrequency: CodePush.CheckFrequency.ON_APP_START })(App);
export default App;

๐Ÿ“ฆ 4. ์—…๋ฐ์ดํŠธ ๋ฐฉ์‹ ๋น„๊ต

๋ฐฉ์‹์žฅ์ ๋‹จ์ ์‚ฌ์šฉ ์˜ˆ์‹œ
๊ฐ•์ œ ์—…๋ฐ์ดํŠธ๋ฒ„์ „ ํ†ต์ผ, ๋ณด์•ˆ ๊ฐ•ํ™”์‚ฌ์šฉ์ž ๋ถˆํŽธ์น˜๋ช…์  ๋ฒ„๊ทธ ์ˆ˜์ •
์†Œํ”„ํŠธ ์—…๋ฐ์ดํŠธ์œ ์—ฐํ•œ ์•ˆ๋‚ด์—…๋ฐ์ดํŠธ ๋ฏธ๋ฃจ๊ธฐ ๊ฐ€๋Šฅ๊ธฐ๋Šฅ ๊ฐœ์„  ์•ˆ๋‚ด
OTA ์—…๋ฐ์ดํŠธ์ฆ‰์‹œ ๋ฐ˜์˜๋„ค์ดํ‹ฐ๋ธŒ ์ˆ˜์ • ๋ถˆ๊ฐ€๊ธด๊ธ‰ JS ์ˆ˜์ •

๐Ÿง  ์‹ค์ „ ํŒ

  1. ๋ฒ„์ „ ๊ด€๋ฆฌ API๋ฅผ ์„œ๋ฒ„์— ๋‘๊ณ , ์•ฑ ์‹คํ–‰ ์‹œ ๋ฒ„์ „ ์ •๋ณด๋ฅผ ๋น„๊ตํ•œ๋‹ค.
  2. ํ”Œ๋žซํผ๋ณ„ ์Šคํ† ์–ด ๋งํฌ(iOS App Store, Google Play)๋ฅผ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ๊ด€๋ฆฌํ•œ๋‹ค.
  3. OTA ์—…๋ฐ์ดํŠธ๋Š” ์‚ฌ์†Œํ•œ UI/๋กœ์ง ๋ณ€๊ฒฝ์—๋งŒ ์‚ฌ์šฉํ•˜๊ณ , ํ•ต์‹ฌ ๋กœ์ง ๋ณ€๊ฒฝ์€ ์Šคํ† ์–ด ๋ฐฐํฌ๋กœ ์ง„ํ–‰ํ•œ๋‹ค.
  4. ์•ฑ ์ฒซ ์‹คํ–‰ ์‹œ ์—…๋ฐ์ดํŠธ ๋กœ์ง์„ ๋น„๋™๊ธฐ๋กœ ์‹คํ–‰ํ•ด UX๋ฅผ ํ•ด์น˜์ง€ ์•Š๊ฒŒ ํ•œ๋‹ค.

๐Ÿ“Œ โ€œ์—…๋ฐ์ดํŠธ ์ „๋žต์€ ๊ธฐ์ˆ ์ด ์•„๋‹ˆ๋ผ, ์šด์˜ ์ฒ ํ•™์ด๋‹ค.โ€


profile
๊ฐœ๋ฐœ์ž๋กœ ์ทจ์—…์„ ์ค€๋น„ ์ค‘ ์ด๋ฉฐ, ์—ด์‹ฌํžˆ ๊ณต๋ถ€ ์ค‘ ์ž…๋‹ˆ๋‹ค!

0๊ฐœ์˜ ๋Œ“๊ธ€