서버 간 통신 - SESSION 엔드포인트 API 참조

문서

세션 엔드포인트 API 참조

SDK 구현 대신 서버 간 연동을 통해 Singular의 REST API를 사용하여 사용자 세션을 추적하고 앱 설치, 리인게이지먼트 및 유지율 지표에 대한 기여도 추적을 활성화하세요.


개요

서버 간 연동 사용 사례

Singular REST API는 앱이 기기별 데이터를 백엔드로 전달하고, 백엔드가 Singular 서버로 전송하여 어트리뷰션 처리 및 분석 보고를 수행하는 직접적인 서버 간 연동을 지원합니다.

지원 기능:

  • 설치 어트리뷰션: 마케팅 캠페인에 대한 퍼스트 터치 어트리뷰션
  • 리인게이지먼트 어트리뷰션: 재방문 사용자에 대한 멀티터치 어트리뷰션
  • 유지율 지표: 세션 기반 참여 추적
  • 이벤트 추적: 맞춤형 인앱 이벤트 측정

데이터 흐름 아키텍처

서버 간 연동은 4단계 데이터 전송 프로세스를 따릅니다.

  1. 클라이언트 수집: 앱이 필요한 기기 및 애플리케이션 데이터를 수집
  2. 서버 전송: 앱이 수집된 데이터를 백엔드 서버로 전달
  3. Singular API 호출: 서버가 Singular REST API 엔드포인트로 데이터 전송
  4. 응답 처리: 서버가 Singular의 응답을 수신하고 처리합니다

Session Data Flow Diagram


주요 고려 사항

핵심 요구사항:

  • 실시간 처리: 요청은 개별적으로 처리되며—배치 지원 없음
  • 순차적 순서: 이벤트는 시간순으로 전송되어야 함
  • 중복 제거 없음: Singular는 데이터를 중복 제거하지 않음— 서버 측 중복 제거 구현
  • 데이터 영속성: 수집된 장치 수준 데이터는 삭제 불가—전송 전 유효성 검증
  • 세션 우선: 이벤트 추적 전에 세션이 설정되어야 함

연동 이점:

  • 유연성: 데이터 수집 및 전송 시점에 대한 완전한 제어권
  • 기능 동등성: 적절한 데이터 제공 시 모든 SDK 기능 지원
  • 맞춤형 구현: 특정 백엔드 아키텍처에 연동을 조정

세션 관리

SESSION 엔드포인트는 어트리뷰션 및 추적을 위한 사용자 세션 초기화를 위해 앱 실행 이벤트를 Singular에 알립니다.

세션 전송 시기

세션 트리거

다음 앱 라이프사이클 이벤트에 대해 SESSION 요청을 전송합니다:

  • 신규 설치: 설치 후 첫 앱 실행
  • 종료 상태 실행: 완전히 종료된 상태에서 앱 실행
  • 백그라운드에서 포그라운드로: 타임아웃 기간 후 앱이 포그라운드로 복귀 (권장: 60초)

세션 시간 초과 로직

앱이 잠시 백그라운드 상태일 때 과도한 SESSION 요청을 방지하기 위해 세션 타임아웃을 구현하십시오.

권장 구현:

  • 타임아웃 기간: 60초(1분)
  • 포그라운드 < 타임아웃: 타임아웃 기간 내에 앱이 포그라운드로 복귀할 경우 SESSION 전송하지 않음
  • 포그라운드 > 타임아웃: 앱이 타임아웃 기간 이후에도 백그라운드 상태를 유지할 경우 SESSION 전송
  • 앱 라이프사이클 추적: 앱 라이프사이클 이벤트와 타이머를 활용하여 세션 상태 관리

딥 링크 지원: 딥 링크, 유니버설 링크 또는 openuri 매개변수가 설정된 앱 링크를 통해 앱이 열릴 경우, 타임아웃 상태와 관계없이 항상 SESSION을 전송합니다.


어트리뷰션 처리

세션 기반 어트리뷰션

Singular는 SESSION 요청을 처리하여 어트리뷰션 유형을 결정하고 적절한 워크플로를 트리거합니다.

