

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

# 데이터를 비동기식 메서드로 전달
<a name="advanceddatapassing"></a>

**Topics**
+ [모음 및 맵을 비동기식 메서드로 전달](#advanceddatapassing.collections)
+ [Settable<T>](#advanceddatapassing.settable)
+ [@NoWait](#advanceddatapassing.nowait)
+ [Promise<Void>](#advanceddatapassing.promise)
+ [AndPromise 및 OrPromise](#advanceddatapassing.andorpromise)

`Promise<T>`에 관해서는 앞 단원에서 설명하였습니다. 여기에서는 `Promise<T>`의 고급 사용 사례 몇 가지를 다룹니다.

## 모음 및 맵을 비동기식 메서드로 전달
<a name="advanceddatapassing.collections"></a>

프레임워크에서는 어레이, 모음 및 맵을 비동기식 메서드에 `Promise` 유형으로 전달할 수 있도록 지원합니다. 예를 들어 비동기식 메서드에서는 다음 목록과 같이 `Promise<ArrayList<String>>`를 인수로 받아들일 수 있습니다.

```
@Asynchronous
public void printList(Promise<List<String>> list) {
    for (String s: list.get()) {
        activityClient.printActivity(s);
    }
}
```

의미상 이것은 기타 `Promise` 형식 파라미터로 작동하고 비동기식 메서드는 모음이 사용 가능해질 때까지 기다렸다가 실행됩니다. 모음의 멤버가 `Promise` 객체인 경우 사용자는 모든 멤버가 다음 코드 조각과 같이 준비 상태가 될 때까지 프레임워크가 대기하도록 할 수 있습니다. 이렇게 하면 비동기식 메서드는 모음의 각 멤버가 준비 상태가 될 때까지 대기합니다.

```
@Asynchronous
public void printList(@Wait List<Promise<String>> list) {
  for (Promise<String> s: list) {
      activityClient.printActivity(s);
  }
}
```

 `@Wait` 주석을 파라미터에 사용하여 파라미터에 `Promise` 객체가 포함되어 있음을 나타내야 한다는 점에 유의하십시오.

 `printActivity` 활동에서는 `String` 인수를 받아들이지만 생성된 클라이언트의 매칭 메서드는 Promise<String>을 사용한다는 점도 유의하십시오. 우리는 클라이언트에 있는 메서드를 호출하고 있는 것이지 활동 메서드를 직접 호출하고 있는 것은 아닙니다.

## Settable<T>
<a name="advanceddatapassing.settable"></a>

`Settable<T>`는 `Promise`의 값을 수동으로 설정할 수 있게 해주는 설정된 메서드를 제공하는 `Promise<T>`의 파생 유형입니다. 예를 들어 다음 워크플로는 신호 메서드에서 설정되는 `Settable<?>`를 기다림으로써 신호가 수신되기를 기다립니다.

```
public class MyWorkflowImpl implements MyWorkflow{
   final Settable<String> result = new Settable<String>();

   //@Execute method
   @Override
   public Promise<String> start() {
      return done(result);
   }

   //Signal
   @Override
   public void manualProcessCompletedSignal(String data) {
      result.set(data);
   }

   @Asynchronous
   public Promise<String> done(Settable<String> result){
       return result;
   }
}
```

또한 `Settable<?>`는 한 번에 다른 하나의 약속에 묶일 수 있습니다. `AndPromise` 및 `OrPromise`를 사용하여 약속을 그룹화 수 있습니다. `unchain()` 메서드를 호출하여 묶인 `Settable`을 풀 수 있습니다. `Settable<?>`는 묶여 있을 때 묶여 있는 약속이 준비 상태가 되면 자동으로 준비 상태가 됩니다. 묶는 기능은 프로그램 다른 부분의 `doTry()` 범위 내에서 반환된 약속을 사용하고 싶은 경우 특히 유용합니다. `TryCatchFinally`는 중첩 클래스로 사용되므로 `Promise<>` 상위 범위에서를 선언하고에서 설정할 수 없습니다`doTry()`. 이는 Java에서는 변수가 최종으로 표시되기 위해 상위 범위에서 선언되고 중첩 클래스에서 사용되어야 하기 때문입니다. 예제:

```
@Asynchronous
public Promise<String> chain(final Promise<String> input) {
    final Settable<String> result = new Settable<String>();

    new TryFinally() {

        @Override
        protected void doTry() throws Throwable {
            Promise<String> resultToChain = activity1(input);
            activity2(resultToChain);

            // Chain the promise to Settable
            result.chain(resultToChain);
        }

        @Override
        protected void doFinally() throws Throwable {
            if (result.isReady()) { // Was a result returned before the exception?
                // Do cleanup here
            }
        }
    };

    return result;
}
```

`Settable`은 한 번에 한 약속에 묶일 수 있습니다. `unchain()` 메서드를 호출하여 묶인 `Settable`을 풀 수 있습니다.

## @NoWait
<a name="advanceddatapassing.nowait"></a>

`Promise`를 비동기식 메서드에 전달하면 기본적으로 프레임워크에서는 `Promise`(들)이 준비 상태가 될 때까지 기다렸다가 메서드를 실행합니다(모음 유형 제외). 사용자는 비동기식 메서드의 선언에서 `@NoWait` 주석 또는 파라미터를 사용하여 이 동작을 재정의할 수 있습니다. 이 방법은 비동기식 메서드 자체에서 설정할 `Settable<T>`에서 전달하는 경우 유용합니다.

## Promise<Void>
<a name="advanceddatapassing.promise"></a>

비동기식 메서드의 종속성은 한 메서드에서 다른 메서드로 인수로 반환되는 `Promise`를 전달함으로써 구현됩니다. 그러나 메서드에서 `void`를 반환하고 싶지만 완료된 후 여전히 다른 비동기식 메서드가 실행되기를 원하는 경우가 있을 수 있습니다. 이러한 경우에는 `Promise<Void>`를 메서드의 반환 유형으로 사용할 수 있습니다. `Promise` 클래스에서는 `Promise<Void>` 객체를 생성하는 데 사용할 수 있는 정적 `Void` 메서드를 제공합니다. 이 `Promise`는 비동기식 메서드가 실행을 마치면 준비 상태가 됩니다. 이 `Promise`를 기타 `Promise` 객체와 마찬가지로 다른 비동기식 메서드로 전달할 수 있습니다. `Settable<Void>`을 사용 중이라면 그 위에 null로 설정된 메서드를 호출하여 준비 상태로 만듭니다.

## AndPromise 및 OrPromise
<a name="advanceddatapassing.andorpromise"></a>

`AndPromise` 및 `OrPromise`를 통해 `Promise<>` 객체 여러 개를 논리적 약속 하나로 그룹화할 수 있습니다. 이를 구성하는 데 사용된 모든 약속이 준비 상태가 되면 `AndPromise`가 준비 상태가 됩니다. 이를 구성하는 데 사용된 약속 모음의 약속 중 어느 하나라도 준비 상태가 되면 `OrPromise`가 준비 상태가 됩니다. `AndPromise` 및 `OrPromise`에서 `getValues()`을 호출하여 구성 약속의 값 목록을 가져올 수 있습니다.