[Salesforce] Flows in Salesforce

IamMilo·2024년 5월 21일

Flows in Salesforce


Salesforce의 Flow는 코드 없이 클릭만으로 복잡한 비즈니스 자동화를 구축할 수 있는 강력한 도구입니다. 관리자로서 Flow는 많은 복잡한 비즈니스 요구 사항을 Salesforce 개발자의 도움 없이 처리할 수 있게 해주므로 매우 유용한 도구가 됩니다.

Salesforce Flow의 주요 장점은 다음과 같습니다:

  • 사용 편의성: 코드 작성 없이도 복잡한 비즈니스 프로세스를 구현할 수 있어, 비개발자도 쉽게 접근할 수 있습니다.
  • 유지보수 용이성: Flow는 시각적 인터페이스를 통해 구성되므로, Flow를 이해하는 사람이라면 누구나 쉽게 따라갈 수 있어 유지보수가 용이합니다.
  • 다양한 기능: 데이터 레코드 생성, 업데이트, 삭제, 이메일 전송, 승인 프로세스 시작 등 다양한 작업을 수행할 수 있습니다.
  • 유연성: 조건 분기, 루프, 서브플로우 호출 등 복잡한 논리를 구현할 수 있는 다양한 요소를 제공합니다.

Flow를 사용하면 관리자가 비즈니스 요구 사항에 맞게 Salesforce를 유연하고 효과적으로 관리할 수 있습니다.

Types of Flows

  • Autolaunched Flows (자동 실행 플로우):
    사용자 개입 없이 자동으로 실행되는 플로우입니다.
    Process Builder, Apex 클래스, 레코드 변경, 예약된 일정, 또는 플랫폼 이벤트에 의해 호출될 수 있습니다.

  • Schedule-triggered Flows (일정 트리거 플로우):
    특정 시간과 빈도로 실행되는 자동 실행 플로우입니다.
    배치로 모든 레코드에 대해 실행되며, 백그라운드에서 비즈니스 프로세스를 자동화합니다.

  • Screen Flows (화면 플로우):
    사용자 인터페이스(UI) 요소를 포함하며 Salesforce 사용자로부터 입력을 받습니다.
    액션으로 실행하거나 Lightning 페이지에 요소로 임베드할 수 있습니다.

  • Record-triggered Flows (레코드 트리거 플로우):
    사용자가 Salesforce 레코드를 생성, 업데이트 또는 삭제할 때 백그라운드에서 실행됩니다.
    레코드 변경을 기반으로 자동으로 실행됩니다.

  • Platform Event-triggered Flows (플랫폼 이벤트 트리거 플로우):
    플랫폼 이벤트 메시지가 수신될 때 백그라운드에서 실행됩니다.
    실시간 이벤트 기반의 자동화를 구현할 수 있습니다.

Creating some flows


다음의 3가지 요구사항을 구현해보도록 하겠습니다.

  • Case 레코드의 상태가 Closed로 바뀌면 Chatter 포스트를 생성한다.
  • 유저에게 설문조사를 요청하고 수집한 정보를 커스텀 객체에 저장한다.
  • 기회(Opportuinity)가 Closed Won 상태로 변경될 때 레코드 소유자에게 이메일 알림을 보낸다.

요구사항1 구현


Quick Find에서 Flows를 검색해서 접근한뒤 New 버튼을 누르면 위와 같이 생성할 Flow의 타입을 지정할 수 있습니다.

요구사항이 Case 레코드의 상태필드에 따른 Flow이므로 Record-Triggered Flow를 선택했습니다.


이후 해당 Flow를 적용할 Object를 선택해주고 Trigger의 종류를 선택했습니다. 이후 Entry Condition을 Status 필드 값을 기준으로 정의했습니다.

When to Run the Flow for Updated Records에서 컨디션을 만족하는 변경사항이 발생했을때만 Flow를 실행할지, 변경사항이 발생할 때마다 컨디션을 만족하면 Flow를 실행할지 선택할 수 있습니다.


