

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 입찰 구성 및 템플릿 지정
<a name="yield-optimization-bid-construction"></a>

이 페이지에서는 MediaTailor가 템플릿에서 OpenRTB 입찰 요청을 작성하는 방법, 변수 보간 작동 방식, MediaTailor가 자동으로 설정하는 값에 대해 설명합니다.

## 구성 필드
<a name="yield-optimization-bid-construction-config-fields"></a>

재생 구성에서 수율 최적화를 활성화하면 네 개의 필드를 제공합니다.


| 필드 | 설명 | 필수 | 
| --- | --- | --- | 
| PublisherId | APS 게시자 ID(APS 등록에서 획득). 모든 입찰 요청에 대해 app.publisher.id에 주입됩니다. | 예 | 
| Region | APS 리전: AMERICAS, EUROPE또는 ASIA\_PACIFIC. APS 엔드포인트를 결정합니다. | 예 | 
| MinimumUnfilledDuration | MediaTailor가 입찰 요청을 트리거하기 전에 필요한 최소 채워지지 않은 초입니다. 로도 사용됩니다imp.video.minduration. | 예 | 
| OpenRtbTemplate | ORTB JSON 템플릿(최대 100KB). 입찰 요청 본문을 정의합니다. | 예 | 

## 입찰 요청 구성 방법
<a name="yield-optimization-bid-construction-how"></a>

광고 시간이 채워지지 않은 기간이 남아 있는 경우 MediaTailor는 다음 단계에서 입찰 요청을 구성합니다.