세션 유형 Singular 처리 어트리뷰션 결과
첫 세션 (신규 설치) 설치 어트리뷰션 프로세스 트리거됨 설치를 마케팅 캠페인에 기여
리인게이지먼트 자격 부여 리인게이지먼트 기여도 프로세스 트리거됨 사용자 귀환을 캠페인 또는 딥 링크에 귀속
표준 세션 리텐션 추적을 위한 세션 기록 사용자 활동 및 참여 지표에 반영

자세히 알아보기: 리인게이지먼트 기여도 FAQ


이벤트 순서 요구사항

세션 및 이벤트 타이밍은 어트리뷰션 정확도와 데이터 품질에 직접적인 영향을 미칩니다.

중요한 순서 규칙:

  1. 세션 우선 이벤트: 해당 세션의 모든 이벤트 전에 반드시 Singular 세션이 수신되어야 합니다
  2. 실시간 이벤트 전송: 앱 내 이벤트는 해당 세션 이후 실시간으로 전송되어야 함
  3. 순차적 처리: 잘못된 세션 순서는 데이터 불일치 및 속성 오류를 초래합니다

고급 옵션

확장 기능

Singular S2S 연동은 추가 세션 매개변수가 필요한 고급 기능을 지원합니다. 고급 기능: 심링크, SKAdNetwork 및 크로스 디바이스 추적 요구사항에 대한 고급 S2S 옵션을 검토하십시오.

고급 기능: 딥 링크, SKAdNetwork 및 크로스 디바이스 추적 요구 사항에 대해서는 고급 S2S옵션 을 검토하십시오.


API 엔드포인트 사양

SESSION 엔드포인트는 쿼리 매개변수에 기기, 애플리케이션 및 어트리뷰션 데이터를 포함하는 GET 요청을 수락합니다.

엔드포인트 URL

기본 URL 및 메서드

GET https://s2s.singular.net/api/v1/launch

요청 형식:

GET /api/v1/launch?param1=value1&param2=value2

요청 본문: 요청 본문을 제공하지 마십시오—모든 매개변수는 GET 메서드를 사용하여 URL 쿼리 매개변수로 전송해야 합니다.


필수 매개변수

모든 SESSION 요청에는 적절한 값과 형식으로 다음 필수 매개변수가 포함되어야 합니다.

API 인증

SDK 키

매개변수 유형 설명
a string

API 인증을 위한 Singular SDK 키.

검색 위치: Singular UI → 메인 메뉴 → 개발자 도구

예시: sdkKey_afdadsf7asf56

중요: 리포팅 API 키를 사용하지 마십시오—요청이 거부됩니다.


기기 식별자

플랫폼별 식별자

기기 식별자는 플랫폼 및 가용성에 따라 다릅니다. 해당 플랫폼에 적용 가능한 모든 식별자를 포함하십시오.

매개변수 플랫폼 설명
idfa iOS

광고주 식별자(IDFA) 광고 추적 및 캠페인 기여도 분석을 가능하게 합니다.

ATT 요구 사항: iOS 14.5 이상에서는 앱 추적 투명성 프레임워크를 통한 사용자 동의가 필요합니다.

  • IDFA를 사용할 수 없는 경우(사용자가 ATT 프롬프트를 거부한 경우) 매개변수를 생략하십시오.
  • NULL 또는 빈 문자열을 절대 전달하지 마십시오
  • IDFA 조회

예시:DFC5A647-9043-4699-B2A5-76F03A97064B

idfv iOS

Identifier for Vendors (IDFV) 동일 공급업체의 모든 앱에서 일관되게 유지됩니다.

항상 필수: ATT 상태나 IDFA 사용 가능 여부와 관계없이 반드시 포함되어야 함

예시:21DB6612-09B3-4ECC-84AC-B353B0AF1334

aifa Android
(Google Play)

Google 광고 ID(GAID)는 Android에서 사용자가 재설정 가능한 광고 추적을 가능하게 합니다.

  • Google Play 기기에서 필수
  • Google Play가 아닌 기기에서는 생략
  • 사용 불가능한 경우 생략 — 절대 NULL 또는 빈 문자열을 전달하지 마십시오
  • AIFA 가져오기

예시:8ecd7512-2864-440c-93f3-a3cabe62525b

asid Android
(Google Play)

Android 앱 세트ID 동일 개발자의 앱 간에 개인정보 보호를 고려한 추적을 제공합니다. 항상 필수: GAID 유무와 관계없이 Google Play 기기에서 반드시 포함되어야 합니다.