그 아래 Optimize the Flow for 섹션에서는 해당 Flow가 실행할 액션에 따라 최적화 옵션을 선택할 수 있습니다.

  • Fast Field Updates (빠른 필드 업데이트)

    • 상황: 데이터베이스에 레코드를 저장하기 전에 특정 필드를 빠르게 업데이트해야 할 때 사용합니다. 이는 데이터의 일관성을 확보하고, 후속 처리에 필요한 데이터를 미리 준비하는 데 유용합니다.
    • 예시: 사용자가 영업 기회(Opportunity) 레코드를 생성할 때, 해당 영업 기회의 금액이 특정 금액 이상이면 자동으로 '대규모 영업 기회'라는 분류 필드를 설정해야 합니다. 이 경우, 레코드가 데이터베이스에 저장되기 전에 '대규모 영업 기회' 필드를 빠르게 업데이트할 수 있습니다.
  • Actions and Related Records (액션 및 관련 레코드)

    • 상황: 레코드가 저장된 후 추가적인 작업을 수행해야 할 때 사용합니다. 이는 다른 레코드를 업데이트하거나, 이메일을 보내는 등의 후속 작업이 필요한 경우에 적합합니다.
    • 예시: 고객이 제품에 대한 새로운 티켓(Ticket)을 생성하면, 해당 티켓과 연관된 고객의 레코드에 '최근 문의 일자'를 업데이트하고, 고객에게 '접수 완료' 이메일을 자동으로 보내야 합니다. 이러한 상황에서 '액션 및 관련 레코드' 옵션을 사용하여 레코드가 저장된 후 필요한 작업을 자동으로 수행할 수 있습니다.
  • Include a Run Asynchronously Path to Access an External System After the Original Transaction for the Triggering Record is Successfully Committed (트랜잭션이 성공적으로 커밋된 후 외부 시스템에 비동기적으로 액세스)

    • 상황: 레코드가 성공적으로 저장된 후 외부 시스템에 접근해야 할 때, 특히 이러한 접근이 시간이 소요되거나 원래의 데이터베이스 트랜잭션 처리 시간에 영향을 주지 않게 하고 싶을 때 사용합니다.
    • 예시: 주문(Order) 레코드가 성공적으로 생성된 후, 이 주문 정보를 회계 시스템에 전송해야 합니다. 이 때, 회계 시스템 처리는 시간이 걸릴 수 있으므로, 원래의 주문 레코드 생성 트랜잭션이 완료된 후에 비동기적으로 회계 시스템에 접근하여 데이터를 전송하는 것이 효율적입니다.

현재 요구사항은 필드 업데이트나 비동기 처리가 필요하지 않으므로 Actions and Related Records로 선택했습니다.


이후 좌측 Toolbox의 Elements에서 Actions아이템을 드래그&드랍으로 추가하면 새로운 액션을 정의할 수 있습니다.

Action을 Post to Chatter로 선택해주고 Label과 API Name을 입력했습니다. 임의의 메세지를 입력하고 Target Name or ID는 미리 생성해놓은 Chatter Group의 ID를 입력했습니다.


정의한 내용을 위와 같이 시각적으로 확인할 수 있습니다.
해당 Flow를 저장하고 Activate 해주었습니다.


동작 테스트를 위해 기존에 존재하는 Case 레코드의 상태를 Closed로 변경해보겠습니다.

정상적으로 지정한 Chatter Group에 Post한 것을 확인할 수 있습니다.

요구사항2 구현

Screen Flow 정의

두번째 요구사항인 - 유저에게 설문조사를 요청하고 수집한 정보를 커스텀 객체에 저장한다. 를 구현하기 위해서 먼저 Screen Flow를 정의해보겠습니다.


Flows에서 New Flow 버튼을 누른뒤 Screen Flow를 선택했습니다.


좌측의 Toolbox에서 Screen 요소를 드래그&드랍하면 위와 같이 새로운 스크린을 정의할 수 있습니다.

