Azure Logic Apps의 워크플로에서 작업을 반복 실행하기

적용 대상: Azure Logic Apps(사용량 + 표준)

배열이나 컬렉션의 모든 항목에 대해 동일한 동작을 실행하거나, 논리 앱 워크플로우에서 어떤 작업이 끝날 때까지 반복하려면, 각각 For each 또는 Tilv라는 Control 동작을 워크플로우에 추가하세요:

조치 과업
배열 또는 컬렉션 항목에 대해 하나 이상의 행동을 반복하세요. 배열과 컬렉션에만 적용됩니다.

팁: 배열을 처리하는 트리거가 있고 각 배열 항목별로 워크플로우 인스턴스를 실행하고 싶다면, 트리거의 Split on 속성을 설정해 배열을 디배치 하도록 설정하세요.

자세한 내용은 동시성, 루프 및 디배칭 제한을 참조하세요.
Until 조건이 충족되거나 특정 상태가 변할 때까지 하나 이상의 행동을 반복합니다.

워크플로우는 먼저 루프 내 모든 작업을 실행한 후, 조건이나 상태를 확인합니다. 조건이 충족되면 루프가 중지됩니다. 그렇지 않으면 루프가 반복됩니다.

자세한 내용은 동시성, 루프, 디배칭 제한을 참조하세요.

이 가이드는 워크플로우에 루프를 추가하는 방법, 순차적으로 반복 실행, 그리고 끝없는 반복을 방지하는 방법을 보여줍니다. 원하는 작업으로 바로 이동하세요:

참고

Power Automate 문서는 Use loops를 참조하세요.

필수 구성 요소

  • Azure 계정 및 구독 무료 Azure 계정을 만듭니다.

  • 루프를 실행하고 싶은 로직 앱 워크플로우와 워크플로우를 시작하는 트리거가 포함됩니다.

    루프 액션을 추가하기 전에, 워크플로우는 트리거를 먼저 시작해야 합니다.

이 가이드는 Azure 포털을 사용하지만, Visual Studio Code와 해당 Azure Logic Apps 확장 기능을 사용해 로직 앱 워크플로우를 구축할 수 있습니다:

각 루프에 대한 고려사항

For each 작업은 각 배열 또는 컬렉션 항목에 대해 하나 이상의 작업을 반복 실행합니다.

  • For each 작업은 배열 및 컬렉션에서만 작동합니다.

  • 각 행동 에 대해제한된 수의 배열 항목을 처리합니다.

  • 기본적으로 각 행동에 대한 반복은 병렬로 실행됩니다. 알아야 할 주요 행동:

    작동 방식 의미
    기본적으로 병렬 Power Automate의 각 루프에 적용하는 것과 달리, 반복은 한 번에 하나씩 실행되지 않습니다.

    시나리오에 순차 처리가 필요한 경우 Run For each iterations sequentially를 참조하세요. 예를 들어, 각 행동 에 대해Delay 액션을 사용하여 다음 반복을 일시정지하려면, 각 반복을 순차적으로 실행하도록 설정하세요.
    중첩 루프 중첩된 For each 작업은 항상 순차적으로 실행됩니다. 병렬로 실행하려면 자식 워크플로우를 생성하고 호출하세요.
    Variables 증분 변수, 감소 변수, 그리고 추가 변수 는 병렬 루프에서 예측 불가능한 결과를 반환할 수 있습니다. 루프 내 변수들이 각 반복 동안 해당 변수에 대한 연산으로부터 예측 가능한 결과를 내도록 하기 위해, 루프를 순차적으로 실행하세요.
  • For each 루프의 작업은 item() 함수를 사용하여 배열의 각 항목을 참조하고 처리합니다. 배열에 없는 데이터를 지정하면 워크플로가 실패합니다.

워크플로우에 '각 루프에 대해 (For each loop)'을 추가하세요

