개요
배너 광고는 화면의 일부 영역에 표시되는 직사각형 광고입니다.AdropBanner 컴포넌트를 사용하여 손쉽게 구현할 수 있습니다.
주요 특징
- 화면 상단, 하단 또는 중간에 고정 배치 가능
- 이미지 및 동영상 광고 지원
- 자동 또는 수동 광고 로드 지원
- 콜백을 통한 광고 이벤트 처리
- 광고 메타데이터 제공 (크리에이티브 ID, 캠페인 ID 등)
개발 환경에서는 테스트 유닛 ID를 사용하세요:
PUBLIC_TEST_UNIT_ID_320_100 또는 PUBLIC_TEST_UNIT_ID_320_50AdropBanner 컴포넌트
Props
애드컨트롤 콘솔에서 생성한 유닛 ID
배너의 스타일 (width와 height 필수)
컴포넌트가 마운트될 때 자동으로 광고를 로드할지 여부
커스텀 클릭 처리를 사용할지 여부.
true로 설정하면 광고 클릭 시 자동으로 브라우저가 열리지 않습니다.광고 수신이 성공했을 때 호출되는 콜백
사용자가 광고를 클릭했을 때 호출되는 콜백
광고가 화면에 노출되었을 때 호출되는 콜백
광고 수신이 실패했을 때 호출되는 콜백
기본 사용법
자동 로드 (권장)
컴포넌트가 마운트될 때 자동으로 광고를 로드합니다.복사
import React from 'react'
import { View, StyleSheet, Dimensions } from 'react-native'
import { AdropBanner } from 'adrop-ads-react-native'
const App = () => {
const screenWidth = Dimensions.get('window').width
return (
<View style={styles.container}>
{/* 메인 콘텐츠 */}
<View style={styles.content}>
{/* ... */}
</View>
{/* 배너 광고 */}
<AdropBanner
unitId="YOUR_UNIT_ID"
style={{ width: screenWidth, height: 80 }}
onAdReceived={(unitId, metadata) => {
console.log('배너 광고 수신 성공', unitId, metadata)
}}
onAdFailedToReceive={(unitId, errorCode) => {
console.log('배너 광고 수신 실패', unitId, errorCode)
}}
/>
</View>
)
}
const styles = StyleSheet.create({
container: {
flex: 1,
},
content: {
flex: 1,
},
})
export default App
Ref를 사용한 수동 로드
ref를 사용하여 원하는 시점에 광고를 로드할 수 있습니다.
복사
import React, { useRef } from 'react'
import { View, Button, StyleSheet, Dimensions } from 'react-native'
import { AdropBanner } from 'adrop-ads-react-native'
interface AdropBannerRef {
load: () => void
}
const App = () => {
const bannerRef = useRef<AdropBannerRef>(null)
const screenWidth = Dimensions.get('window').width
const loadBanner = () => {
bannerRef.current?.load()
}
return (
<View style={styles.container}>
<Button title="배너 광고 로드" onPress={loadBanner} />
<AdropBanner
ref={bannerRef}
unitId="YOUR_UNIT_ID"
style={{ width: screenWidth, height: 80 }}
autoLoad={false}
onAdReceived={(unitId, metadata) => {
console.log('배너 광고 수신 성공', unitId, metadata)
}}
onAdFailedToReceive={(unitId, errorCode) => {
console.log('배너 광고 수신 실패', unitId, errorCode)
}}
/>
</View>
)
}
const styles = StyleSheet.create({
container: {
flex: 1,
alignItems: 'center',
justifyContent: 'center',
},
})
export default App
콜백 함수
onAdReceived
광고 수신이 성공했을 때 호출됩니다.복사
const handleAdReceived = (unitId: string, metadata?: AdropBannerMetadata) => {
console.log('배너 광고 수신 성공')
console.log('유닛 ID:', unitId)
console.log('크리에이티브 ID:', metadata?.creativeId)
console.log('캠페인 ID:', metadata?.campaignId)
console.log('트랜잭션 ID:', metadata?.txId)
console.log('목적지 URL:', metadata?.destinationURL)
// 로딩 인디케이터 숨기기 등의 처리
}
onAdClicked
사용자가 광고를 클릭했을 때 호출됩니다.복사
const handleAdClicked = (unitId: string, metadata?: AdropBannerMetadata) => {
console.log('배너 광고 클릭')
console.log('유닛 ID:', unitId)
console.log('목적지 URL:', metadata?.destinationURL)
// 클릭 분석 로깅 등의 처리
}
onAdImpression
광고가 화면에 노출되었을 때 호출됩니다.복사
const handleAdImpression = (unitId: string, metadata?: AdropBannerMetadata) => {
console.log('배너 광고 노출')
console.log('유닛 ID:', unitId)
console.log('크리에이티브 ID:', metadata?.creativeId)
// 노출 분석 로깅 등의 처리
}
onAdFailedToReceive
광고 수신이 실패했을 때 호출됩니다.복사
const handleAdFailedToReceive = (unitId: string, errorCode?: string) => {
console.log('배너 광고 수신 실패')
console.log('유닛 ID:', unitId)
console.log('에러 코드:', errorCode)
// 에러 처리 및 대체 콘텐츠 표시
if (errorCode === 'NETWORK_ERROR') {
console.log('네트워크 연결을 확인하세요')
} else if (errorCode === 'NO_FILL') {
console.log('노출 가능한 광고가 없습니다')
}
}
AdropBannerMetadata
광고 메타데이터 타입입니다.복사
type AdropBannerMetadata = {
creativeId: string // 크리에이티브 ID
txId: string // 트랜잭션 ID
campaignId: string // 캠페인 ID
destinationURL: string // 목적지 URL
}
광고 크기
배너 광고는 유닛에 설정한 크기에 맞춰 스타일의 크기를 지정해야 합니다.일반적인 배너 크기
| 크기 | 용도 |
|---|---|
| 320 x 50 | 소형 배너 |
| 320 x 100 | 중형 배너 |
| 16:9 비율 | 동영상 배너 |
고정 크기 사용
복사
<AdropBanner
unitId="YOUR_UNIT_ID"
style={{ width: 320, height: 100 }}
/>
화면 너비에 맞추기
복사
import { Dimensions } from 'react-native'
const screenWidth = Dimensions.get('window').width
<AdropBanner
unitId="YOUR_UNIT_ID"
style={{ width: screenWidth, height: 80 }}
/>
반응형 크기 사용
복사
<AdropBanner
unitId="YOUR_UNIT_ID"
style={{ width: '100%', height: 80 }}
/>
width를 문자열('100%' 등)로 설정하면 반응형으로 동작하지만, 숫자로 설정하면 해당 값이 광고 서버에 전달되어 적절한 크기의 광고를 요청합니다.테스트 유닛 ID
개발 및 테스트 시 아래의 테스트 유닛 ID를 사용하세요.| 광고 유형 | 테스트 유닛 ID | 크기 |
|---|---|---|
| 배너 (320x50) | PUBLIC_TEST_UNIT_ID_320_50 | 320 x 50 |
| 배너 (320x100) | PUBLIC_TEST_UNIT_ID_320_100 | 320 x 100 |
사용 예시
복사
<AdropBanner
unitId="PUBLIC_TEST_UNIT_ID_320_100"
style={{ width: 320, height: 100 }}
/>
에러 처리
광고 로드 실패 시 적절한 에러 처리를 구현하세요.에러 상태 관리
복사
import React, { useState } from 'react'
import { View, Text, StyleSheet } from 'react-native'
import { AdropBanner } from 'adrop-ads-react-native'
const App = () => {
const [error, setError] = useState<string | null>(null)
const handleAdReceived = () => {
setError(null)
}
const handleAdFailedToReceive = (unitId: string, errorCode?: string) => {
setError(errorCode || '알 수 없는 오류')
}
return (
<View style={styles.container}>
<AdropBanner
unitId="YOUR_UNIT_ID"
style={{ width: 320, height: 100 }}
onAdReceived={handleAdReceived}
onAdFailedToReceive={handleAdFailedToReceive}
/>
{error && (
<Text style={styles.errorText}>
광고 로드 실패: {error}
</Text>
)}
</View>
)
}
const styles = StyleSheet.create({
container: {
flex: 1,
alignItems: 'center',
justifyContent: 'center',
},
errorText: {
marginTop: 8,
color: 'red',
},
})
export default App
베스트 프랙티스
1. 화면 가시성
배너가 화면에 보일 때 광고를 로드하세요.복사
import React, { useEffect, useRef } from 'react'
import { AppState } from 'react-native'
const App = () => {
const bannerRef = useRef<{ load: () => void }>(null)
const appState = useRef(AppState.currentState)
useEffect(() => {
const subscription = AppState.addEventListener('change', nextAppState => {
if (
appState.current.match(/inactive|background/) &&
nextAppState === 'active'
) {
// 앱이 포그라운드로 돌아왔을 때 광고 새로고침
bannerRef.current?.load()
}
appState.current = nextAppState
})
return () => {
subscription.remove()
}
}, [])
return (
<AdropBanner
ref={bannerRef}
unitId="YOUR_UNIT_ID"
style={{ width: 320, height: 100 }}
/>
)
}
2. 로딩 인디케이터
광고 로딩 중 사용자 경험을 개선하세요.복사
import React, { useState } from 'react'
import { View, ActivityIndicator, StyleSheet } from 'react-native'
import { AdropBanner } from 'adrop-ads-react-native'
const App = () => {
const [loading, setLoading] = useState(true)
return (
<View style={styles.container}>
{loading && (
<ActivityIndicator
style={styles.loader}
size="small"
color="#999"
/>
)}
<AdropBanner
unitId="YOUR_UNIT_ID"
style={{ width: 320, height: 100 }}
onAdReceived={() => setLoading(false)}
onAdFailedToReceive={() => setLoading(false)}
/>
</View>
)
}
const styles = StyleSheet.create({
container: {
position: 'relative',
},
loader: {
position: 'absolute',
top: '50%',
left: '50%',
transform: [{ translateX: -12 }, { translateY: -12 }],
},
})
3. 다중 배너 관리
여러 배너를 사용할 때는 각각의 상태를 관리하세요.복사
import React, { useState } from 'react'
import { View, Text } from 'react-native'
import { AdropBanner } from 'adrop-ads-react-native'
const App = () => {
const [banner1Loaded, setBanner1Loaded] = useState(false)
const [banner2Loaded, setBanner2Loaded] = useState(false)
return (
<View>
<Text>배너 1: {banner1Loaded ? '로드됨' : '로딩 중'}</Text>
<AdropBanner
unitId="UNIT_ID_1"
style={{ width: 320, height: 100 }}
onAdReceived={() => setBanner1Loaded(true)}
/>
<Text>배너 2: {banner2Loaded ? '로드됨' : '로딩 중'}</Text>
<AdropBanner
unitId="UNIT_ID_2"
style={{ width: 320, height: 100 }}
onAdReceived={() => setBanner2Loaded(true)}
/>
</View>
)
}
4. 커스텀 클릭 처리
광고 클릭을 직접 처리하려면useCustomClick을 사용하세요.
복사
import { Linking } from 'react-native'
import { AdropBanner, type AdropBannerMetadata } from 'adrop-ads-react-native'
const App = () => {
const handleAdClicked = (unitId: string, metadata?: AdropBannerMetadata) => {
console.log('광고 클릭됨:', unitId)
// 커스텀 분석 로깅
analytics.logEvent('ad_clicked', {
unitId,
campaignId: metadata?.campaignId,
})
// 수동으로 브라우저 열기
if (metadata?.destinationURL) {
Linking.openURL(metadata.destinationURL)
}
}
return (
<AdropBanner
unitId="YOUR_UNIT_ID"
style={{ width: 320, height: 100 }}
useCustomClick={true}
onAdClicked={handleAdClicked}
/>
)
}
전체 예제
TypeScript 예제
복사
import React, { useRef, useState } from 'react'
import {
View,
Text,
Button,
StyleSheet,
Dimensions,
ActivityIndicator,
} from 'react-native'
import { AdropBanner, type AdropBannerMetadata } from 'adrop-ads-react-native'
interface AdropBannerRef {
load: () => void
}
const BannerExample = () => {
const bannerRef = useRef<AdropBannerRef>(null)
const [loading, setLoading] = useState(false)
const [error, setError] = useState<string | null>(null)
const [metadata, setMetadata] = useState<AdropBannerMetadata | null>(null)
const screenWidth = Dimensions.get('window').width
const loadBanner = () => {
setLoading(true)
setError(null)
bannerRef.current?.load()
}
const handleAdReceived = (unitId: string, metadata?: AdropBannerMetadata) => {
console.log('✅ 배너 광고 수신 성공')
console.log('유닛 ID:', unitId)
console.log('메타데이터:', metadata)
setLoading(false)
setError(null)
if (metadata) {
setMetadata(metadata)
}
}
const handleAdClicked = (unitId: string, metadata?: AdropBannerMetadata) => {
console.log('👆 배너 광고 클릭')
console.log('유닛 ID:', unitId)
console.log('목적지 URL:', metadata?.destinationURL)
}
const handleAdImpression = (unitId: string, metadata?: AdropBannerMetadata) => {
console.log('👁️ 배너 광고 노출')
console.log('유닛 ID:', unitId)
console.log('크리에이티브 ID:', metadata?.creativeId)
}
const handleAdFailedToReceive = (unitId: string, errorCode?: string) => {
console.log('❌ 배너 광고 수신 실패')
console.log('유닛 ID:', unitId)
console.log('에러 코드:', errorCode)
setLoading(false)
setError(errorCode || '알 수 없는 오류')
}
return (
<View style={styles.container}>
<Text style={styles.title}>배너 광고 예제</Text>
<Button title="배너 광고 로드" onPress={loadBanner} />
<View style={styles.bannerContainer}>
{loading && (
<ActivityIndicator
style={styles.loader}
size="small"
color="#666"
/>
)}
<AdropBanner
ref={bannerRef}
unitId="YOUR_UNIT_ID"
style={{ width: screenWidth, height: 80 }}
autoLoad={false}
onAdReceived={handleAdReceived}
onAdClicked={handleAdClicked}
onAdImpression={handleAdImpression}
onAdFailedToReceive={handleAdFailedToReceive}
/>
{error && (
<View style={styles.errorContainer}>
<Text style={styles.errorText}>에러: {error}</Text>
</View>
)}
{metadata && (
<View style={styles.metadataContainer}>
<Text style={styles.metadataTitle}>광고 메타데이터:</Text>
<Text style={styles.metadataText}>
크리에이티브 ID: {metadata.creativeId}
</Text>
<Text style={styles.metadataText}>
캠페인 ID: {metadata.campaignId}
</Text>
<Text style={styles.metadataText}>
트랜잭션 ID: {metadata.txId}
</Text>
</View>
)}
</View>
</View>
)
}
const styles = StyleSheet.create({
container: {
flex: 1,
alignItems: 'center',
marginVertical: 50,
paddingHorizontal: 16,
},
title: {
fontSize: 24,
fontWeight: 'bold',
marginBottom: 20,
},
bannerContainer: {
marginTop: 20,
position: 'relative',
width: '100%',
},
loader: {
position: 'absolute',
top: 40,
left: '50%',
transform: [{ translateX: -12 }],
zIndex: 1,
},
errorContainer: {
marginTop: 8,
padding: 8,
backgroundColor: '#ffebee',
borderRadius: 4,
},
errorText: {
color: '#c62828',
textAlign: 'center',
},
metadataContainer: {
marginTop: 12,
padding: 12,
backgroundColor: '#f5f5f5',
borderRadius: 4,
},
metadataTitle: {
fontSize: 14,
fontWeight: 'bold',
marginBottom: 4,
},
metadataText: {
fontSize: 12,
color: '#666',
marginTop: 2,
},
})
export default BannerExample
JavaScript 예제
복사
import React, { useRef, useState } from 'react'
import {
View,
Text,
Button,
StyleSheet,
Dimensions,
ActivityIndicator,
} from 'react-native'
import { AdropBanner } from 'adrop-ads-react-native'
const BannerExample = () => {
const bannerRef = useRef(null)
const [loading, setLoading] = useState(false)
const [error, setError] = useState(null)
const screenWidth = Dimensions.get('window').width
const loadBanner = () => {
setLoading(true)
setError(null)
bannerRef.current?.load()
}
const handleAdReceived = (unitId, metadata) => {
console.log('배너 광고 수신 성공', unitId, metadata)
setLoading(false)
setError(null)
}
const handleAdFailedToReceive = (unitId, errorCode) => {
console.log('배너 광고 수신 실패', unitId, errorCode)
setLoading(false)
setError(errorCode || '알 수 없는 오류')
}
return (
<View style={styles.container}>
<Text style={styles.title}>배너 광고 예제</Text>
<Button title="배너 광고 로드" onPress={loadBanner} />
<View style={styles.bannerContainer}>
{loading && <ActivityIndicator style={styles.loader} />}
<AdropBanner
ref={bannerRef}
unitId="YOUR_UNIT_ID"
style={{ width: screenWidth, height: 80 }}
autoLoad={false}
onAdReceived={handleAdReceived}
onAdFailedToReceive={handleAdFailedToReceive}
/>
{error && (
<Text style={styles.errorText}>에러: {error}</Text>
)}
</View>
</View>
)
}
const styles = StyleSheet.create({
container: {
flex: 1,
alignItems: 'center',
marginVertical: 50,
paddingHorizontal: 16,
},
title: {
fontSize: 24,
fontWeight: 'bold',
marginBottom: 20,
},
bannerContainer: {
marginTop: 20,
width: '100%',
},
loader: {
marginVertical: 20,
},
errorText: {
marginTop: 8,
color: 'red',
textAlign: 'center',
},
})
export default BannerExample