Label과 API Name을 구분해서 입력해주고 Picklist 컴포넌트를 추가한뒤에 Label과 Choices를 2지선다로 추가했습니다.


이후 유저의 응답에 따라 다른 화면을 보여주어야 하므로 우선 위와 같이 No를 선택했을때의 Screen을 추가했습니다.

Yes를 선택한 경우 진행할 서베이의 내용을 포함한 Screen도 위와 같이 정의했습니다.


이후 Yes or No에 따라 분기 할 수 있도록 Decision 요소를 끌고오면 위와 같이 분기할 조건을 정의할 수 있습니다.

Yes를 고른경우를 하나의 Outcome 결과로 지정하고 Condition을 위와 같이 지정했습니다. Resources영역에서 해당 Flow Builder 페이지에 추가한 요소나 컴포넌트, choices 등 에 기반해서 컨디션을 정의할 수 있습니다. No의 경우는 별도로 지정하지 않고 Default Outcome 그대로 두었습니다.


이후 Decision 요소와 각각의 Screen을 드래그&드랍으로 연결시키면 원하는 Outcome을 선택해서 맵핑할 수 있습니다.

위와 같이 Flow Builder에서 지정한 label과 Outcome등 을 기반으로 직관적으로 한눈에 파악할 수 있습니다. 저장한 이후 Run버튼을 눌러 Flow를 테스트 해볼 수 있습니다.

버튼으로 Flow 호출


Object Manage에서 원하는 Object의 Buttons,Links, and Actions 메뉴에서 New 버튼을 눌러 새로운 버튼을 정의할 수 있습니다.

Content Source에서 URL을 선택하고 값으로 /flow/ 하위에 원하는 Flow의 API Name을 입력하면 됩니다.

이후 해당 버튼을 Page Layout에 추가해줘야 합니다. Page Layout으로 가서 Mobile & Lightning Actions 카테고리를 선택하면 새로 정의한 버튼을 볼 수 있습니다. 해당 버튼을 Salesforce Mobile and Lightning Experience Actions영역으로 드래그&드랍 해주고 저장했습니다.

이후 레코드를 조회해보면 우측 상단에 해당 버튼이 정상적으로 노출되는 것을 확인 할 수 있습니다.

Create Survey Custom Object


Survey에 유저가 응답한 정보를 저장할 Custom Object를 생성하고 Survey 항목에 해당하는 커스텀 필드들을 위와 같이 생성했습니다.

Create Records


이후 다시 Flow Builder로 가서 Create Records 요소를 드래그&드랍으로 추가한뒤 위와 같이 정의했습니다. 각 필드에 들어갈 값을 Screen Component와 손쉽게 맵핑할 수 있습니다.

그리고 해당 요소를 Survey Question Screen과 연결시켜주었습니다.

테스트를 위해 위와 같이 Survey를 진행했습니다.

이후 Survey 레코드를 조회해보면 진행한 Survey에 입력한 값대로 레코드가 생성된 것을 확인할 수 있습니다.

요구사항3 구현

Create an Email Alert

세번째 요구사항인 기회(Opportuinity)가 Closed Won 상태로 변경될 때 레코드 소유자에게 이메일 알림을 보낸다. 를 구현하기 위해 새로운 Email Alert을 생성하겠습니다.


위와 같이 Object를 Opportunity로 설정하고 Email Template은 편의상 기존것을 재적용 했습니다. 수신자의 타입을 Owner로 지정해서 레코드 소유자에게 보낼 수 있도록 했습니다.

Create a new Flow


레코드의 상태필드에 따른 Flow이므로 새로운 Record-Triggered Flow를 생성해줍니다.

요구사항에 따라 Trigger를 레코드가 업데이트될 때로 설정하고, Entry Condition을 StageNameClosed Won일때로 정의했습니다.


이후 이메일 발송을 위해 Action 요소를 드래가&드랍으로 추가했습니다. Action에서 이전에 생성한 Email Alert을 검색해서 선택할 수 있습니다. Email Alert의 경우 해당 액션을 실행할 레코드에 대한 구분이 필요하므로 Record의 ID를 Global Varialbe로 제공했습니다.