이 예제 워크플로는 웹 사이트 RSS 피드에 대한 일별 요약을 보냅니다. 워크플로는 각각의 새 항목에 대한 메일을 보내는 For each 작업을 사용합니다.

  1. Azure Portal에서 다음 단계를 지정된 순서로 사용하여 논리 앱 워크플로를 만듭니다.

    • 피드 항목이 게시될 때라는 이름의 RSS 트리거

      다음 일반 단계에 따라 사용량 또는 표준 논리 앱 워크플로에 트리거를 추가합니다.

    • 메일 보내기라는 이름의 Outlook.com 또는 Office 365 Outlook 작업

      다음 일반 단계에 따라 사용량 또는 표준 논리 앱 워크플로에 작업을 추가합니다.

  2. 디자이너에서 트리거와 이메일 전송 액션 사이에 워크플로우 유형에 따라 일반적인 단계를 따라 ' For each '라는 액션을 추가하세요:

  3. 이제 루프를 작성합니다.

    1. For each 작업에서 Select An Output From Previous Steps 상자 안을 선택하여 입력 옵션을 확인한 다음, 번개 아이콘을 선택하세요.

    2. 열리는 동적 콘텐츠 목록의 피드 항목이 게시될 때에서 RSS 트리거의 배열 출력인 피드 링크를 선택합니다.

      참고

      피드 링크 출력이 표시되지 않으면 트리거 섹션 레이블 옆에 있는 자세히 보기를 선택합니다. 동적 콘텐츠 목록에서 이전 단계의 출력 선택할 수 있습니다.

      'For each'라는 이름의 작업과 열린 동적 콘텐츠 목록이 표시된 Azure 포털 및 워크플로 디자이너의 스크린샷입니다.

      다음 예시는 선택된 배열 출력을 보여줍니다:

      워크플로 디자이너와 배열 출력이 선택된 For each 작업을 보여 주는 스크린샷.

    3. 각 배열 항목에 대한 기존 작업을 수행하려면 메일 보내기 작업을 For each 루프로 끕니다.

      작업 흐름은 다음과 같은 예시입니다:

      워크플로 디자이너와 'For each'라는 작업, 그리고 이제 'For each' 작업 내부에 있는 'Send an email'이라는 작업이 표시된 스크린샷.

  4. 워크플로를 저장합니다.

  5. 워크플로를 수동으로 테스트하려면 디자이너 도구 모음에서 실행>실행을 선택합니다.

For each 작업 정의(JSON)

코드 보기에서 작업하는 경우 워크플로의 JSON 정의에서 For_each 작업을 정의할 수 있습니다. 예를 들어 다음과 같습니다.

"actions": {
   "For_each": {
      "actions": {
         "Send_an_email_(V2)": {
            "type": "ApiConnection",
            "inputs": {
               "body": {
                  "Body": "@{item()}",
                  "Subject": "New CNN post @{triggerBody()?['publishDate']}",
                  "To": "me@contoso.com"
               },
               "host": {
                  "connection": {
                     "name": "@parameters('$connections')['office365']['connectionId']"
                  }
               },
               "method": "post",
               "path": "/v2/Mail"
            },
            "runAfter": {}
         }
      },
      "foreach": "@triggerBody()?['links']",
      "runAfter": {},
      "type": "Foreach"
   }
},

각 과정에 대해: 루프 반복을 순차적으로 실행하세요

기본적으로 For 각 작업의 반복은 동시에 병렬로 실행됩니다. 그러나 예측 가능한 결과가 예상되는 루프 내에 중첩된 루프 또는 변수가 있는 경우 해당 루프를 한 번에 하나씩 또는 순차적으로 실행해야 합니다.

  1. 디자이너에서 For each 작업을 선택하여 정보 창을 연 다음 설정을 선택합니다.

  2. 동시성 제어에서 설정을 Off에서 On으로 변경합니다.

  3. 병렬 처리 수준 슬라이더를 1로 이동합니다.

    각 작업의 설정 탭과, 동시성 제어가 켜져 있으며 병렬 처리 수준 슬라이더가 1로 설정된 모습을 보여 주는 스크린샷입니다.

