> ## Documentation Index
> Fetch the complete documentation index at: https://guide.daro.so/llms.txt
> Use this file to discover all available pages before exploring further.

# 마이그레이션 가이드

> 2.0.0 미만의 레거시 React Native SDK에서 DARO 2.0 SDK로 전환하는 순서를 안내합니다.

[DARO 2.0 SDK 소개](/ko/new-daro-sdk/overview)와 [공통 마이그레이션 가이드](/ko/new-daro-sdk/migration-guide)를 확인한 뒤 아래 순서대로 전환하세요. 기존 버전의 지원 범위는 [2.0.0 미만의 레거시 SDK 지원 안내](/ko/new-daro-sdk/legacy-support)를 참고하세요.

<Warning>
  기존 애드유닛 ID는 DARO 2.0 SDK에서도 계속 사용할 수 있으며 다시 발급할 필요가 없습니다. 새로 연동하거나 값을 복사할 때는 업데이트된 대시보드의 Ad Unit Key를 사용하세요. 2.0.0 미만의 레거시 SDK를 사용하는 앱 버전에는 기존 애드유닛 ID를 유지하고, 새로 생성한 애드유닛의 키를 전달하지 마세요. ID 호환 여부와 별개로 패키지, 초기화 설정, 광고 API 변경 사항을 확인하세요.
</Warning>

사용 중인 패키지에 따라 시작점이 다릅니다.

| 사용 중인 패키지 | 전환 방법 |
| - | - |
| `react-native-daro-m` | 패키지를 제거하고 `react-native-daro`로 교체합니다. `react-native-daro-m`에는 Expo config plugin이 없었으므로 3·4단계 설정을 새로 적용합니다. |
| `react-native-daro` (2.0.0 미만) | 같은 패키지를 2.0.0 이상으로 업데이트하고, 기존 키 파일과 Expo config plugin 설정을 2·4단계에 따라 교체합니다. |

## 1. 대시보드 업데이트

* DARO 대시보드에서 전환할 앱을 확인하고 업데이트를 완료하세요.
* Android와 iOS 앱 각각의 **Integration Key**와 Ad Unit Key를 확인하세요.

## 2. 기존 키 파일과 설정 제거

* 프로젝트에서 `daro-services.json`, `daro-service.json`, `daro-key.txt`, `android-daro-key.txt`, `ios-daro-key.txt`와 이 파일들을 참조하는 설정을 제거하세요. Xcode에 등록된 파일 참조와 **Copy Bundle Resources** 항목도 확인하세요.
* `android/gradle.properties`와 빌드 스크립트에서 기존 `daroAppKey` 설정을 제거하세요.
* Expo config plugin을 사용했다면 `daroAppKey`, `daroKeyFile`, `admobAppId`를 모두 제거하세요.

<Warning>
  - DARO 2.0 SDK의 config plugin은 위 세 가지 레거시 설정이 남아 있으면 오류를 내고 prebuild를 중단합니다.
  - `admobAppId`는 iOS 설정에만 있던 값이므로 함께 확인하세요.
</Warning>

## 3. DARO 연동 도구 설정

* `react-native-daro-m`을 사용했다면 제거하고 `react-native-daro`를 설치하세요.
* 기존 `react-native-daro` 사용자는 같은 패키지를 업데이트하세요.

```bash theme={null}
npm uninstall react-native-daro-m
npm i react-native-daro@2.0.0
```

* 두 패키지는 서로 다른 네이티브 SDK를 내려받으므로 함께 두지 마세요.

* [Android 마이그레이션 가이드](/ko/sdk-integration-v2/android/migration-guide)와 [iOS 마이그레이션 가이드](/ko/sdk-integration-v2/ios_new/migration-guide)에 따라 새 SDK에 필요한 빌드 도구를 준비하세요.

* Expo 프로젝트는 [시작하기](/ko/sdk-integration-v2/react-native/get-started)의 config plugin을 사용합니다.

* React Native CLI 프로젝트는 같은 문서의 수동 설정을 따르세요.

* 기존 플러그인을 새 플러그인과 함께 적용하지 마세요.