위와 같이 Action을 연결해주고 저장한 뒤 Activate 했습니다.


테스트를 위해 기존에 존재하는 Record의 Stage를 위와 같이 변경했습니다.

기존의 템플릿을 재사용해서 내용은 관계가 없지만, 정상적으로 메일 알림이 온 것을 확인할 수 있었습니다.

Schedule-Triggered Flows


스케줄 트리거 플로우(Scheduled Triggered Flows)는 일정에 따라 자동으로 실행되는 플로우를 말합니다. 이를 통해 Apex Schedule Jobs나 Batch Apex를 사용하지 않고도 반복적인 비즈니스 요구 사항을 충족시킬 수 있습니다. 개발 역량 없이도 다양한 자동화 작업을 수행할 수 있어 유용합니다.

장점

  • 개발 비용 절감: 개발 소요 없이도 플로우 빌더를 사용하여 비즈니스 요구 사항을 충족할 수 있습니다.
  • 자동화: 반복적인 작업을 자동화하여 인적 오류를 줄이고 효율성을 높일 수 있습니다.
  • 유연성: 스케줄에 따라 다양한 작업을 설정할 수 있어 비즈니스 요구 사항에 맞춘 맞춤형 솔루션을 구현할 수 있습니다.

Create a Schedule-Triggerd Flow


다음의 요구사항을 충족하는 스케줄 트리거 플로우를 구현해보겠습니다.

  • 요구사항: Case 오브젝트에서 상태가 new인 레코드의 Priority를 High로 변경하는 작업을 매일 실행한다.


Schedule-Triggered Flow 타입을 선택하고 Flow를 생성합니다.


Set Schedule 버튼을 눌러서 위와 같이 스케줄을 정의했습니다.


이후 Choose Object 버튼을 누른뒤에 어느 오브젝트에 대해서 정의할지 선택합니다.

Condition을 정의해서 조건을 만족하는 레코드에 대해서 수행하도록 할 수 있지만 지금의 요구사항에서는 None으로 선택했습니다.


ToolBox에서 Update Records 요소를 드래그&드랍해서 추가하고 위와 같이 정의했습니다. 기존에 Priority가 High인 레코드를 중복으로 업데이트 하지 않도록 컨디션을 정해주고 Priority의 필드를 High로 업데이트 하도록 했습니다.


저장하고 활성화 해준 뒤에 Quick Find에서 Scheduled Jobs를 검색하여 접근하면 예약된 작업들을 조회할 수 있습니다. 정의한 Flow가 정상적으로 예약된 것을 목록에서 조회할 수 있습니다.

Platform Event Triggered Flow

Platform Event란?

플랫폼 이벤트는 이벤트 기반 아키텍처(Event-Driven Architecture)를 기반으로 하여 Salesforce 내부 및 외부 애플리케이션 간의 통신을 가능하게 합니다. 플랫폼 이벤트는 publish/subscribe 모델에 기반하며, 메시지 버스(message bus)와 직접 연동되어 들어오는 이벤트의 큐(queue)를 처리하고 이를 수신 대기 중인 프로세스에 전달합니다. 이는 실시간 통합 패턴을 제공하여 포인트 투 포인트(point-to-point) 통합을 줄이는 데 도움을 줍니다.

플랫폼 이벤트 트리거 플로우의 장점

  • 중앙 집중화된 자동화: 플랫폼 이벤트 메시지가 수신될 때 플로우를 트리거하여 모든 자동화를 한 곳에서 관리할 수 있습니다.
  • 실시간 통합: 애플리케이션 간 실시간 통합이 가능하여 데이터 처리 속도를 향상시킵니다.
  • 유연성: 다양한 이벤트를 기반으로 자동화를 설정할 수 있어 비즈니스 요구사항에 맞춘 맞춤형 솔루션 제공이 가능합니다.

Create a Platform Event