For each 작업 정의(JSON): 순차적으로 실행

워크플로의 JSON 정의에서 For_each 작업을 사용하여 코드 뷰에서 작업하는 경우 operationOptions 매개 변수를 추가하고 매개 변수 값을 Sequential로 설정합니다.

"actions": {
   "For_each": {
      "actions": {
         "Send_an_email_(V2)": { }
      },
      "foreach": "@triggerBody()?['links']",
      "runAfter": {},
      "type": "Foreach",
      "operationOptions": "Sequential"
   }
}

루프 고려사항 전까지

Until 작업은 필요한 지정된 조건이 충족될 때까지 하나 이상의 작업을 실행하고 반복합니다. 조건이 충족되면 루프가 중지됩니다. 그렇지 않으면 루프가 반복됩니다. 자세한 내용은 동시성, 루프 및 디배칭 제한을 참조하세요.

다음 목록에는 Until 작업을 사용할 수 있는 몇 가지 일반적인 시나리오가 포함되어 있습니다.

  • 원하는 응답을 받을 때까지 엔드포인트를 호출합니다.

  • 데이터베이스에 레코드를 만듭니다. 해당 레코드의 특정 필드가 승인될 때까지 기다립니다. 처리를 계속합니다.

기본적으로 Until 작업은 다음과 같은 방법으로 성공하거나 실패합니다.

  • Until 루프는 루프 내의 모든 작업이 성공하고 동작 후 실행에 따라 루프 제한에 도달하면 성공합니다.

  • Until 루프의 마지막 반복에 있는 모든 작업이 성공하면 전체 Until 루프가 성공으로 표시됩니다.

  • Until 루프의 마지막 반복에서 작업이 실패하면 전체 Until 루프가 실패로 표시됩니다.

  • 마지막 반복 이외의 반복에서 작업이 실패하면 다음 반복이 계속 실행되고 전체 Until 작업이 실패로 표시되지 않습니다.

    대신 작업이 실패하도록 하려면 operationOptions라는 매개 변수를 추가하고 값을 FailWhenLimitsReached로 설정하여 루프의 JSON 정의에서 기본 동작을 변경합니다. 예를 들면 다음과 같습니다.

    "Until": {
       "actions": {
         "Execute_stored_procedure": {
           <...>
           }
         },
         "expression": "@equals(variables('myUntilStop'), true)",
         "limit": {
           "count": 5,
           "timeout": "PT1H"
         },
         "operationOptions": "FailWhenLimitsReached",
         "runAfter": {
         "Initialize_variable": [
           "Succeeded"
         ]
       },
    "type": "Until"
    }
    

작업 흐름에 'Until 루프'를 추가하세요