<Note>
  - `react-native-daro`는 Expo 50 이상을 peer 의존성으로 요구합니다.
  - 그보다 낮은 버전을 사용한다면 Expo를 먼저 올리거나 React Native CLI 수동 설정을 사용하세요.
</Note>

## 4. Integration Key 및 앱 설정

* 대시보드에서 플랫폼별 앱의 Integration Key를 받아 설정하세요.
* Android와 iOS에는 각각 해당 앱의 키를 사용합니다.
* Expo config plugin은 플랫폼마다 키 하나만 받습니다.

```json 변경 전 app.json theme={null}
{
  "expo": {
    "plugins": [
      [
        "react-native-daro",
        {
          "ios": {
            "daroAppKey": "기존 iOS APP KEY",
            "daroKeyFile": "./ios-daro-key.txt",
            "admobAppId": "ca-app-pub-xxxxxxxx~xxxxxxxx"
          },
          "android": {
            "daroAppKey": "기존 Android APP KEY",
            "daroKeyFile": "./android-daro-key.txt"
          }
        }
      ]
    ]
  }
}
```

```json 변경 후 app.json theme={null}
{
  "expo": {
    "plugins": [
      [
        "react-native-daro",
        {
          "ios": {
            "daroIntegrationKey": "발급받은 iOS INTEGRATION KEY"
          },
          "android": {
            "daroIntegrationKey": "발급받은 Android INTEGRATION KEY"
          }
        }
      ]
    ]
  }
}
```

<Warning>
  * `npx expo prebuild`는 3단계에서 패키지를 교체한 뒤에 실행하세요.
  * `app.json`의 `react-native-daro` plugin은 `node_modules`에서 해석됩니다. 레거시 패키지가 설치된 상태로 실행하면 이전 plugin이 로드되어 새 설정을 처리하지 못합니다.
</Warning>

* 설정을 바꾼 뒤 `npx expo prebuild`를 실행하세요.
* 수동 연동은 [시작하기](/ko/sdk-integration-v2/react-native/get-started)의 플랫폼별 설정을 따르고, iOS는 `ios/` 디렉터리에서 `pod install`을 실행하세요.

## 5. app-ads.txt 업데이트

* [app-ads.txt 설정 가이드](/ko/app-ads-txt-settings)에 따라 대시보드에서 제공하는 최신 내용을 게시하세요.
* 대시보드에 등록한 웹사이트에서 파일에 접근할 수 있는지 확인하세요.

## 6. SDK 의존성과 코드 변경

### import 경로 변경

* `react-native-daro-m`에서 가져오던 import 경로를 모두 바꾸세요.

```javascript theme={null}
// 변경 전
import { AdBannerView, AdFormat, initialize } from "react-native-daro-m";

// 변경 후
import { AdBannerView, AdFormat, initialize } from "react-native-daro";
```

### placement 제거

* 광고 생성 인자와 배너·네이티브 컴포넌트의 `placement`가 제거되었습니다.

```javascript theme={null}
// 변경 전
<AdBannerView
  style={styles.bannerView}
  adFormat={AdFormat.BANNER}
  adUnitId={BANNER_AD_UNIT_ID}
  placement="main_bottom"
/>

// 변경 후
<AdBannerView
  style={styles.bannerView}
  adFormat={AdFormat.BANNER}
  adUnitId={BANNER_AD_UNIT_ID}
/>
```

### 정적 광고 API에서 Hook 또는 인스턴스 API로

* 인터스티셜·리워드·라이트 팝업의 정적 API(`InterstitialAd.loadAd` 등)는 DARO 2.0 SDK에서도 같은 형태로 동작하지만 deprecated입니다.
* 한 번에 옮기지 않아도 앱은 빌드되므로 포맷별로 나누어 전환할 수 있습니다.

<Warning>
  - 정적 리스너(`InterstitialAd.addAdLoadedEventListener` 등)는 Hook이나 인스턴스로 로드한 광고의 이벤트를 받지 못합니다.
  - 한 포맷의 로드를 새 API로 옮길 때는 그 포맷의 이벤트 리스너도 함께 옮기세요.
  - 로드만 옮기고 리스너를 남겨두면 콜백이 호출되지 않습니다.