다음의 요구사항을 플랫폼 이벤트 트리거 플로우를 통해 구현해보겠습니다. - 메세지를 포함한 플랫폼 이벤트를 수신하여 해당 메세지를 Chatter에 게시한다.


Quick Find에서 Platform Events를 검색하여 접근한뒤 New Platform Event를 눌러 새로운 이벤트를 생성할 수 있습니다.

위와 같이 설정하고 저장해줬습니다.


이후 해당 Event에 두가지 커스텀 필드를 생성했습니다.

Create a Platform Event Triggered Flow


새로 생성할 플로우의 타입을 선택하고 생성했습니다.

Choose Platform Event를 눌러서 위에서 생성한 이벤트를 지정해줍니다.


이후 Chatter에 Post하기 위해 Toolbox에서 Action 요소를 드래그&드랍으로 추가해준 뒤에 위와 같이 Post to Chatter 액션을 정의했습니다. Message에는 해당 Platform Event의 커스텀 필드인 Message 필드를 추가하고 Target에는 기존에 정의한 Chatter Group의 ID를 입력했습니다.


정의한 액션을 연결하고 활성화 해주었습니다.


이후 테스트를 위해 위와 같이 Developer Console에서 Platform Event를 발행했습니다.


Flow에서 지정한 Chatter Group을 조회해보면 발행한 Message가 정상적으로 등록된 것을 확인할 수 있습니다.

Auto-Launched Flows


이 Flow는 레코드가 삽입, 업데이트 또는 삭제될 때 Apex 클래스, Process Builder 또는 REST API에 의해 자동으로 실행될 수 있습니다. 이 Flow 유형은 시작할 때 사용자 상호 작용이 필요하지 않습니다. 따라서 단계, 화면, 선택 항목 또는 동적 선택 항목이 포함되지 않습니다.

Auto-launched Flows는 Apex 클래스, Process Builder 또는 REST API에 의해 호출될 때 실행됩니다. 이러한 Flow는 특정 이벤트나 조건에 따라 자동으로 실행됩니다. Auto-launched Flows는 배경에서 복잡한 프로세스를 수행할 수 있도록 정의할 수 있기 때문에 추상화를 제공합니다. 사용자는 세부 사항을 알지 못한 채로 작업이 진행됩니다.

Business Scenario


다음의 요구사항을 Auto-Launched Flow로 구현해보도록 하겠습니다.

타입이 New Customer인 새로운 Opportunity 레코드가 발생할 때, 다음과 같은 조치를 취하려고 합니다.

  1. Opportunity의 단계를 Qualification으로 변경: VP of Sales가 판매 과정을 더 잘 이해할 수 있도록 합니다.
  2. Sales Rep에게 태스크 생성: Opportunity를 소유한 Sales Rep에게 고객에게 전화를 걸어 추가 정보를 얻도록 하는 태스크를 생성합니다.
  3. 환영 이메일 발송: 고객에게 Sales Representative와의 통화 일정에 대한 안내를 포함한 환영 이메일을 보냅니다.

각각의 요구사항은 Record-Triggerd Flow로도 구현할 수 있지만, Auto-Launched Flow 활용을 위해 해당 플로우를 사용하고 Process Builder로 Invoke 하도록 구현해보겠습니다.

요구사항1 구현

Auto-Launched Flow 생성


플로우 타입을 선택하고 생성합니다.


생성될 레코드의 정보를 담기위해 새로운 변수를 생성해야 합니다. Toolbox의 Manager탭에서 New Resource를 선택하여 위와 같이 새로운 레코드 변수를 생성했습니다.


이후 Update Records 요소를 추가한뒤에 위와 같이 정의했습니다. 컨디션으로 새로 만든 변수가 포함할 ID로 업데이트할 레코드를 식별할 수 있도록 했습니다.

Process Builder로 Flow 호출


Auto-Launched Flow를 호출하기 위한 Process를 Process Builder로 생성해보겠습니다.

Object를 Opportunity로 선택한뒤에 Criteria를 위와 같이 설정했습니다.

