React Native 이미지 리소스 관리, 디바이스는 많고 해상도는 다양하다

React Native 앱을 개발하다 보면 디자인 시안에 있는 이미지를 어떤 방식으로 처리할지 고민하게 됨. 특히 아이콘은 해상도별로 넣는 게 맞는지, 큰 배경 이미지는 어떻게 해야 번들 사이즈를 줄일 수 있는지 애매한 경우가 많음. 이번 글에서는 실무에서 가장 자주 쓰이는 이미지 리소스 대응 전략을 정리해봤음. 퍼포먼스, 앱 용량, UX 안정성까지 고려한 현실적인 기준임.
김보람's avatar
Jul 07, 2025
React Native 이미지 리소스 관리, 디바이스는 많고 해상도는 다양하다

🎯 결론 먼저 요약

이미지 유형

대응 전략

아이콘, 버튼 등 작은 요소

@1x, @2x, @3x PNG 포함

큰 배경, 일러스트

넉넉한 해상도의 PNG 한 장만 사용

자주 바뀌는 배너/콘텐츠

CDN에서 로딩하거나 WebP 변환 사용


1️⃣ PNG + @1x / @2x / @3x + require() 패턴

React Native는 이미지 해상도를 자동으로 선택해주는 구조를 가짐.
아래처럼 이미지를 require()로 불러오기만 해도 디바이스 DPI에 맞춰 @2x, @3x 리소스를 알아서 사용해줌.

// assets/images/back.png, back@2x.png, back@3x.png

export const IMAGE_ASSETS = {
  BACK_ICON: require('../assets/images/back.png'),
};

<Image
  source={IMAGE_ASSETS.BACK_ICON}
  style={{ width: 24, height: 24 }}
/>

2️⃣ 아이콘은 해상도별로, 큰 이미지는 한 장만

아이콘 같은 작은 리소스는 @1x, @2x, @3x를 다 준비하는 게 좋음.
특히 고해상도 디바이스에선 @1x만 있으면 흐릿하게 보이기 쉬움.

반면, 큰 배경 이미지나 일러스트는 @2x 사이즈 정도의 PNG 한 장이면 충분한 경우가 많음.
이유:

  • @3x까지 만들면 용량이 많이 늘어남

  • 화면 전체에 꽉 차는 이미지라 약간 흐려져도 티가 덜 남

  • WebP로 변환하면 더 용량을 줄일 수 있음


3️⃣ 실무 기준 이미지 사이즈 예시

용도

권장 원본 크기

리소스 포함 범위

아이콘 (24dp)

72×72px (@3x)

@1x, @2x, @3x 모두

배경/배너

1080px 이상 한 장

@1x만 포함

일러스트

1000~1500px

필요 시 WebP or SVG 대체


4️⃣ 앱에서 이미지를 처리하는 두 가지 방식

React Native에서 이미지를 다루는 방식은 크게 두 가지임:

✅ 1. 번들 포함 방식 (PNG + @1x/@2x/@3x + require())

  • 이미지를 앱에 직접 포함함

  • require()로 불러오면 디바이스 해상도에 따라 자동으로 적절한 이미지가 선택됨

  • 오프라인에서도 항상 로딩됨

✅ 2. CDN 또는 네트워크 이미지 방식 (<Image source={{ uri: ... }} />)

  • 서버나 CDN에서 이미지를 불러옴

  • 앱 용량을 줄일 수 있고, 업데이트 없이도 이미지 교체 가능

  • 단, 네트워크 상태에 따라 품질과 안정성 이슈가 생김


5️⃣ 내가 선택한 방식: PNG + @1x / @2x / @3x + require()

이번 프로젝트에서는 require() 방식의 정적 이미지 번들링을 선택함.
그 이유는 다음과 같음:

🚫 네트워크 의존은 위험하기 때문임

  • 오프라인에선 이미지가 로딩되지 않을 수 있음

  • 느린 네트워크에선 로딩 지연이 생기고 UX 품질 저하됨

  • CDN 오류나 서버 변경 시 앱 UI 자체가 깨질 수 있음

  • 보안상 이미지가 외부에서 조작될 가능성도 존재함

그래서 앱 UI를 구성하는 핵심 리소스는 반드시 번들에 포함시키는 게 안정적이라고 판단했음.


✅ 실무 기준에서의 장점 요약

  • @2x, @3x까지 준비하면 고해상도 대응도 완벽함

  • 오프라인에서도 일관된 UI를 보장할 수 있음

  • 캐싱, 속도 모두 안정적

  • require() 기반이기 때문에 타입 안정성도 확보됨


✅ 마무리

아이콘은 해상도별로, 큰 이미지는 넉넉하게 한 장만
실무에선 이 전략이 성능, 유지보수, UX 품질을 동시에 만족시키는 가장 현실적인 선택이라고 생각함

Share article

b0-0d