๐Ÿ–ผ๏ธ 38. React Native ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ ์ „๋žต โ€” ๋กœ์ปฌ, ์›๊ฒฉ, ๊ณ ํ•ด์ƒ๋„๊นŒ์ง€ ์™„์ „ ์ •๋ฆฌ

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

React Native๋กœ ์•ฑ์„ ๋งŒ๋“ค๋‹ค ๋ณด๋ฉด
์ด๋ฏธ์ง€๋ฅผ ์•ฑ์— ์–ด๋–ป๊ฒŒ ๋„ฃ๊ณ , ์–ด๋–ป๊ฒŒ ๋ณด์—ฌ์ค„์ง€
๊ณ ๋ฏผ์ด ๋งŽ์•„์ง„๋‹ค.

์›น๊ณผ ๋‹ค๋ฅด๊ฒŒ ๋ชจ๋ฐ”์ผ ์•ฑ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ๋งˆ์ฃผํ•˜๊ฒŒ ๋œ๋‹ค:

  • ํ•ด์ƒ๋„ ๋†’์€ ์ด๋ฏธ์ง€๊ฐ€ ๊นจ์ง
  • ๋„คํŠธ์›Œํฌ ์ด๋ฏธ์ง€๋Š” ๋А๋ฆผ
  • GIF๋Š” ์ง€์›๋˜์ง€ ์•Š์Œ
  • ์ด๋ฏธ์ง€๋ฅผ ๋กœ์ปฌ์— ์ €์žฅํ• ์ง€, ์„œ๋ฒ„์—์„œ ๋ฐ›์•„์˜ฌ์ง€ ๊ณ ๋ฏผ๋จ

์ด๋ฒˆ ๊ธ€์€ React Native์—์„œ
์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ์— ํ•„์š”ํ•œ ์ „๋ฐ˜์ ์ธ ์ง€์‹๊ณผ ์‹ค์ „ ์˜ˆ์‹œ๋ฅผ ์ •๋ฆฌํ•œ ๊ธ€์ด๋‹ค.


โœ… ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•: Image ์ปดํฌ๋„ŒํŠธ

import { Image } from 'react-native';

<Image
  source={require('./assets/logo.png')}
  style={{ width: 100, height: 100 }}
/>
  • ๋กœ์ปฌ ์ด๋ฏธ์ง€ (require)
  • ๋ฐ˜๋“œ์‹œ width์™€ height๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•จ

๐ŸŒ ์›๊ฒฉ ์ด๋ฏธ์ง€ (Remote)

<Image
  source={{ uri: 'https://example.com/image.jpg' }}
  style={{ width: 200, height: 200 }}
  resizeMode="cover"
/>
  • ์›๊ฒฉ URI ํ˜•์‹์œผ๋กœ ์ง€์ •
  • resizeMode๋Š” ์ด๋ฏธ์ง€ ์ฑ„์šฐ๊ธฐ ๋ฐฉ์‹ ์„ค์ •

๐Ÿ“ resizeMode ์ข…๋ฅ˜

์†์„ฑ์„ค๋ช…
cover๋น„์œจ ์œ ์ง€ + ๊ฝ‰ ์ฑ„์šฐ๊ธฐ
contain๋น„์œจ ์œ ์ง€ + ๋‚ด๋ถ€์— ๋งž๊ฒŒ ์ถ•์†Œ
stretch๋น„์œจ ๋ฌด์‹œ + ๊ฝ‰ ์ฑ„์šฐ๊ธฐ
center๊ฐ€์šด๋ฐ ์ •๋ ฌ (ํฌ๊ธฐ ์œ ์ง€)

๐Ÿ–ผ๏ธ ๊ณ ํ•ด์ƒ๋„ ๋””๋ฐ”์ด์Šค ๋Œ€์‘ (@2x, @3x)

์•„์ดํฐ์ฒ˜๋Ÿผ ๊ณ ๋ฐ€๋„ ๋””์Šคํ”Œ๋ ˆ์ด์—์„œ๋Š” @2x, @3x ์ด๋ฏธ์ง€๋ฅผ ์ œ๊ณตํ•ด์•ผ ๊นจ์ง€์ง€ ์•Š๋Š”๋‹ค.

