# 플로우

> 플로우는 하나의 입력 데이터소스, 하나의 모델 버전, 그리고 출력 데이터소스를 묶습니다. 플로우를 활성화해 실행하고, 구성을 다시 입력하지 않고 플로우를 전환하세요.

**플로우**는 실행의 단위입니다. 플로우는 하나의 입력 데이터소스, 하나의 모델 버전, 그리고
0개 이상의 출력 데이터소스를 지정합니다. 데이터소스는 연결만 설명하고, 모델은 무엇을
계산할지만 설명합니다. 플로우가 이들을 하나로 묶으며, 활성화하는 대상은 플로우입니다.

## 플로우를 쓰는 이유

- **변형을 준비해 두세요.** 여러 플로우가 하나의 입력 데이터소스를 공유할 수 있습니다.
  모델 버전별로, 또는 출력 대상별로 플로우를 하나씩 구성해 두세요.
- **한 번에 전환하세요.** 다른 플로우를 활성화하면 현재 플로우가 꺼집니다. 태그를 다시
  입력하거나, 모델을 다시 고르거나, 출력을 다시 매핑할 필요가 없습니다.
- **운영 대상은 하나입니다.** 활성화, Start, Stop, 비활성화는 모두 플로우 행에서 합니다.

```mermaid
flowchart LR
  IN["입력 데이터소스"] --> A["플로우 A · 활성화\nmodel v2"]
  IN --> B["플로우 B · 비활성화\nmodel v3"]
  A --> O1["출력: PLC"]
  B --> O2["출력: MQTT"]
```

## 시작하기 전에

- 모든 채널이 매핑된 [입력 데이터소스](/ko/configure/input-datasources/).
- 업로드되고 검증된 [모델](/ko/configure/models/). 모델의 입력 형상은 입력의
  **Window size**와 **Tag count**에 맞아야 합니다.
- 선택 사항: 하나 이상의 [출력 데이터소스](/ko/configure/output-datasources/). 각 출력은
  모델의 출력 개수와 같은 **Tag count**와 하나 이상의 매핑된 채널이 필요합니다. 출력이
  없는 플로우는 예측값을 대시보드로만 보냅니다.

## 플로우 만들기

1. ### 작업 관리자 열기

   관리자로 로그인합니다. 사이드바에서 **작업 관리자**(Task Manager)를 열고
   **새 플로우**(New Flow)를 클릭합니다. `Flow_1` 같은 이름이 제안되며, 원하면 바꿀 수
   있습니다. 플로우 이름은 고유해야 합니다.

2. ### 입력 선택

   플로우가 읽을 입력 데이터소스를 선택합니다.

3. ### 모델 선택

   목록에는 선택한 입력에 맞는 모델만 표시됩니다. 모델의 입력 형상은
   `[윈도우 크기, 태그 수]`여야 합니다. 유효하지 않거나 아직 검증 중인 모델은 표시되지
   않습니다. 나중에 입력을 바꾸면 더 이상 맞지 않는 모델은 선택이 해제되고 메시지로
   알려 줍니다.

4. ### 출력 선택

   목록에는 **Tag count**가 모델의 출력 개수와 같은 출력만 표시됩니다. 예측값을
   대시보드에만 두려면 아무것도 선택하지 마세요.

5. ### 저장

   **저장**을 클릭합니다. 플로우는 비활성화 상태로 저장됩니다.

## 활성화 및 시작

플로우 행에서 **활성화**(Enabled)를 토글합니다. 저장 후에도 태그 매핑과 모델이 바뀔 수
있으므로, 활성화할 때 플로우 전체를 다시 검사합니다:

- 모델의 입력 형상이 입력의 윈도우 크기와 태그 수에 맞고, 모델의 출력 개수가 각 출력의
  태그 수와 같아야 합니다.
- 모든 입력 채널이 매핑되어 있어야 합니다: 채널당 정확히 하나의 태그, 같은 태그 중복 없음.
- 선택한 각 출력에 매핑된 채널이 하나 이상 있어야 합니다.

