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

# 숨겨진 및 유연한 입력

## 숨겨진 입력

클라이언트 측에서 해당 입력이나 위젯을 생성하는 `required` 및 `optional` 입력과 함께,
커스텀 노드가 서버로부터 특정 정보를 요청할 수 있도록 하는 세 가지 `hidden` 입력 옵션이 있습니다.

이러한 옵션은 `INPUT_TYPES` 딕셔너리에 `hidden` 값을 반환하여 접근하며, 시그니처는 `dict[str,str]`로, `PROMPT`, `EXTRA_PNGINFO`, 또는 `UNIQUE_ID` 중 하나 이상을 포함합니다.

```python theme={null}
@classmethod
def INPUT_TYPES(s):
    return {
        "required": {...},
        "optional": {...},
        "hidden": {
            "unique_id": "UNIQUE_ID",
            "prompt": "PROMPT", 
            "extra_pnginfo": "EXTRA_PNGINFO",
        }
    }
```

### UNIQUE\_ID

`UNIQUE_ID`는 노드의 고유 식별자로, 클라이언트 측 노드의 `id` 속성과 일치합니다. 이는 일반적으로 클라이언트-서버 통신에 사용됩니다(참고: [메시지](/ko/development/comfyui-server/comms_messages#getting-node-id)).

### PROMPT

`PROMPT`는 클라이언트가 서버로 전송하는 전체 프롬프트입니다. 자세한 설명은 [프롬프트 객체](/ko/custom-nodes/js/javascript_objects_and_hijacking#prompt)를 참조하세요.

### EXTRA\_PNGINFO

`EXTRA_PNGINFO`는 저장되는 모든 `.png` 파일의 메타데이터에 복사될 딕셔너리입니다. 커스텀 노드는 이 딕셔너리에 추가 정보를 저장해 저장하거나(또는 다운스트림 노드와 통신하는 방법으로) 사용할 수 있습니다.

<Tip>Comfy를 `disable_metadata` 옵션과 함께 시작한 경우, 이 데이터는 저장되지 않습니다.</Tip>

### DYNPROMPT

`DYNPROMPT`는 `comfy_execution.graph.DynamicPrompt`의 인스턴스입니다. 이는 `PROMPT`와 달리 실행 과정 중에 [노드 확장](/ko/custom-nodes/backend/expansion)에 따라 변형될 수 있습니다.\
<Tip>`DYNPROMPT`는 고급 사례(예: 커스텀 노드에서 루프 구현)에만 사용해야 합니다.</Tip>

## 유연한 입력

### 맞춤형 데이터 타입

자신의 커스텀 노드 간에 데이터를 전달하려면 맞춤형 데이터 타입을 정의하는 것이 도움이 될 수 있습니다. 이는 데이터 타입의 이름을 선택하는 것만으로도 거의 간단합니다. 데이터 타입의 이름은 대문자로 된 고유한 문자열이어야 하며, 예를 들어 `CHEESE`와 같이 지정할 수 있습니다.

그런 다음 노드의 `INPUT_TYPES` 및 `RETURN_TYPES`에서 `CHEESE`를 사용할 수 있으며, Comfy 클라이언트는 `CHEESE` 출력만 `CHEESE` 입력에 연결되도록 허용합니다. `CHEESE`는 임의의 파이썬 객체일 수 있습니다.

유의할 점은 Comfy 클라이언트가 `CHEESE`를 인식하지 못하므로(특수 위젯을 정의하지 않는 한), 이를 위젯이 아닌 입력으로 강제해야 한다는 것입니다. 이는 입력 옵션 딕셔너리의 `forceInput` 옵션을 통해 수행할 수 있습니다:

```python theme={null}
@classmethod
def INPUT_TYPES(s):
    return {
        "required": { "my_cheese": ("CHEESE", {"forceInput":True}) }
    }
```

### 와일드카드 입력

```python theme={null}
@classmethod
def INPUT_TYPES(s):
    return {
        "required": { "anything": ("*",{})},
    }

@classmethod
def VALIDATE_INPUTS(s, input_types):
    return True
```

프론트엔드에서는 `*`를 사용해 어떤 소스와도 연결 가능한 입력을 표시할 수 있습니다. 이는 백엔드에서 공식적으로 지원되지 않으므로, `VALIDATE_INPUTS` 함수에 `input_types`라는 매개변수를 받아들여 백엔드의 타입 검증을 건너뛸 수 있습니다. (자세한 내용은 [VALIDATE\_INPUTS](./server_overview#validate-inputs) 참조.) 노드가 전달된 데이터를 이해하는 것은 노드의 몫입니다.

### 동적으로 생성된 입력

클라이언트 측에서 입력이 동적으로 생성되는 경우, 이를 파이썬 소스 코드에서 정의할 수 없습니다. 이러한 데이터에 접근하려면 Comfy가 임의의 이름으로 데이터를 전달할 수 있도록 하는 `optional` 딕셔너리를 사용해야 합니다. Comfy 서버는

```python theme={null}
class ContainsAnyDict(dict):
    def __contains__(self, key):
        return True
...

@classmethod
def INPUT_TYPES(s):
    return {
        "required": {},
        "optional": ContainsAnyDict()
    }
...

def main_method(self, **kwargs):
    # 동적으로 생성된 입력 데이터는 딕셔너리 kwargs에 들어갑니다

```

<Tip>rgthree님께 이 파이썬 트릭에 대해 감사드립니다!</Tip>