1. **템플릿 보간.** MediaTailor는 표준 [Mustache 템플릿 지정 구문을 사용하여 템플릿의](https://mustache.github.io/mustache.5.html) , , `{{session.*}}``{{player_params.*}}``{{avail.*}}``{{request.*}}`, `{{asset.*}}`, 및 `{{scte.*}}` 자리 표시자를 확인합니다. Mustache는 ADS URL 변수 대체에 `[ ]` 사용되는 대괄호와 `{{ }}`다른 이중 중괄호를 사용합니다.

1. **JSON 구문 분석.** 보간된 템플릿은 JSON으로 구문 분석됩니다.

1. **필드 추출 및 검증.** MediaTailor는 필수 필드를 추출하고 누락되거나 비어 있는 `BidRequestConfigurationError` 경우를 발생시킵니다.

1. **하드코딩된 필드 주입.** MediaTailor는 콘솔 구성 및 현재 가용 컨텍스트의 값(예: 구성된 게시자 ID`app.publisher.id`, 계산된 채워지지 않은 기간`imp.video.maxduration`)을 사용하여 자동으로 관리하는 필드를 재정의하거나 주입합니다.

1. **직렬화 및 제출.** 최종 BidRequest는 JSON으로 직렬화되고 HTTP POST로 APS 엔드포인트로 전송됩니다.

**중요**  
보간 후 필수 필드가 누락되거나 비어 있으면 입찰 요청이 실패`BidRequestConfigurationError`하고 요청이 APS로 전송되지 않습니다. 오류가 로깅되지만 재생은 정상적으로 계속됩니다(실패-열림).

## 콘솔 기본 템플릿
<a name="yield-optimization-bid-construction-default-template"></a>

MediaTailor 콘솔에서 수율 최적화를 활성화하면 다음과 같은 사전 채워진 템플릿이 시작점으로 제공됩니다. 애플리케이션의 값을 사용자 지정해야 합니다.

```
{
  "imp": [
    {
      "bidfloor": 5
    }
  ],
  "app": {
    "id": "{{player_params.app_id}}",
    "name": "{{player_params.app_name}}",
    "bundle": "{{player_params.bundle}}",
    "storeurl": "{{player_params.storeurl}}",
    "domain": "{{player_params.domain}}",
    "content": {
      "genre": "{{asset.genre}}",
      "contentrating": "{{asset.content_rating}}"
    }
  },
  "device": {
    "dnt": "{{player_params.dnt}}",
    "ua": "{{session.user_agent}}",
    "ip": "{{session.client_ip}}",
    "ifa": "{{player_params.device_ifa}}",
    "w": "{{player_params.device_width}}",
    "h": "{{player_params.device_height}}",
    "language": "{{player_params.language}}",
    "model": "{{player_params.model}}",
    "os": "{{player_params.os}}",
    "osv": "{{player_params.osv}}",
    "devicetype": "{{player_params.devicetype}}",
    "make": "{{player_params.make}}"
  },
  "user": {
    "consent": "{{player_params.consent}}"
  },
  "regs": {
    "gdpr": "{{player_params.gdpr}}",
    "us_privacy": "{{player_params.us_privacy}}",
    "gpp": "{{player_params.gpp_consent}}",
    "gpp_sid": "{{player_params.gpp_sid}}"
  }
}
```

**Field-by-field 설명:**


| Field | 카테고리 | 수행할 작업 | 
| --- | --- | --- | 
| imp[0].bidfloor | 선택 사항(기본값: 1.0) | 최소 CPM을 설정합니다. 콘솔 기본값은 5 USD입니다. 테스트 중에 더 나은 채우기 속도를 위해를 낮춥니다. | 
| app.id | APS 권장 | 앱 식별자입니다. 플레이어는를 전송해야 합니다playerParams.app\_id. | 
| app.name | APS 권장 | 앱 이름입니다. 플레이어는를 전송해야 합니다playerParams.app\_name. | 
| app.bundle | 필수 | 앱 번들 ID입니다. 플레이어는를 전송playerParams.bundle하거나를 정적 값으로 바꿔야 합니다(권장). | 
| app.storeurl | 필수 | 앱 스토어 URL입니다. 플레이어는를 전송playerParams.storeurl하거나를 정적 값으로 바꿔야 합니다(권장). | 
| app.domain | APS 권장 | 앱 도메인. 플레이어는를 전송해야 합니다playerParams.domain. | 
| app.content.genre | APS 권장 | 콘텐츠 소스 자산 메타데이터에서 채워집니다. | 
| app.content.contentrating | APS 권장 | 콘텐츠 소스 자산 메타데이터에서 채워집니다. | 
| device.dnt | APS 권장 | 추적 안 함 플래그. 플레이어는를 전송해야 합니다playerParams.dnt. | 
| device.ua | 필수 | 를 통해 최종 사용자의 사용자-에이전트 헤더에서 자동으로 채워집니다{{session.user\_agent}}. 플레이어 파라미터가 필요하지 않습니다. | 
| device.ip | 필수 | 를 통해 최종 사용자의 IP에서 자동으로 채워집니다{{session.client\_ip}}. 플레이어 파라미터가 필요하지 않습니다. | 
| device.ifa | APS 권장 | 광고 ID. 플레이어는를 전송해야 합니다playerParams.device\_ifa. | 
| device.w / device.h | APS 권장 | 화면 차원입니다. 플레이어는 playerParams.device\_width /를 전송해야 합니다device\_height. | 
| device.language | APS 권장 | 디바이스 언어입니다. 플레이어는를 전송해야 합니다playerParams.language. | 
| device.model | APS 권장 | 디바이스 모델. 플레이어는를 전송해야 합니다playerParams.model. | 
| device.os / device.osv | APS 권장 | OS 및 버전. 플레이어는 playerParams.os /를 전송해야 합니다osv. | 
| device.devicetype | 재정의 가능(기본값: 3) | IAB 디바이스 유형. 플레이어는를 전송해야 합니다playerParams.devicetype. 비어 있는 경우 기본값은 3(CTV)입니다. | 
| device.make | APS 권장 | 디바이스 제조업체. 플레이어는를 전송해야 합니다playerParams.make. | 
| user.consent | APS 권장(EU) | GDPR 동의 문자열(TCF). 플레이어는를 전송해야 합니다playerParams.consent. | 
| regs.gdpr | APS 권장(EU) | GDPR 플래그(0 또는 1). 플레이어는를 전송해야 합니다playerParams.gdpr. | 
| regs.us\_privacy | APS 권장(미국) | CCPA 문자열(예: 1YNY). 플레이어는를 전송해야 합니다playerParams.us\_privacy. | 
| regs.gpp | APS 권장 | 글로벌 프라이버시 플랫폼 동의 문자열입니다. 플레이어는를 전송해야 합니다playerParams.gpp\_consent. 더 나은 채우기 속도를 us\_privacy 위해 대신 선호됩니다. | 
| regs.gpp\_sid | APS 권장 | GPP 섹션 IDs(예: 미국 국적[7]의 경우). 플레이어는를 전송해야 합니다playerParams.gpp\_sid. | 

**중요**  
콘솔 기본값은 `app.bundle` 및와 같은 필수 필드에 `{{player_params.*}}`를 사용합니다`app.storeurl`. 플레이어가 이러한 파라미터를 보내지 않으면 입찰 요청이와 함께 실패합니다`BidRequestConfigurationError`. 모든 세션에 대해 동일한 필드(일반적으로 `app.bundle`, `app.storeurl``app.name`, 및 기타 앱 수준 식별자)의 경우 자리 표시자를 정적 값으로 바꾸는 것이 좋습니다(예: `"bundle": "com.yourcompany.app"`). , , `device.ua`, `device.ip` `device.ifa`GDPR 및 GPP 동의 문자열 또는 모든 reg 또는 사용자 객체 필드와 같이 최종 사용자별로 다른 필드를 하드코딩하지 마십시오. 또는 `{{session.*}}`에서 가져와야 합니다`{{player_params.*}}`.

**참고**  
콘솔 기본값은 템플릿`video.protocols`에 `video.mimes` 또는를 포함하지 않습니다. MediaTailor는 하드코딩된 폴백 값(`["video/mp4"]`mimes의 경우 , 프로토콜`[1,2,3,4,5,6,7,8]`의 경우 )이 제공되지 않은 경우 이를 사용합니다. 지원되는 형식을 제한하려는 경우 템플릿에 추가할 수 있습니다.

## 템플릿 보간(Mustache 템플릿 지정)
<a name="yield-optimization-bid-construction-interpolation"></a>

ORTB 템플릿은 동적 값 대체에 [Mustache 템플릿 구문을](https://mustache.github.io/mustache.5.html) 사용합니다. 자리 표시자는 이중 중괄호를 사용합니다`{{ }}`.

### 사용 가능한 템플릿 변수
<a name="yield-optimization-bid-construction-variables"></a>

ORTB 템플릿은 ADS URL 템플릿에서 사용할 수 있는 것과 동일한 동적 변수를 사용할 수 있습니다. 여기에는 세션 변수(예: , `{{session.user_agent}}``{{session.client_ip}}`), 플레이어 파라미터(`{{player_params.*}}`), 자산 메타데이터(`{{asset.*}}`), 가용 컨텍스트(`{{avail.*}}`) 및 SCTE 신호 데이터()가 포함됩니다`{{scte.*}}`.

사용 가능한 변수의 전체 목록과 설명은 섹션을 참조하세요[ADS 요청에 대한 MediaTailor 동적 광고 변수](variables.md). MediaTailor URL이 플레이어 파라미터 값을 템플릿으로 대체하기 전에 이를 디코딩하는 방법은이 페이지의 [인코딩 및 디코딩 동작](#yield-optimization-bid-construction-encoding)뒷부분을 참조하세요.

ORTB 템플릿에서 가장 일반적으로 사용되는 변수는 다음과 같습니다.
+ `{{session.user_agent}}`: 최종 사용자의 사용자-에이전트 헤더(에 사용`device.ua`).
+ `{{session.client_ip}}`: 최종 사용자의 IP 주소(에 사용`device.ip`).
+ `{{player_params.*}}`: 세션 초기화 중에 플레이어가 전달하는 사용자 지정 값입니다.
+ `{{asset.*}}`: 오리진의 콘텐츠 메타데이터(예: , `asset.genre``asset.content_rating`).

**주의**  
`dnt` 또는와 같은 숫자 필드의 경우에도 항상 자리 표시자를 따옴표로 묶습니다`devicetype`. 자리 표시자가 빈 문자열로 확인되고 따옴표로 묶이지 않은 경우(예: `"dnt": {{player_params.dnt}}`) 결과는 유효하지 않은 JSON이며 전체 입찰 요청이와 함께 실패합니다`BidRequestConfigurationError`. 대신 `"dnt": "{{player_params.dnt}}"`을 사용하세요. APS는 문자열로 전달된 숫자 필드를 허용합니다. 이 동작은 자동 인용 빈 문자열 대체가 보간기의 다른 곳에서 사용되는 원시 JSON 모드와 충돌하기 때문에 설계에 따른 것입니다. 제약 조건은 적용되지 않고 문서화됩니다. MediaTailor[인코딩 및 디코딩 동작](#yield-optimization-bid-construction-encoding)가 보간 전에 플레이어 파라미터 값을 처리하는 방법은 단원을 참조하십시오.

### 플레이어 파라미터를 전달하는 방법
<a name="yield-optimization-bid-construction-pass-params"></a>

세션 초기화 중에 플레이어 파라미터를 전달하는 방법에는 두 가지가 있습니다.

**방법 1: JSON 본문을 사용한 POST 요청(권장)**

```
POST https://<mediatailor-endpoint>/v1/session/<config-hash>/<origin-id>/master.m3u8
Content-Type: application/json

{
  "playerParams": {
    "app_id": "558775_example",
    "slot_id": "608109df-2378-4bc5-8da5-24bc355f01a4",
    "os": "Tizen",
    "make": "Samsung",
    "model": "Tizen TV",
    "language": "en",
    "us_privacy": "1YNY"
  }
}
```

이 메서드는 사용자 에이전트 문자열과 같은 복잡한 값의 URL 인코딩 문제를 방지하기 때문에 선호됩니다.

**방법 2: URL 쿼리 파라미터**

```
GET https://<mediatailor-endpoint>/v1/session/<config-hash>/<origin-id>/master.m3u8
  ?playerParams.app_id=558775_example
```

이 방법을 사용하면 값이 URL로 인코딩되어야 합니다. MediaTailor URL은 보간 전에 이를 디코딩합니다.

### 인코딩 및 디코딩 동작
<a name="yield-optimization-bid-construction-encoding"></a>

MediaTailor는 플레이어 파라미터 값을 템플릿으로 보간하기 전에 플레이어 파라미터 값에 대해 **한 수준의 URL 디코딩**을 수행합니다. 이는 파라미터 전달 방법(POST 본문 또는 URL 쿼리 파라미터)에 관계없이 적용됩니다.

**디코딩된 값의 예:**


| 전송된 값 | 디코딩 후 값(템플릿에 사용됨) | 
| --- | --- | 
| Test%20Os | Test Os | 
| https%3A%2F%2Flocalhost | https://localhost | 
| foo%20bar | foo bar | 
| Mozilla%2F5.0%20(SMART-TV) | Mozilla/5.0 (SMART-TV) | 

**요점:**
+ MediaTailor는 **한 레벨로만** 디코딩합니다. 이중 인코딩된 값(예: `%2520`)은 공백이 `%20`아닌 로 디코딩됩니다.
+ **POST 본문 값**도 디코딩됩니다. POST 본문에 URL로 인코딩된 값이 포함된 경우 보간 전에 디코딩됩니다.
+ **일반 텍스트 값**(인코딩 없음)은 변경되지 않습니다.
+ 디코딩 및 보간 후 전체 템플릿은 JSON으로 구문 분석됩니다. 보간된 값의 특수 문자(예: 이스케이프 처리되지 않은 따옴표 또는 백슬래시)는 JSON 구문 분석이 중단될 수 있습니다.

**작은 정보**  
플레이어가 이미 일반 텍스트(URL 인코딩되지 않음)인 값을 보내면 그대로 작동합니다. 플레이어가 값을 보내기 전에 URL 인코딩하는 경우에만 디코딩에 유의해야 합니다.

### 변수가 누락되면 어떻게 되나요?
<a name="yield-optimization-bid-construction-missing-variable"></a>

플레이어가 템플릿에 참조된 파라미터(예: 플레이어 파라미터`app_name`에는 `{{player_params.app_name}}` 없음)를 보내지 않으면 자리 표시자는 **빈 문자열** 로 확인됩니다`""`.

**영향:** 빈 문자열이 필수 필드(예: `app.bundle`)에 있는 경우 입찰 요청은에서 실패합니다`BidRequestConfigurationError`. 선택적 필드에 있는 경우 APS는 입찰 없음(HTTP 204) 응답을 일으킬 수 있는 빈 값을 수신합니다.

## MediaTailor가 자동으로 설정하는 항목
<a name="yield-optimization-bid-construction-auto-set"></a>

다음 필드는 항상 콘솔 구성 및 현재 가용 컨텍스트의 값을 사용하여 MediaTailor에서 설정합니다. 템플릿에 이를 포함하면 값이 재정의됩니다.


| Field | 소스 | 
| --- | --- | 
| id | 자동 생성: {sessionId}\_{availId} 형식(예: abc123-def456\_78901). 입찰 요청을 세션 로그와 상호 연관시키는 데 유용합니다. | 
| app.publisher.id | 콘솔 구성PublisherId의 . | 
| imp[0].video.minduration | 콘솔 구성MinimumUnfilledDuration의 . | 
| imp[0].video.maxduration | 계산됨:이 가용 구간의 실제 채워지지 않은 초입니다. | 
| imp[0].video.maxseq | 계산된 값: floor(unfilled\_duration / 6). | 
| imp[0].video.poddur | 계산됨:이 가용 구간의 실제 채워지지 않은 초입니다. | 
| ext.integrationType | 항상를 로 설정합니다"EMT". | 

## 다음 단계
<a name="yield-optimization-bid-construction-next-steps"></a>
+ field-by-field 참조는 섹션을 참조하세요[ORTB 필드 참조](yield-optimization-ortb-reference.md).
+ copy-paste 템플릿은 섹션을 참조하세요[템플릿 예제](yield-optimization-examples.md).