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

# 하나의 Stream에서 2개 목적지 전송

> 단일 Stream을 유지하면서 Route별로 서로 다른 데이터 처리와 전달을 설정합니다.

# 하나의 Stream으로 두 Destination에 전달

**목표:** 하나의 이벤트를 내부 시스템과 외부 시스템에 동시에 전송하되, 외부 전송에만 추가 필드를 넣습니다. **Stream을 2개 만들지 않습니다.**

> [!NOTE]
>
> **화면 버전:** 표시된 이미지는 과거 Control UI 테스트 캡처입니다. 현재 제품의 기본 5단계 순서(Connect → Sample & Record Selection → Destinations → Route Processing → Deploy)를 우선하세요. [번호별 화면 가이드](https://control.datarelay.run/ko/use-cases/screen-walkthrough.md)에서 차이를 설명합니다.

## 적용 순서

이 사례는 이미 구성된 Connector·Destination·Stream을 전제로 합니다. 아직 생성하지 않았다면 [커넥터별 수집 가이드](https://control.datarelay.run/ko/use-cases/index.md)에서 먼저 수집 Source를 설정하세요. 이후 이 페이지의 구체적인 단계를 수행하고 **실제 Logs와 Destination/격리 기록**을 검증합니다. 화면 캡처는 기존 테스트 증빙으로, 실제 결과를 대신하지 않습니다.

## 1. 수신기 두 개 준비

[실습 환경 준비](https://control.datarelay.run/ko/use-cases/lab-setup.md)에 따라 첫 수신기는 9011, 두 번째는 9012 포트에서 실행합니다. 파일도 각각 `received-9011.ndjson`, `received-9012.ndjson`으로 분리합니다.

## 2. Destination 2개 만들기

**Destinations → Create**에서 다음 값을 입력합니다.

| 항목 | 내부용 | 외부용 |
| - | - | - |
| Name | `Lab Internal` | `Lab External` |
| Type | `WEBHOOK_POST` | `WEBHOOK_POST` |
| URL | `http://TEST-HOST:9011/sink` | `http://TEST-HOST:9012/sink` |
| Payload Mode | Single Event Object | Single Event Object |

`TEST-HOST`는 Control에서 접근 가능한 실제 IP/호스트명으로 변경합니다. 두 Destination을 저장합니다.

## 3. 기존 Connector 하나만 사용

[첫 Webhook 전송](https://control.datarelay.run/ko/use-cases/webhook-first-flow.md)에서 만든 Connector를 사용합니다. `/streams/new`에서 **Connect**, **Sample & Record Selection**을 완료하고 레코드가 추출되는지 확인합니다.

## 4. Destination 및 Route별 처리

1. **Destinations**에서 `Lab Internal`과 `Lab External`을 **모두 선택**합니다.
2. **Route Processing**에서 두 Destination에 각각 연결된 **Route 2개**가 있는지 확인합니다.
3. **Global Processing**에는 공통 변환을 설정합니다. 기본값은 **Inherit Global**입니다.
4. 내부 Route는 Transform의 **Inherit Global**을 유지합니다.
5. 외부 Route를 선택하고 **Transform만 Inherit Global 해제**합니다. 지원되는 **Add Field → Static** 기능으로 `delivery_scope = external` 필드를 추가합니다.
6. 두 Route 각각에서 **effective Preview**를 확인합니다. Draft Preview와 실제 Destination 전송은 별개입니다.
7. Route별 Delivery 설정도 점검합니다. Delivery는 각 Route 고유 설정입니다.
8. **Deploy**하고 필요한 경우 Stream을 Start합니다.

![field-mapping — numbered Control historical UI capture](https://mintcdn.com/datarelay-control/Tl9_UibGAprPlCr8/images/screenshots/annotated/field-mapping.webp?fit=max\&auto=format\&n=Tl9_UibGAprPlCr8\&q=85\&s=15ae79d8a5249262f236f997f253d286)

*그림 1. **원본 이벤트를 대상 필드로 매핑.** ① Sample Event의 원본값 확인 → ② Field Mapping에서 대상 필드 매핑 → ③ Final Event Preview의 출력값 비교. Preview는 실제 전송 증빙이 아닙니다.*

![add-static-field — numbered Control historical UI capture](https://mintcdn.com/datarelay-control/Tl9_UibGAprPlCr8/images/screenshots/annotated/add-static-field.webp?fit=max\&auto=format\&n=Tl9_UibGAprPlCr8\&q=85\&s=d5f7d0d19193036e2aa71d7d4c4a6a62)

*그림 2. **Route에서 사용자 정의 필드 추가.** ① Add field를 누르고 ② Static Value를 선택합니다. ③ 메뉴를 닫은 다음 Final Event Preview에서 추가 필드가 반영됐는지 확인합니다.*

## 5. 실제 전송 및 비교

Connector에서 복사한 Receiver URL을 `CONTROL_RECEIVER_URL`로 설정한 뒤 다음 이벤트를 전송합니다.

```bash theme={null}
curl --fail-with-body -X POST "$CONTROL_RECEIVER_URL" \
  -H 'Content-Type: application/json' \
  --data '{"id":"two-route-001","message":"fanout check","severity":"low"}'
```

두 수신 파일에서 `two-route-001`을 찾고, **Logs에 Route별 전달 결과가 각각 기록**되어 있는지 확인합니다. 외부 Route의 유효한 Transform에 따라 `delivery_scope`가 외부 수신 데이터에만 존재하는지도 확인합니다.

**완료 조건:** **Stream 1개, Route 2개, 목적지 수신 기록 2건**을 동일한 이벤트 ID로 증명합니다.

## 실패 시

* 한쪽에만 전송: 두 Destination/Route의 Enabled 및 연결 상태를 확인합니다.
* 예상한 변환이 반영되지 않음: Preview만 변경된 상태인지, Override가 실제 저장되었는지 확인합니다.
* Deploy에서 **Intent only**, Effective Status가 **Inherited**: **Routes → Edit**에서 전체 Override 설정을 저장한 다음 **Overridden**인지 확인합니다.
* 목적지마다 Stream을 따로 만들었음: 한 Stream에 두 Destination을 붙이는 구조로 변경합니다.

**다음:** [Route별 개인정보 마스킹](https://control.datarelay.run/ko/use-cases/protect-pii.md).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.