</Warning>

```javascript 변경 전 — 정적 API theme={null}
import { InterstitialAd } from "react-native-daro-m";

InterstitialAd.addAdLoadedEventListener(() => {
  InterstitialAd.showAd(INTERSTITIAL_AD_UNIT_ID);
});

InterstitialAd.loadAd(INTERSTITIAL_AD_UNIT_ID);
```

```javascript 변경 후 — Hook API theme={null}
import { Button } from "react-native";
import { useInterstitialAd } from "react-native-daro";

function InterstitialAdButton() {
  const { isLoaded, load, show } = useInterstitialAd(INTERSTITIAL_AD_UNIT_ID, {
    onLoadFailed: (error) => console.log(error.message),
  });

  return (
    <Button
      title={isLoaded ? "광고 보기" : "광고 불러오기"}
      onPress={() => (isLoaded ? show() : load())}
    />
  );
}
```

* 컴포넌트 밖에서 광고를 관리한다면 인스턴스 API를 사용하세요.
* 리스너를 등록하면 해제 함수를 돌려줍니다.

```javascript 변경 후 — 인스턴스 API theme={null}
import { AdEventType, InterstitialAd } from "react-native-daro";

const ad = InterstitialAd.createForAdRequest(INTERSTITIAL_AD_UNIT_ID);
const removeLoadedListener = ad.addAdEventListener(AdEventType.LOADED, () => {
  ad.show();
});

ad.load();

// 더 이상 사용하지 않을 때
removeLoadedListener();
ad.removeAllListeners();
```

### 초기화 순서

* `initialize()`가 끝난 뒤에만 광고를 로드하고 배너·네이티브 컴포넌트를 렌더링하세요.
* 동의 상태를 설정하는 앱은 `setGdpr`, `setCcpa`, `setCoppa`를 `initialize()` 전에 호출하세요. 아동 대상 앱의 `setCoppa`는 초기화 요청부터 적용되어야 합니다.

### 광고 포맷별 확인

| 광고 포맷 | 확인할 내용 |
| - | - |
| [배너 / MREC](/ko/sdk-integration-v2/react-native/ad-formats/banner) | `AdBannerView`에서 `placement`를 제거하고 `adFormat`과 컴포넌트 크기를 확인하세요. |
| [네이티브](/ko/sdk-integration-v2/react-native/ad-formats/native) | `NativeAdView`에서 `placement`를 제거하고 구성 요소 바인딩을 확인하세요. |
| [인터스티셜](/ko/sdk-integration-v2/react-native/ad-formats/interstitial) | `useInterstitialAd` 또는 인스턴스 API로 옮기고 이벤트 콜백을 확인하세요. |
| [리워드](/ko/sdk-integration-v2/react-native/ad-formats/rewarded) | `useRewardedAd`로 옮기고 `onReceivedReward` 보상 콜백을 확인하세요. |
| [라이트 팝업](/ko/sdk-integration-v2/react-native/ad-formats/lightpopup) | `useLightPopupAd`로 옮기고 `load({ configuration })`의 설정 적용을 확인하세요. |

## 전환 후 추가로 사용할 수 있는 기능

* `react-native-daro-m`에서는 제공하지 않던 [네이티브 광고](/ko/sdk-integration-v2/react-native/ad-formats/native)를 사용할 수 있습니다.
* 광고 콜백의 `AdInfo`에 `mediationPlatform`과 `adNetwork`가 추가되어 어떤 디맨드가 광고를 채웠는지 확인할 수 있습니다. 기존 필드는 그대로 유지됩니다.
* 네이티브 광고는 `adChoicesPosition`으로 AdChoices 아이콘의 선호 위치를 지정할 수 있습니다.

## 배포 전 확인

* Android와 iOS 앱을 각각 다시 빌드하고 실제 기기에서 사용하는 모든 광고 형식의 로드, 노출, 닫힘과 콜백을 확인하세요.
* 리워드 비디오 광고를 사용한다면 보상 콜백을 함께 확인하세요.
* 2.0.0 미만의 레거시 SDK를 사용하는 배포 버전에는 기존 Ad Unit ID를 유지하세요.