์˜ˆ์‹œ:

assets/
โ”œโ”€โ”€ icon.png
โ”œโ”€โ”€ icon@2x.png
โ”œโ”€โ”€ icon@3x.png
<Image source={require('./assets/icon.png')} />

โœ… ๊ฐ™์€ ์ด๋ฆ„์œผ๋กœ ๋‘๊ณ  React Native๊ฐ€ ์ž๋™์œผ๋กœ ๋””๋ฐ”์ด์Šค ํ•ด์ƒ๋„์— ๋งž๋Š” ๋ฒ„์ „์„ ๋ถˆ๋Ÿฌ์˜ด


๐Ÿš€ ์ด๋ฏธ์ง€ ์บ์‹ฑ ๋ฌธ์ œ์™€ ํ•ด๊ฒฐ

React Native ๊ธฐ๋ณธ Image๋Š” ์บ์‹ฑ ๊ธฐ๋Šฅ์ด ์•ฝํ•จ
โ†’ ๋ฐ˜๋ณต ๋กœ๋”ฉ ์‹œ ๊นœ๋นก์ด๊ฑฐ๋‚˜ ๋А๋ ค์งˆ ์ˆ˜ ์žˆ์Œ

๐Ÿ‘‰ ๋Œ€์•ˆ: react-native-fast-image

npm install react-native-fast-image
import FastImage from 'react-native-fast-image';

<FastImage
  style={{ width: 100, height: 100 }}
  source={{ uri: 'https://image.com/pic.jpg', priority: 'high' }}
  resizeMode={FastImage.resizeMode.contain}
/>

โœ… ์ž๋™ ์บ์‹ฑ
โœ… ๋กœ๋”ฉ ์šฐ์„ ์ˆœ์œ„
โœ… gif, ์›นP ์ง€์›


๐Ÿง  ๊ธฐํƒ€ ํŒ

  • ๋กœ๋”ฉ ์ค‘ indicator ์ฒ˜๋ฆฌ: ActivityIndicator์™€ ํ•จ๊ป˜ ์ฒ˜๋ฆฌ
  • background image๋Š” ImageBackground ์ปดํฌ๋„ŒํŠธ ์‚ฌ์šฉ
  • ์„œ๋ฒ„ ์ด๋ฏธ์ง€ ์‚ฌ์ด์ฆˆ๋Š” ์••์ถ•๋œ ์ƒํƒœ๋กœ ๋ณด๋‚ด๊ธฐ
  • ์ด๋ฏธ์ง€๊ฐ€ ๋งŽ์„ ๊ฒฝ์šฐ lazy-loading ๊ณ ๋ ค

๐Ÿ“ ๋‚ด๊ฐ€ ๋А๋‚€ ์ 

์ฒ˜์Œ์—” ๊ทธ๋ƒฅ Image๋กœ ๋‹ค ๋˜๋Š” ์ค„ ์•Œ์•˜๋Š”๋ฐ,
ํ”„๋กœํ•„ ์ด๋ฏธ์ง€๊ฐ€ ํ๋ฆฟํ•˜๊ฑฐ๋‚˜, ๋ฆฌ์ŠคํŠธ์— ์ด๋ฏธ์ง€๊ฐ€ ๋А๋ฆฌ๊ฒŒ ๋œจ๋Š” ๋ฌธ์ œ๊ฐ€ ๊ณ„์† ์ƒ๊ฒผ๋‹ค.
๊ทธ๋•Œ๋ถ€ํ„ฐ @2x ๊ตฌ์กฐ, FastImage, ์บ์‹ฑ ์ „๋žต์„ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๊ฒŒ ๋๋‹ค.

์ง€๊ธˆ์€ ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ๋„ ํ•˜๋‚˜์˜ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋‹จ๊ณ„๋กœ ์ƒ๊ฐํ•œ๋‹ค.


๐Ÿ–ผ๏ธ โ€œ์ด๋ฏธ์ง€๋Š” UX๋‹ค. ๊นจ์ง€๋ฉด ์‹ ๋ขฐ๋„๋„ ๊ฐ™์ด ๊นจ์ง„๋‹ค.โ€


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

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