그런 다음 모델을 로드하고 입력을 연결합니다. OPC UA 또는 MQTT 핸드셰이크가 여기서
일어나므로, 네트워크나 자격 증명 문제가 지금 드러납니다. 어느 단계든 실패하면 토글이
꺼짐으로 돌아가고 메시지가 문제를 알려 줍니다.

활성화에 성공하면 플로우의 출력만 활성 출력이 되고, **추론**(Inference) 열에 **준비됨**이
표시됩니다. 활성화는 스트리밍을 시작하지 **않습니다**. **추론** 열에서 **Start**를 눌러
시작하세요. **Stop**은 스트리밍을 멈추고 플로우는 활성화 상태로 둡니다.

## 한 번에 하나의 플로우

어느 순간에도 최대 하나의 플로우만 활성화되며, 플랫폼이 이를 강제합니다. 다른 플로우가
활성화된 상태에서 플로우를 활성화하면, 꺼질 플로우의 이름을 보여 주는 대화 상자가
나타납니다. 확인하면 전환됩니다.

**전환에 실패하면 아무것도 실행되지 않습니다**

형상 검사는 아무것도 바뀌기 전에 실행됩니다. 나머지 단계는 현재 플로우가 꺼진 뒤에
실행됩니다. 그 후 채널 검사, 모델 로드, 또는 연결이 실패하면 어떤 플로우도 활성화되지
않습니다. 문제를 해결한 뒤 새 플로우를 다시 활성화하거나, 이전 플로우를 다시
활성화하세요.

## 편집, 비활성화, 삭제

- 플로우는 비활성화 상태에서만 **편집**할 수 있습니다. 활성화된 플로우를 편집하면
  *"Disable the flow that uses this before changing it."* 메시지와 함께 거부됩니다.
- **비활성화**하면 스트리밍이 멈추고, 입력 연결이 끊기고, 모델이 언로드되며, 플로우의
  출력이 중지됩니다. 플로우 구성은 그대로 유지됩니다.
- **삭제**는 플로우만 제거합니다. 데이터소스와 모델은 그대로 남습니다. 활성화된
  플로우를 삭제하면 파이프라인이 먼저 중지됩니다.

플로우가 사용하는 입력 데이터소스는 삭제할 수 없습니다. 해당 플로우를 먼저 삭제하세요.

## 플로우가 자동으로 꺼지는 경우

일부 데이터소스 편집은 실행 중인 플로우가 로드한 내용을 무효화합니다. 그러면 플랫폼이
추론을 멈추고 플로우를 비활성화하여, 오래된 설정으로 실행되지 않게 합니다:

- 활성화된 플로우가 사용 중인 입력 데이터소스의 연결을 변경해 저장한 경우.
- 입력의 **Tag count**, **Window size**, **Sampling period**를 변경한 경우. 해당 입력을
  쓰는 모든 활성화된 플로우가 비활성화됩니다.
- 플로우가 사용 중인 입력의 태그 매핑을 저장한 경우.

변경 내용을 확인한 뒤 플로우를 다시 활성화하고 **Start**를 누르세요.

스트리밍 중 입력에 장애가 나면(예: 태그 응답 중단) 추론이 멈추고 모델이 언로드되지만,
플로우는 여전히 활성화로 표시됩니다. 소스를 고친 뒤 플로우를 껐다가 다시 켜서 다시
로드하고, **Start**를 누르세요.
[데이터소스 다운 또는 장애](/ko/troubleshooting/datasource-down-or-faulted/)를 참조하세요.

## 다음 단계

  - [모델 배포](/ko/configure/models/) — 플로우가 실행할 모델을 업로드하고 검증합니다.
  - [첫 추론 실행하기](/ko/install-deploy/first-inference/) — 플로우를 활성화하고 Start를 눌러 예측값을 확인합니다.
  - [런타임 모니터링](/ko/operate/monitoring/) — 지연 시간, 처리량, KPI.