다음 예시 워크플로우는 매일 오전 8시에 시작합니다. 워크플로우는 Until 액션을 사용해 변수를 10이 될 때까지 증가시킵니다. 그런 다음, 워크플로에서 현재 값을 확인하는 메일을 보냅니다. 이 예제에서는 Office 365 Outlook을 사용하지만 Azure Logic Apps에서 지원하는 전자 메일 공급자를 사용할 수 있습니다. 다른 메일 계정을 사용하는 경우 일반적인 단계는 동일하게 유지되지만 약간 다르게 보입니다.

  1. Azure Portal에서 빈 워크플로를 사용하여 논리 앱 리소스를 만듭니다.

  2. 디자이너에서 워크플로우 유형에 따라 일반적인 단계를 따라 'Recurrence'라는 이름의 Schedule 내장 트리거를 추가하세요:

  3. 재발 트리거에서 다음 정보를 제공하세요:

    매개 변수
    간격 1
    빈도 Day
    시간 선택 8
    분 선택 00

    빈도로 설정하고 나면 이 시간분 선택이 나타납니다.

    다음 예시는 재귀 트리거가 어떻게 나타나는지 보여줍니다:

    Azure 포털과 워크플로우 디자이너, 그리고 반복 트리거 매개변수가 설정된 것을 보여주는 스크린샷입니다.

  4. 디자이너에서 워크플로우 유형에 따라 일반적인 단계를 따라 변수 내장 액션인 Initialize variable을 추가하세요:

  5. Initialize 변수 동작에서 다음 정보를 제공하세요:

    매개 변수 설명
    이름 제한 변수 이름.
    유형 정수 변수의 데이터 타입.
    0 변수의 시작 값입니다.

    Azure 포털, 워크플로우 디자이너, 내장 액션 Initialize 변수와 매개변수를 보여주는 스크린샷입니다.

  6. 변수 초기화 작업에서, 워크플로 유형에 따라 다음 일반적인 단계에 따라 Control 기본 제공 작업인 Until을(를) 추가하세요:

  7. Until 동작에서 루프의 정지 조건을 설정합니다:

    1. Loop Till 박스 안에서 선택한 후 번개 아이콘을 선택해 동적 콘텐츠 목록을 엽니다.

    2. 목록의 변수 아래에서 Limit라는 변수를 선택합니다.

    3. 개수에서 비교 값으로 10을 입력합니다.

    워크플로와 설명된 값이 포함된 'Until'이라는 기본 제공 작업을 보여 주는 스크린샷

  8. Until 작업 내에서 +>작업 추가를 선택합니다.

  9. 워크플로 유형에 따라 다음 일반 단계를 수행하여 Until 작업에 변수 기본 제공 작업인 변수 증가를 추가하세요:

  10. 변수 증가 작업에서 다음 값을 제공하여 변수 제한 값을 1로 증분합니다.

    매개 변수
    제한 Limit 변수를 선택합니다.
    1

    워크플로우와 Until이라는 이름의 기본 제공 작업을 보여 주는 스크린샷으로, Limit은 Limit 변수로, Value는 1로 설정되어 있습니다.

  11. Until 작업 외부에 작업 유형에 따라 일반적인 단계를 따라 이메일을 보내는 액션을 추가하세요:

    이 예제에서는 계속 메일 보내기라는 Office 365 Outlook 작업을 사용합니다.

  12. 메일 작업에서 다음 값을 제공합니다.

    매개 변수 설명
    수행할 작업 < email-address@domain> 받는 사람의 이메일 주소입니다. 테스트를 위해 자신의 이메일 주소를 사용합니다.
    Subject “Limit” 변수의 현재 값은Limit입니다. 이메일 제목 이 예제에서는 현재 값이 지정된 조건을 충족하는지 확인하기 위해 Limit 변수를 포함해야 합니다.

    1. 제목 상자 내에서 선택한 다음 번개 모양 아이콘을 선택합니다.

    2. 열리는 동적 콘텐츠 목록에서 변수 구역 머리글 옆에 있는 자세히 보기를 선택합니다.

    3. 제한을 선택합니다.
    본문 < 전자 메일 콘텐츠> 보내려는 메일 메시지 콘텐츠입니다. 이 예제에서는 텍스트를 원하는 대로 입력합니다.

    다음 예시는 이메일 액션이 어떻게 나타나는지 보여줍니다:

    '속성 값이 포함된 이메일 보내기'라는 워크플로우와 작업을 보여주는 스크린샷입니다.

  13. 워크플로를 저장합니다.

워크플로 테스트

논리 앱 워크플로를 수동으로 테스트하려면 다음을 수행합니다.

  • 디자이너 도구 모음의 실행 옵션에서 실행을 선택합니다.

워크플로가 실행되기 시작하면 지정한 내용이 포함된 메일을 받습니다.

예제 워크플로우에서 받은 샘플 이메일을 보여주는 스크린샷입니다.

무한 루프 방지

Until 작업은 선택적 개수시간 제한 매개 변수에 따라 실행을 중지합니다. 이러한 매개 변수 값을 적절하게 설정해야 합니다.

매개 변수 설명
Count 루프가 종료되기 전에 실행되는 최대 반복 수입니다.