항상 필요: GAID 사용 가능 여부와 관계없이 Google Play 기기에 반드시 포함되어야 함

예시:edee92a2-7b2f-45f4-a509-840f170fc6d9

amid Android
(Amazon)

Amazon AdvertisingID Google Play 서비스가 없는 Amazon 기기용.

  • Amazon Fire 기기에 필수
  • 사용 불가능한 경우 생략
  • AMID 검색

예시:df07c7dc-cea7-4a89-b328-810ff5acb15d

oaid Android
(중국 OEM)

Google Play 서비스가 없는 중국산 기기용 오픈 광고 식별자(OAID) (화웨이, 샤오미, OPPO 등).

  • Google Play 서비스가 없는 중국 OEM 기기에 필수
  • 사용 불가능한 경우 생략
  • OAID 조회

예시:01234567-89abc-defe-dcba-987654321012

andi Android
(비-Google Play)

Android ID는 기기에서 생성된 64비트 식별자입니다.

제한된 사용: Google Play 기기에서는 사용 금지—대신 AIFA 및 ASID 사용. 다른 식별자가 없으며 앱이 Google Play를 통해 배포되지 않은 경우에만 전송. [구글 플레이를 통해 배포되지 않은 경우에만 사용 가능]

예시: fc8d449516de0dfb

sdid PC, Xbox, PlayStation, Nintendo, MetaQuest, CTV

Singular 기기 ID는 클라이언트에서 생성된 UUIDv4로, 유일한 앱 설치를 나타냅니다.

주 식별자: PC 및 콘솔 애플리케이션에 사용되는 유일한 기기 식별자

예시:40009df0-d618-4d81-9da1-cbb3337b8dec

sing 기업 전용

표준 식별자를 사용할 수 없는 특수 사용 사례를 위한 클라이언트 정의 식별자.

제한됨: 엔터프라이즈 고객 전용— Singular 솔루션 엔지니어가 앱별로 활성화해야 함. 자세한 내용은 CSM에 문의하십시오.

예시:da534a95-1b1b-47d4-94b6-07955ec85177


기기 매개변수

기기 정보

매개변수 설명
p

애플리케이션의 플랫폼.

허용 값 (대소문자 구분):

  • Android
  • iOS
  • PC
  • Xbox
  • Playstation
  • 닌텐도
  • 메타퀘스트
  • CTV

예: Android

ip

장치의 공용 IPv4 IP 주소. IPv6 지원되나 광고 네트워크와의 속성 호환성을 위해 IPv4 권장.

예시: 172.58.29.235

ve

세션 시점의 기기 OS 버전.

예시: 9.2

ma
iOS, Android

기기 제조사(제조사명). 반드시 mo (모델)과 함께 사용해야 합니다.

기기 제조사 조회

예시: Samsung, LG, Apple

mo
iOS, Android

기기 모델. ma (제조사)와 함께 사용해야 합니다.

기기 모델 조회

예시: iPhone 4S, Galaxy SIII

lc
iOS, Android

IETF 로케일 태그—언어 및 국가 코드 두 글자를 밑줄(-)으로 구분.

기기 로케일 조회

예시: en_US

bd
iOS, Android

URL 인코딩된 기기 빌드 식별자.

기기 빌드 가져오기

예: Build%2F13D15


애플리케이션 매개변수

앱 정보

매개 변수 설명
i

앱 식별자(대소문자 구분).

  • Android: 패키지 이름(예: com.singular.app)
  • iOS: 번들 ID (예: com.singular.app)
  • PC/콘솔: 지정된 식별자

예시: com.singular.app

app_v

애플리케이션 버전.

예시: 1.2.3

install

세션이 설치 또는 재설치 후 첫 세션인지 여부를 나타냅니다. 또는 재설치.

  • true - 새로 설치/재설치 후 첫 세션
  • false - 후속 세션 (앱이 이미 설치된 상태)

필요 목적: 재설치 추적 기능

예시: true

install_time
iOS, Android

첫 앱 설치 시점의 유닉스 타임스탬프.

예시: 1510040127

update_time
iOS, Android

마지막 앱 업데이트의 유닉스 타임스탬프.

예시: 1510040127

att_authorization_status
iOS

