๋ชจ๋ฐ”์ผ ํ™˜๊ฒฝ์—์„œ ๊ฐ€์žฅ ์˜ˆ์ธก ๋ถˆ๊ฐ€๋Šฅํ•œ ์š”์†Œ ์ค‘ ํ•˜๋‚˜๋Š” ๋„คํŠธ์›Œํฌ ์ƒํƒœ์ž…๋‹ˆ๋‹ค.
๋А๋ฆฐ ์—ฐ๊ฒฐ, ์˜คํ”„๋ผ์ธ ์ƒํƒœ์—์„œ๋„ ์•ฑ์ด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ž‘๋™ํ•˜๋ ค๋ฉด
์ ์ ˆํ•œ UX ๋Œ€์‘ ์ „๋žต์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
์ด๋ฒˆ ๊ธ€์—์„œ๋Š” React Native ์•ฑ์—์„œ ๋„คํŠธ์›Œํฌ ์ƒํƒœ๋ฅผ ๊ณ ๋ คํ•œ UX ๊ตฌํ˜„๋ฒ•์„ ์ •๋ฆฌํ•ด๋ด…๋‹ˆ๋‹ค.


๐Ÿ“ก 1. NetInfo๋กœ ๋„คํŠธ์›Œํฌ ์ƒํƒœ ๊ฐ์ง€

โœ… @react-native-community/netinfo ์‚ฌ์šฉ

  • ์˜จ๋ผ์ธ/์˜คํ”„๋ผ์ธ ์ƒํƒœ ๊ตฌ๋ถ„
  • ๋„คํŠธ์›Œํฌ ํƒ€์ž… (wifi, cellular ๋“ฑ) ํ™•์ธ
import NetInfo from '@react-native-community/netinfo'

useEffect(() => {
  const unsubscribe = NetInfo.addEventListener(state => {
    console.log('Is connected?', state.isConnected);
  });

  return () => unsubscribe();
}, []);

๐Ÿงพ 2. ์˜คํ”„๋ผ์ธ ๋ฐฐ๋„ˆ UI ๊ตฌํ˜„

  • ์˜คํ”„๋ผ์ธ์ผ ๊ฒฝ์šฐ ์ƒ๋‹จ์— ๊ฒฝ๊ณ  ๋ฐฐ๋„ˆ ํ‘œ์‹œ
  • ๋ฐฐ๊ฒฝ์ƒ‰, ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋“ฑ์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž ์ธ์‹ ๋†’์ด๊ธฐ
{!isConnected && (
  <View style={styles.banner}>
    <Text>์ธํ„ฐ๋„ท ์—ฐ๊ฒฐ์ด ์—†์Šต๋‹ˆ๋‹ค.</Text>
  </View>
)}

๐Ÿ”„ 3. ์ž๋™ ์žฌ์‹œ๋„ / ์ˆ˜๋™ ์ƒˆ๋กœ๊ณ ์นจ UX

  • ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ์ด ๋ณต๊ตฌ๋˜๋ฉด ์ž๋™ ์žฌ์š”์ฒญ (SWR ์ „๋žต)
  • ์‚ฌ์šฉ์ž์—๊ฒŒ ์ˆ˜๋™ ์ƒˆ๋กœ๊ณ ์นจ(๋ฆฌํ”„๋ ˆ์‹œ ๋ฒ„ํŠผ, PullToRefresh ๋“ฑ) ์ œ๊ณต
<ScrollView
  refreshControl={
    <RefreshControl
      refreshing={refreshing}
      onRefresh={refetch}
    />
  }
/>

๐Ÿ’พ 4. ์บ์‹ฑ ์ „๋žต์œผ๋กœ UX ๊ฐœ์„ 

  • AsyncStorage, MMKV, react-query, SWR ๋“ฑ ์‚ฌ์šฉํ•˜์—ฌ
    ์ตœ์‹  ๋ฐ์ดํ„ฐ๋ฅผ ์บ์‹ฑํ•˜์—ฌ ์˜คํ”„๋ผ์ธ ์ƒํƒœ์—์„œ๋„ ํ‘œ์‹œ ๊ฐ€๋Šฅ
import AsyncStorage from '@react-native-async-storage/async-storage'

await AsyncStorage.setItem('userData', JSON.stringify(data))

๐Ÿ“ฅ 5. ์‚ฌ์šฉ์ž ์ž…๋ ฅ ๋ฐ์ดํ„ฐ ๋ณด์กด ์ฒ˜๋ฆฌ

  • ์˜คํ”„๋ผ์ธ ์ƒํƒœ์—์„œ๋„ ํผ/์ž‘์„ฑ ๋‚ด์šฉ์„ ์œ ์ง€ํ•ด์•ผ ํ•จ
  • ์ผ์ • ์ฃผ๊ธฐ๋กœ ๋กœ์ปฌ ์ €์žฅ ๋˜๋Š” draft ๊ธฐ๋Šฅ ๊ตฌํ˜„

โš™๏ธ 6. ์ „์†ก ์‹คํŒจ ๋Œ€์‘ UX

  • ์˜คํ”„๋ผ์ธ ์ค‘ ์ „์†กํ•œ ์š”์ฒญ์€ ์‹คํŒจ ๋ฉ”์‹œ์ง€ or ํ์— ์ €์žฅ
  • ์—ฐ๊ฒฐ ๋ณต๊ตฌ ์‹œ ์ž๋™ ์ „์†ก (์˜ˆ: ์ฑ„ํŒ… ์•ฑ์˜ ๋ฉ”์‹œ์ง€ ํ)

๐ŸŽฏ ๋งˆ๋ฌด๋ฆฌ ์ •๋ฆฌ

์ „๋žตํ•ต์‹ฌ ํ‚ค์›Œ๋“œ
๋„คํŠธ์›Œํฌ ๊ฐ์ง€NetInfo, isConnected
์‚ฌ์šฉ์ž ์•Œ๋ฆผ์˜คํ”„๋ผ์ธ ๋ฐฐ๋„ˆ, alert
์บ์‹ฑ ์ฒ˜๋ฆฌAsyncStorage, react-query
์žฌ์‹œ๋„ ์ „๋žตSWR, ์ƒˆ๋กœ๊ณ ์นจ
์‚ฌ์šฉ์ž ์ž…๋ ฅ ๋ณด์กดdraft ์ €์žฅ
์‹คํŒจ ์ฒ˜๋ฆฌํ์ž‰, ์ „์†ก ์žฌ์‹œ๋„

โ˜๏ธ ๋„คํŠธ์›Œํฌ ์žฅ์• ๋Š” ํ”ผํ•  ์ˆ˜ ์—†์ง€๋งŒ,
๊ทธ ๊ฒฝํ—˜์„ ์–ผ๋งˆ๋‚˜ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋А๋ƒ๊ฐ€
์•ฑ ์™„์„ฑ๋„์˜ ์ฐจ์ด์ž…๋‹ˆ๋‹ค. ๐ŸŒ


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

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