이후 action을 추가하여 위와 같이 flow 타입을 정의하고 새로 만든 Flow를 선택했습니다. 그리고 레코드에 대한 정보를 새로 정의한 변수에 담아 보내도록 했습니다.

요구사항1 적용 확인


테스트를 위해 위와 같이 Type을 New Customer로 설정하여 레코드를 생성해보았습니다.

이후 레코드의 Stage가 Flow에서 설정한대로 Qulification으로 정상적으로 변경된 것을 확인할 수 있습니다.

요구사항2 구현


새로운 Task 레코드를 생성해야 하므로 Create Records 요소를 생성하고 위와 같이 정의했습니다.


위와 같이 요구사항1의 요소와 연결해주고 저장&활성화 했습니다.

요구사항2 적용 확인


테스트를 위해 위와 같이 새로운 레코드를 생성했습니다.



해당 Opportunity의 Stage가 정상적으로 업데이트되고 Account에게 새로운 Task가 정상 할당 된 것을 확인할 수 있습니다.

요구사항3 구현

Create a Custom Field


세번째 요구사항인 3. 환영 이메일 발송: 고객에게 Sales Representative와의 통화 일정에 대한 안내를 포함한 환영 이메일을 보냅니다.를 구현하기 위해서 고객의 Email 정보가 필요하므로 해당 Email 타입의 커스텀필드를 생성했습니다.

Create a Email Template


해당 고객에게 보낼 Email Template도 새로 생성했습니다.


새로운 Email Alert을 생성해서 생성한 메일 템플릿을 지정하고 수신자를 Email Field로 지정했습니다.

Add an Action Element to the Flow


이제 Flow에서 Action 요소를 추가해서 생성한 Email Alert으로 지정해줍니다. Input Value로는 기존에 정의한 변수를 활용하여 ID값을 전달해서 액션을 적용할 레코드를 식별할 수 있도록 했습니다.


결과적으로 위와 같이 요구사항1,2,3에 해당하는 액션들이 모두 정의되었습니다.

요구사항3 적용 확인


Flow가 정상 동작하는지 확인을 위해 위와 같이 새로운 레코드를 생성했습니다.



요구사항1,2,3에 해당하는 필드 업데이트, 태스크 생성, 이메일 발송이 모두 동작하는 것을 볼 수 있습니다.

Invoke a Flow from APEX


새로운 Auto-Launched Flow를 생성하고,
레코드ID를 저장할 Input용 변수와 Stage 필드의 값을 반환할 Output용 변수를 선언했습니다.


이후 Get Records 요소를 추가하여 위와 같이 정의했습니다. APEX 코드로 부터 전달할 varToStoreRecordId를 조건으로 지정해서 레코드를 식별하고, 찾아온 레코드 중 StageName 필드의 값을 varToStoreStageValue 변수에 담도록 했습니다.


이제 Developer Console에서 APEX 코드를 통해 정의한 Flow를 호출하고 반환되는 값을 출력해보겠습니다.

Map<String,Object> params = new Map<String,Object>();
params.put('varToStoreRecordId','006dL000000AyRUQA0');
Flow.Interview.Invoke_Flow_via_APEX stage= new Flow.Interview.Invoke_Flow_via_APEX(params);
stage.start();

String stageName = (String)stage.getVariableValue('varToStoreStageValue');
System.debug('current stage of the opportunity is:' + stageName);

위와 같이 맵에 변수명과 조회할 레코드의 ID를 담아서 Flow 인스턴스를 생성하고 start 메소드를 통해 플로우를 호출합니다.

이후 해당 Flow가 getVariableStageName 변수에 담은 값을 불러와서 stageName 변수에 담고 debug 레벨로 출력하도록 했습니다.



해당 Id를 가진 레코드의 Stage가 Closed Won이라고 출력되었고 해당 Id의 레코드를 조회해보면 레코드의 상태가 올바르게 반환된 것을 확인할 수 있습니다.

profile
100번 고민보다 1번 실행

0개의 댓글