앱 추적 투명성(ATT) 상태 코드(iOS 14.5 이상).

상태 값:

  • 0 - 미확인 (알림 미표시)
  • 1 - 제한됨 (기기 수준 추적 비활성화됨)
  • 2 - 거부됨 (사용자가 권한을 거부함)
  • 3 - 승인됨 (사용자가 권한 부여)

항상 필요: ATT가 구현되지 않은 경우에도 0 (미확정)을 전달하십시오.

예시: 3


사기 방지 매개변수

설치 소스 검증

매개변수 설명
install_source
Android, PC

소스 패키지 이름 또는 스토어 식별자를 설치합니다.

Android:소스 패키지 이름 설치

Android 예시: com.android.vending (Google Play 스토어)

PC 지원 스토어:

  • steam
  • 에픽
  • 마이크로소프트 스토어
  • 험블스토어
  • GOG
  • 자체 유통
install_receipt
iOS

사기 검증을 위한 Base64 인코딩된 iOS 설치 영수증.

예시(축약):MIJF9wYJKoZIhvcNAQcCoIJF6DCCReQCAQExCzAJBgUrDgMCGgUAMII1m...


딥 링크 매개 변수

딥 링크 지원

매개 변수 설명
openuri
iOS, Android

앱을 실행한 URL 인코딩 딥 링크, 유니버설 링크 또는 앱 링크.

원본 URL:myapp://home/page?queryparam1=value1&queryparam2=value2

인코딩된 예시:myapp%3A%2F%2Fhome%2Fpage%3Fqueryparam1%3Dvalue1%26queryparam2%3Dvalue2

ddl_enabled
iOS, Android

응답에 지연 딥 링크 URL을 기대하는지 여부를 나타냅니다.

  • true - 응답에 지연된 딥 링크를 기대함 응답
  • false - 지연된 딥 링크를 응답에서 기대하지 않음

예시 응답:

{
  "deferred_deeplink": "myapp://deferred-deeplink",
  "status": "ok",
  "deferred_passthrough": "passthroughvalue"
}
singular_link_resolve_required
iOS, Android

Singular 짧은 링크를 긴 링크로 변환해 달라는 요청입니다. openuri 에 Singular 짧은 링크를 포함하여 사용해야 합니다.

  • true - 확장된 긴 링크 반환
  • false - 링크 변환하지 않음

예시 응답:

{
  "status":"ok",
  "resolved_singular_link":"https://myapp.sng.link/A59c0/nha7?_dl=myapp%3A%2F%2Fdeeplink&_ddl=myapp%3A%2F%2Fdeferred-deeplink&_p=passthroughvalue"
}

고급 어트리뷰션 매개변수

플랫폼 어트리뷰션 향상

매개변수 설명
install_ref
Android (Google Play)
네이티브 PC (Google Play 게임)

JSON URL 인코딩된 Google 설치 리퍼러 정보. Android 및 Google Play Games PC 설치에 대해 가장 정확한 어트리뷰션을 제공합니다.

Android JSON 구조:

{
   "installBeginTimestampSeconds":"1568939453",
   "referrer":"utm_source=google-play&utm_medium=organic",
   "clickTimestampSeconds":"0",
   "referrer_source":"service",
   "current_device_time":"1568944524"
}

네이티브 PC JSON 구조:

{
   "install_time_epoch_seconds":"1568939453",
   "install_referrer":"utm_source=google-play&utm_medium=organic"
}

필수 적용 대상:

  • Facebook 사용자 수준 내보내기
  • 데이터 목적지 공유
  • 포스트백 정확도

추가 정보:

 

URL 인코딩 예시:%7B%22installBeginTimestampSeconds%22%3A%221568939453%22...

meta_ref
Android (Google Play)

2025년 6월 18일 기준:Meta Advanced Mobile Measurement(AMM) Meta 설치 리퍼러 구현이 더 이상 필요하지 않습니다. AMM이 활성화된 경우 권장하지 않습니다.

세분화된 사용자 수준 어트리뷰션 데이터를 위한 JSON URL 인코딩된 Meta Install Referrer.

JSON 구조:

{
  "install_referrer": {
    "utm_source":"apps.facebook.com",
    "utm_campaign": "fb4a",
    "utm_content": {
      "source":{
        "data":"c7e6b890bf18a059c2185650bdb1af3dced7...",
        "nonce":"24859720343e2381daee9f39ae61"
        },
      "app":533744218636280,
      "t":1731181327
      },
    "is_ct":1,
    "actual_timestamp":1731181444
  }
}

자세히 알아보기: Meta Referrer FAQ

attribution_token
iOS

AdServices 프레임워크의 Apple Search Ads 어트리뷰션 토큰 (iOS 14.3 이상).

사용 방법: 설치/재설치 후 첫 앱 실행 시attributionToken() 호출.

예시 (축약):KztLg%2FIkNsWDMuBMOU%2BySnkPU5myJb4OFmeaMUE%2BTqQJP...


선택적 매개변수

선택적 매개변수는 추적 기능을 강화하고 고급 기능을 지원합니다. .

타임스탬프 매개변수

매개변수 설명
utime

세션의 10자리 유닉스 타임스탬프.

예시: 1483228800

umilisec

밀리초를 포함한 13자리 유닉스 타임스탬프.

예: 1483228800000


네트워크 및 위치 매개변수

매개 변수 설명
use_ip

ip 매개변수 대신 HTTP 요청에서 IP 주소를 추출하도록 지시합니다.

제한 사항:

  • Singular의 IP 기반 지리적 위치 추적을 방지합니다.
  • country 매개변수를 통해 2자리 국가 코드 제공 매개변수와 상호 배타적—둘 다 사용하지 마십시오
  • ip 매개변수와 상호 배타적—둘 다 사용하지 마십시오
  • 데이터 거부 방지를 위해 ip 또는 use_ip중 하나를 반드시 제공해야 함

예시: true

country

ISO 3166-1alpha-2 2자리 국가 코드.

필요 시점: IP 주소가 없거나 use_ip=true 가 없는 경우

예시: US

ua

URL 인코딩된 사용자 에이전트 문자열.

원본: Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X) AppleWebKit/605.1.15...

