로컬 및 원격 소스의 이미지 표시
Image 컴포넌트를 사용해 자산 폴더와 원격 URL에서 이미지를 불러오고, resizeMode를 설정하며 로딩 중 표시할 대체 화면을 보여 줍니다.
로컬 및 원격 소스의 이미지 표시은(는) CoddyKit의 무료 React Native Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 React Native Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. React Native Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
이 강의의 일부는 아직 번역되지 않았으며 영어로 표시됩니다.
The Image Component Introduction
The Image component shows photos, icons, and art. Just remember to give it a width and height — without a size it renders as an invisible empty box.
import { Image, View, StyleSheet } from 'react-native';
export default function SimpleImage() {
return (
<View style={{ padding: 16 }}>
<Image
source={{ uri: 'https://picsum.photos/200/200' }}
style={styles.image}
/>
</View>
);
}
const styles = StyleSheet.create({
image: {
width: 200,
height: 200,
},
});Loading Local Images with require()
Show an image from your assets with require() and a fixed path. It gets bundled into your app at build time, so it loads instantly and works offline.
import { Image, StyleSheet } from 'react-native';
export default function LocalImage() {
return (
<Image
source={require('./assets/icon.png')}
style={styles.logo}
/>
);
}
const styles = StyleSheet.create({
logo: {
width: 100,
height: 100,
},
});
// You can also provide @2x and @3x variants:
// assets/icon.png
// assets/icon@2x.png ← used on 2× screens
// assets/icon@3x.png ← used on 3× screensLoading Remote Images from URLs
For an online image, pass a uri object to source. React Native fetches and caches it, but you still set a size, since it cannot know the dimensions yet.
import { Image, StyleSheet } from 'react-native';
export default function RemoteImage() {
const imageUri = 'https://picsum.photos/seed/react-native/300/200';
return (
<Image
source={{ uri: imageUri }}
style={styles.photo}
/>
);
}
const styles = StyleSheet.create({
photo: {
width: '100%', // fill container width
height: 200, // fixed height
borderRadius: 12,
},
});resizeMode: Fitting Images in Containers
The resizeMode prop fits an image to its box: "cover" fills and crops, while "contain" shows the whole thing. Use cover for photos, contain for logos.
import { Image, View, Text, StyleSheet } from 'react-native';
export default function ResizeModes() {
const uri = 'https://picsum.photos/400/300';
const box = { width: 150, height: 100, borderWidth: 1, borderColor: '#ccc' };
return (
<View style={{ flexDirection: 'row', gap: 8, padding: 16 }}>
<View>
<Image source={{ uri }} style={[box, { resizeMode: 'cover' }]} />
<Text>cover</Text>
</View>
<View>
<Image source={{ uri }} style={[box, { resizeMode: 'contain' }]} />
<Text>contain</Text>
</View>
</View>
);
}Loading Placeholders and defaultSource
Online images take a moment, so show a placeholder while you wait. Track a loading state and swap in a spinner until the image loads.
import { Image, View, ActivityIndicator, StyleSheet } from 'react-native';
import { useState } from 'react';
export default function ImageWithLoader() {
const [loading, setLoading] = useState(true);
return (
<View style={styles.container}>
{loading && (
<ActivityIndicator
style={StyleSheet.absoluteFill}
size='large'
color='#999'
/>
)}
<Image
source={{ uri: 'https://picsum.photos/300/200' }}
style={styles.image}
onLoad={() => setLoading(false)}
/>
</View>
);
}
const styles = StyleSheet.create({
container: { width: 300, height: 200, backgroundColor: '#f0f0f0', borderRadius: 12 },
image: { width: 300, height: 200, borderRadius: 12 },
});onLoad, onError, and onLoadStart
Image gives you callbacks: onLoadStart, onLoad, and onError. Use onError to show a fallback when a URL is wrong or the network drops.
import { Image, Text, View, StyleSheet } from 'react-native';
import { useState } from 'react';
export default function RobustImage({ uri, fallback }) {
const [failed, setFailed] = useState(false);
if (failed) {
return (
<View style={styles.fallback}>
<Text style={{ color: '#999' }}>Image unavailable</Text>
</View>
);
}
return (
<Image
source={{ uri: failed ? null : uri }}
defaultSource={fallback}
style={styles.img}
onError={(e) => {
console.warn('Image failed:', e.nativeEvent.error);
setFailed(true);
}}
/>
);
}
const styles = StyleSheet.create({
img: { width: 200, height: 200, borderRadius: 8 },
fallback: { width: 200, height: 200, backgroundColor: '#eee', alignItems: 'center', justifyContent: 'center', borderRadius: 8 },
});expo-image for Better Performance
For lots of images, try expo-image — a drop-in replacement with better caching, blurhash placeholders, and far less stutter in long lists.
import { Image } from 'expo-image';
// Install: npx expo install expo-image
export default function ExpoImageExample() {
return (
<Image
source='https://picsum.photos/300/200'
placeholder='LGF5]+Yk^6#M@-5c,1J5@[or[Q6.'
contentFit='cover'
transition={300}
style={{ width: 300, height: 200, borderRadius: 12 }}
/>
);
}
// placeholder is a blurhash string — generates a blurry
// color-correct placeholder before the real image loads.Circular Images and Avatar Patterns
Round avatar? Wrap an Image in a square View, set borderRadius to half its width, and add overflow: hidden to clip it into a perfect circle.
import { Image, View, StyleSheet } from 'react-native';
export default function Avatar({ uri, size = 60 }) {
const radius = size / 2;
return (
<View style={[
styles.container,
{ width: size, height: size, borderRadius: radius }
]}>
<Image
source={{ uri }}
style={{ width: size, height: size }}
/>
</View>
);
}
const styles = StyleSheet.create({
container: {
overflow: 'hidden',
backgroundColor: '#e0e0e0', // placeholder while loading
},
});Providing Headers for Protected Images
Some images need a login token. Pass headers in the source object and React Native sends them with the request. Never hardcode secrets — read them at runtime.
import { Image } from 'react-native';
export default function ProtectedImage({ token }) {
return (
<Image
source={{
uri: 'https://api.myapp.com/user/avatar',
headers: {
Authorization: 'Bearer ' + token,
'Cache-Control': 'no-cache',
},
// Optional: cache policy
cache: 'reload',
}}
style={{ width: 80, height: 80, borderRadius: 40 }}
/>
);
}ImageBackground for Overlaid Content
Want content on top of a photo? ImageBackground works like a View with an image behind it. Give it a size and place children right over the picture.
import { ImageBackground, View, Text, StyleSheet } from 'react-native';
export default function HeroSection() {
return (
<ImageBackground
source={{ uri: 'https://picsum.photos/400/300' }}
style={styles.hero}
imageStyle={{ borderRadius: 16 }}
>
{/* Content rendered on top of the image */}
<View style={styles.overlay}>
<Text style={styles.title}>Discover React Native</Text>
<Text style={styles.subtitle}>Build mobile apps today</Text>
</View>
</ImageBackground>
);
}
const styles = StyleSheet.create({
hero: { width: '100%', height: 220, justifyContent: 'flex-end' },
overlay: { backgroundColor: 'rgba(0,0,0,0.45)', padding: 16, borderBottomLeftRadius: 16, borderBottomRightRadius: 16 },
title: { color: '#fff', fontSize: 22, fontWeight: 'bold' },
subtitle: { color: '#ddd', fontSize: 14 },
});Image Caching and Performance Tips
For smooth scrolling lists, keep image URLs stable, lean on expo-image caching, and prefetch key images before they appear. Goodbye, flicker.
import { Image } from 'react-native';
import { useEffect } from 'react';
// Pre-fetch images before they're needed
function usePrefetchImages(urls) {
useEffect(() => {
urls.forEach(url => {
Image.prefetch(url).catch(() => {
// ignore prefetch errors
});
});
}, [urls]);
}
// Usage:
const imageUrls = [
'https://example.com/photo1.jpg',
'https://example.com/photo2.jpg',
];
usePrefetchImages(imageUrls);Quick Check
Quick check! See how the Image pieces clicked. 📸
Lesson Recap
Well done! require() loads local images, a uri object loads remote ones, and resizeMode: "cover" fills a box. Next up: building a profile card.
자주 묻는 질문
“로컬 및 원격 소스의 이미지 표시” 강의는 무료인가요?
네 — “로컬 및 원격 소스의 이미지 표시” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 React Native Academy 강의 전체를 잠금 해제할 수 있습니다. React Native Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“로컬 및 원격 소스의 이미지 표시”에서 뭘 배우나요?
Image 컴포넌트를 사용해 자산 폴더와 원격 URL에서 이미지를 불러오고, resizeMode를 설정하며 로딩 중 표시할 대체 화면을 보여 줍니다. 브라우저에서 직접 실행하는 실습 코드로 React Native Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
React Native Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 React Native Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“로컬 및 원격 소스의 이미지 표시” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 React Native Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 React Native Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 컨테이너로 사용하는 View 컴포넌트
- 텍스트 표시와 글꼴 스타일 지정
- 로컬 및 원격 소스의 이미지 표시
- 간단한 프로필 카드 구성