워크플로에 포함될 수 있는 Until 작업 수에 대한 기본 및 최대 제한은 동시성, 반복, 분리 제한을 참조하세요.
Timeout 모든 반복을 포함하여 Until 작업이 루프가 종료되기 전에 실행되는 최대 시간입니다. 이 값은 ISO 8601 형식으로 지정되며 각 반복에 대해 평가됩니다.

루프의 작업이 시간 제한보다 오래 걸리면 현재 반복이 중지되지 않습니다. 그러나 제한 조건이 충족되지 않으면 다음 반복이 시작되지 않습니다.

제한 시간 값에 대한 기본 및 최대 제한은 동시성, 반복 및 분리 제한을 참조하세요.

Until 루프 반복에 대한 실행 기록 검토

Until 루프가 포함된 워크플로의 실행 기록을 볼 때 전체 루프가 실행을 완료한 후에만 루프 내 작업에 대한 자세한 상태 및 결과를 사용할 수 있습니다. Until 루프가 여전히 반복을 실행하는 동안 루프 작업은 실행 상태를 표시하지만 루프가 종료될 때까지 개별 반복 결과를 확장하거나 트래버스할 수 없습니다.

다음 조건 중 하나가 충족되면 루프가 종료됩니다.

  • 지정된 식이 true로 평가됩니다.
  • 루프가 개수 제한에 도달합니다.
  • 루프가 시간 제한 에 도달합니다.

루프가 완료되면 실행 기록에서 Until 작업을 선택하여 각 반복 및 해당 반복 내의 자식 작업의 상태를 볼 수 있습니다.

참고

Until 루프가 장기간 실행되는 경우 루프가 완전히 완료될 때까지 기다려야 개별 반복의 결과에 대한 실행 기록을 검사할 수 있습니다. 장기 실행 중인 진행 중인 루프를 모니터링하려면 큐에 메시지를 보내거나 병렬 분기에서 읽을 수 있는 변수를 업데이트하여 상태를 독립적으로 내보내는 루프 내에 로깅 또는 알림 작업을 추가하는 것이 좋습니다.

작업 정의(JSON)까지

코드 보기에서 작업하는 경우 워크플로의 JSON 정의에서 Until 작업을 정의할 수 있습니다. 예를 들어 다음과 같습니다.

"actions": {
   "Initialize_variable": {
      // Definition for initialize variable action
   },
   "Send_an_email": {
      // Definition for send email action
   },
   "Until": {
      "type": "Until",
      "actions": {
         "Increment_variable": {
            "type": "IncrementVariable",
            "inputs": {
               "name": "Limit",
               "value": 1
            },
            "runAfter": {}
         }
      },
      "expression": "@equals(variables('Limit'), 10)",
      // To prevent endless loops, an "Until" loop 
      // includes these default limits that stop the loop. 
      "limit": { 
         "count": 60,
         "timeout": "PT1H"
      },
      "runAfter": {
         "Initialize_variable": [
            "Succeeded"
         ]
      }
   }
}

이 제 Until 루프는 리소스를 만드는 HTTP 엔드포인트를 호출합니다. HTTP 응답 본문이 Completed 상태로 반환되면 루프가 중지됩니다. 또한 무한 루프를 방지하기 위해 다음 조건 중 하나라도 발생하면 루프가 중지됩니다.

  • 루프가 count 특성에 지정한 대로 10회 실행되었습니다. 기본값은 60회입니다.

  • 루프가 ISO 8601 형식의 timeout 특성에 지정한 대로 2시간 동안 실행되었습니다. 기본값은 1시간입니다.

"actions": {
   "myUntilLoopName": {
      "type": "Until",
      "actions": {
         "Create_new_resource": {
            "type": "Http",
            "inputs": {
               "body": {
                  "resourceId": "@triggerBody()"
               },
               "url": "https://domain.com/provisionResource/create-resource"
            },
            "runAfter": {},
            "type": "ApiConnection"
         }
      },
      "expression": "@equals(body('Create_new_resource'), 'Completed')",
      "limit": {
         "count": 10,
         "timeout": "PT2H"
      },
      "runAfter": {}
   }
}

다음 단계