인코딩된 형태: Mozilla%2F5.0%20(iPhone%3B%20CPU%20iPhone%20OS%2014_0...

c
iOS, Android

네트워크 연결 유형.

허용 값: wifi, carrier

예시: wifi

cn
iOS, Android

인터넷 공급자의 통신사 이름.

예시: Comcast


사용자 정의 속성

매개 변수 설명
global_properties

사용자 정의 키-값 쌍이 포함된 URL 인코딩된 JSON 객체.

제한 사항:

  • 최대 5개의 키-값 쌍
  • 키 및 값당 최대 200자

JSON: {"key1":"value1","key2":"value2"}

URL 인코딩: %7B%22key1%22%3A%22value1%22%2C%22key2%22%3A%22value2%22%7D


제거 추적 지원

매개변수 설명
apns_token
iOS

16진수 인코딩된 Apple 푸시 알림 서비스(APNs) 기기 토큰.

예시: b0adf7c9730763f88e1a048e28c68a9f806ed032fb522debff5bfba010a9b052

fcm
Android

Firebase Cloud Messaging 기기 토큰.

예시: bk3RNwTe3H0CI2k_HHwgIpoDKCIZvvD...MExUdFQ3P1


데이터 개인정보 보호 매개변수

매개변수 설명
data_sharing_options

데이터 공유에 대한 최종 사용자의 동의를 URL 인코딩한 JSON. 모든 후속 SESSION 및 EVENT 요청에 지속적이며 전달되어야 함. 사용자 동의(옵트인):

사용자 동의(옵트인):

{"limit_data_sharing":false}

사용자 거부(옵트아웃):

{"limit_data_sharing":true}

URL 인코딩 예시: %7B%22limit_data_sharing%22%3Atrue%7D

dnt
iOS, Android

추적 금지 상태.

  • 1 - 추적 금지 활성화됨
  • 0 - 추적 금지 비활성화

예시: 0

dntoff
iOS, Android

추적 금지 기능이 꺼져 있는지 여부를 나타냅니다.

  • 0 - 추적 금지 활성화됨 (OFF=false)
  • 1 - 추적 금지 비활성화 (OFF=true)

예시: 1


크로스 디바이스 지원

매개 변수 설명
custom_user_id

크로스 디바이스 추적을 위한 내부 사용자 ID.

예: 123456789abcd


SKAdNetwork 지원

매개 변수 설명
skan_conversion_value
iOS

세션 시간 기준 최신 SKAdNetwork 전환 값.

자세히 알아보기: SKAdNetwork 구현

예시: 7

skan_first_call_timestamp
iOS

SKAdNetwork API 첫 호출 시점의 유닉스 타임스탬프.

예: 1483228800

skan_last_call_timestamp
iOS

세션 시간 기준 SKAdNetwork API에 대한 가장 최근 호출의 유닉스 타임스탬프. 예시: xml-ph-0000@deepl.internal

예시: 1483228800


Google Ads ICM 지원 (베타)

매개변수 설명
odm_info
iOS

Google Ads 연동 전환 측정(베타)에 필수적입니다. Google Ads ICM 문서

Google Ads ICM 문서

odm_error
iOS

Google Ads 연동 전환 측정(베타)에 필수적입니다. (Beta).

Google Ads ICM 문서


요청 예시

샘플 코드는 여러 프로그래밍 언어에 걸친 SESSION 엔드포인트 연동을 보여줍니다.

참고: 코드 예제에는 필수 매개변수가 모두 포함되지 않을 수 있습니다. 실제 운영 환경 적용 전 전체 매개변수 목록을 반드시 확인하십시오. 개발/테스트 시 고유한 i (앱 식별자)를 사용하십시오.

PYTHONCURLHTTPJAVA

Python 예시

import requests

params = {
    'a': 'sdk_key_here',
    'p': 'Android',
    'i': 'com.singular.app',
    'ip': '10.1.2.3',
    've': '9.2',
    'ma': 'samsung',
    'mo': 'SM-G935F',
    'lc': 'en_US',
    'aifa': '8ecd7512-2864-440c-93f3-a3cabe62525b',
    'asid': 'edee92a2-7b2f-45f4-a509-840f170fc6d9',
    'install': 'true',
    'n': 'MyCoolAppName',
    'bd': 'Build/13D15',
    'app_v': '1.2.3',
    'openuri': 'myapp://home/page?queryparam1=value1',
    'ddl_enabled': 'true',
    'install_source': 'com.android.vending',
    'install_time': 1510040127,
    'update_time': 1510090877
}

response = requests.get('https://s2s.singular.net/api/v1/launch', params=params)
print(response.json())

응답 코드 및 오류

SESSION 엔드포인트는 요청 성공 또는 실패를 나타내는 HTTP 상태 코드와 JSON 응답을 반환합니다.

전체 오류 문서: S2S 응답 코드 및 오류 처리


테스트 및 검증

Singular SDK 콘솔을 사용하여 실시간 데이터 검증을 통해 프로덕션 배포 전 S2S 연동을 확인하십시오.

테스트 절차

종단 간 검증

  1. 테스트 기기 등록: 기기 광고 ID 획득 후 Singular SDK 콘솔에추가
  2. 콘솔 로깅 활성화: 테스트 데이터 수집을 위해 SDK 콘솔에 기기 식별자 추가
  3. 개발용 앱 ID 사용: 앱 식별자를 개발 버전(예: com.singular.app.dev)으로 재정의하여 테스트 데이터를 프로덕션 데이터와 분리
  4. 앱 실행: 종료된 상태에서 앱을 열어 세션을 트리거
  5. 클라이언트 데이터 검증: 앱이 모든 필수 Singular 데이터 포인트를 서버로 전송하는지 확인
  6. 서버 요청 확인: 서버가 모든 필수 매개변수와 함께 https://s2s.singular.net/api/v1/launch 로 SESSION 요청을 전송하는지 확인
  7. SDK 콘솔 확인: 몇 초 내에 SESSION 이벤트가 SDK 콘솔에 표시되어야 함
  8. 테스트 반복: 앱 진입 및 포그라운드 작업 시마다 SESSION이 트리거되는지 검증

SDK Console Session Event

중요 검증: 앱 실행/전경 모드 시 어떤 이벤트 요청보다 먼저 SESSION 이벤트가 발생하는지 확인. 순서 오류 시 어트리뷰션 오류 발생.

성공 지표: SDK 콘솔에 SESSION이 표시되면 엔드투엔드 연동 테스트를 성공적으로 완료한 것입니다!


추가 리소스

테스트 문서

종합 테스트 가이드: S2S 연동 테스트 가이드