Developer문서 참고: https://developer.salesforce.com/docs/atlas.en-us.platform_events.meta/platform_events/platform_events_intro_emp.htm
플랫폼 이벤트(Platform Event)란?
- 플랫폼 이벤트는 Salesforce에서 비즈니스 프로세스나 시스템 통합 작업을 처리하기 위한 커스텀 이벤트이다.
- 플랫폼 이벤트 메시지는 Event bus에 publish되며, Event bus에 일시적으로 저장된다.
- High-volume platform event messages는 Event bus에 72시간(3일) 동안 저장된다
- Legacy standard-volume platform event messages는 Event bus에 24 hours (1 day)동안 저장된다
- Pub/Sub API를 사용하여 Event bus에서 저장된 이벤트 메시지를 검색할 수 있다.
- EX) 주문이 완료되었을 때 "주문 완료"라는 이벤트를 발행하고, 이 이벤트를 구독하는 다른 시스템이 그 정보를 실시간으로 수신하거나 후속조치를 할 수 있다.

https://developer.salesforce.com/docs/atlas.en-us.platform_events.meta/platform_events/platform_events_intro_architecture.htm
플랫폼 이벤트(Platform Event)에 대한 Log 확인
1. Publish 시 로그
- 이벤트를 발행한 Apex 트랜잭션은 일반적인 동기 Apex 트랜잭션에서 처리된다
- 일반적인 Apex코드와 같이 Developer Console통해서 확인이 가능하다.
- 즉 이벤트를 발행하는 코드는 다른 Apex 코드와 마찬가지로 일반적인 트랜잭션 규칙을 따르기 때문에 이 트랜잭션 내에서 발생한 모든 작업(DML)은 동기적으로 처 리되며, 트랜잭션 내의 모든 작업이 성공해야만 커밋된다
2. Platform Event Trigger 로그(구독시)
- Standard Object 또는 Custom Object에 대한 Trigger와 달리, 완전히 분리된 별도의 트랜잭션에서 실행된다.
- ⇒ 플랫폼 이벤트가 비동기로 처리되기 때문에, 이벤트를 발행한 순간과 그 이벤트에 반응하는 트리거가 실행되는 순간이 분리되어 처리됨
- Automated Process라는 시스템 사용자 엔터티에서 실행되므로 디버그 로그는 Developer Console을 통해서 바로 확인 할 수 없고 Automated Process 엔터티에 대한 추적 플래그를 설정하여 디버그 로그를 수집하여 확인할 수 있다
- 플랫폼 이벤트 Trigger 디버그 로그 설정 방법:
- Setup에서 Debug Logs를 검색하여 클릭
- New 버튼을 클릭
- Traced Entity Type에서 Automated Process를 선택 후 디버그 레벨 선택
Platform Event를 발행(Publish)하는 방법
- Flows - https://developer.salesforce.com/docs/atlas.en-us.platform_events.meta/platform_events/platform_events_publish_flow.htm
- Apex - https://developer.salesforce.com/docs/atlas.en-us.platform_events.meta/platform_events/platform_events_publish_apex.htm
// Order_Event__e는 사전에 정의된 플랫폼 이벤트 오브젝트임.
// 이 코드는 일반적인 동기 Apex 트랜잭션에서 실행된다
Order_Event__e orderEvent = new Order_Event__e(Order_Number__c = '105', Has_Shipped__c = true);
// EventBus.publish를 사용하여 플랫폼 이벤트를 발행
//// 이벤트가 발행되면 구독 중인 시스템이나 트리거에서 이 이벤트를 수신할 수 있다
Database.SaveResult sr = EventBus.publish(orderEvent);
// 발행 성공 여부 확인 : 이벤트 발행 결과를 SaveResult 객체로 반환함
if (sr.isSuccess()) {
System.debug('이벤트가 성공적으로 발행되었습니다.');
} else {
System.debug('이벤트 발행 실패: ' + sr.getErrors()[0].getMessage());
}
** 참고: 플랫폼 이벤트의 publish작업은 비동기로 발생한다.
EventBus.publish() 호출의 결과로 반환되는 Database.SaveResult는 즉시 발행이 성공했는지 여부가 아니라, 발행 요청이 큐에 정상적으로 추가되었는지를 알려주는 것이다.
즉시 반환되는 결과:
- EventBus.publish() 호출 후 즉시 반환되는 Database.SaveResult는 발행 작업이 큐에 정상적으로 추가되었는지 여부만 알려준다.
- 즉, 이벤트가 실제로 발행된 것이 아니라, 발행이 큐에 대기 중인 상태를 의미한다.
- 이벤트 메시지에 필수 필드가 누락되었거나 잘못된 데이터가 있으면, 즉시 오류가 발생하여 Database.SaveResult로 반환된다.
발행 작업의 최종 결과:
발행 작업이 큐에 추가된 후, 시스템 리소스가 사용 가능해지면, 그때 실제로 발행이 진행된다.
Apex Publish Callback:
이벤트 발행 여부의 최종 결과는**Apex Publish Callback의 구현을 통해서 확인이 가능하다.**
Platform Event를 구독(subscribe)하는 방법
Apex Trigger
Streaming API (CometD 기반)
Salesforce의 Streaming API를 사용하여 CometD 프로토콜을 통해 이벤트를 구독할 수 있습니다.
CometD 클라이언트를 사용하면 Salesforce 플랫폼 이벤트, Change Data Capture 이벤트 등을 외부 애플리케이션에서 구독할 수 있습니다.
JavaScript CometD 클라이언트로 이벤트 구독
//CometD 객체를 생성 //CometD는 Bayeux라는 메시징 프로토콜을 구현한 라이브러리로 // Salesforce의 Streaming API를 사용하여 플랫폼 이벤트나 Change Data Capture 이벤트 등을 구독할 때 사용된다 var cometd = new org.cometd.CometD(); //플랫폼 이벤트 채널인 /event/Order_Completed__e에 subscribe하는 메서드 cometd.subscribe('/event/Order_Completed__e', function(message) {//이벤트를 수신했을 때 실행되는 콜백 함수 console.log('Order Completed Event Received:', message); });
Emp API(lightning)
- Salesforce의 Lightning Component에서 제공되는
lightning:empApi를 사용하여 이벤트를 구독할 수 있습니다. - Emp API는 CometD 프로토콜을 내부적으로 사용하며, Lightning 컴포넌트 또는 LWC(Lightning Web Component) 내에서 플랫폼 이벤트를 구독할 때 사용됩니다.
- Salesforce의 Lightning Component에서 제공되는
Pub/Sub API (gRPC 기반)
- Pub/Sub API는 gRPC와 HTTP/2를 기반으로 이벤트를 구독할 수 있다.
- 주로 대량의 이벤트를 처리하거나 외부 시스템과의 통합에 많이 사용된다
- Pub/Sub API는 이벤트를 Apache Avro 바이너리 포맷으로 전달하여 성능이 뛰어납니다.
Flow
- Flow에서도 Trigger와 마찬가지로 플랫폼 이벤트 구독 가능
❇️ 정리
- 외부 시스템에서 이벤트를 실시간으로 구독하려면 CometD나 Pub/Sub API
- Streaming API(CometD)
- 외부 시스템에서 소규모 실시간 데이터 처리가 필요할 때 Streaming API를 사용.
- 외부 시스템에서 Salesforce의 플랫폼 이벤트나 Change Data Capture(CDC) 이벤트를 실시간으로 구독할때 사용
- Pub/Sub API
- 대규모 실시간 이벤트 처리 및 확장성이 필요할 때 Pub/Sub API를 사용.
- Streaming API(CometD)
- Salesforce 내에서 이벤트 처리를 원한다면 Trigger 또는 Flow
- Lightning Component에서 직접 이벤트를 구독하려면 Emp API