-
Future 메소드에서 sobject를 파라미터 받지 못하는 이유는?Etc 2024. 3. 15. 22:51
왜 Future 메소드는 Sobjects를 파라미터로 받지 못하는데 Queueable Apex는 받을 수 있나?
Future 메소드는 다른 컨텍스트에서 실행되기 때문에 전달된 Sobjects의 상태가 실제 로직이 실행되는 동안
변경될 수 있다.
따라서 future 메소드에서 DML을 수행할 경우 오래된 데이터로 레코드를 덮어쓸 위험이 있다.
반면에, Queueable Apex에서 SObjects를 매개변수로 받을 수 있다여기서 상태 문제가 적용되지 않는 이유는 Queueable Apex가 실행되기 전에 최신 상태의 SObject를 조회하여 사용할 수 있기 때문이다.라고 여러 블로그에서도 통일한 상식이 많이 공유되어 있습니다. 하지만, 그렇지 않습니다!!!
Apex가 처음 개발되었을 때는 단순히 트리거 언어였습니다.그러나 시간이 지나면서 Apex의 범위는 확장되었고, 그 결과 Salesforce는 future 메소드와 다른 여러 기능들을 도입했습니다.
Salesforce는 데이터 상태 문제 - Stale Data Issues를 인지하고 있었기 때문에, SObjects를 매개변수로
사용하는 것에 제한을 두었을 것입니다.
그러나 Apex 개발자들이 이를 직렬화하고 Map을 사용하여 문제를 우회하기 시작했습니다.Future, Queueable, Batch 또는 API 등을 사용하든, 항상 Stale Data로 레코드를 덮어쓸 위험이 존재합니다.
이러한 문제는 데이터가 전달되는 시점과 실제 처리 시점 사이에 데이터 상태가 변경될 수 있기 때문에 발생합니다.
따라서 개발자는 이러한 문제를 인식하고, 가능한 경우 최신 데이터를 사용하여 작업을 수행하거나, 데이터 불일치의 가능성을 최소화하기 위한 추가적인 로직을 구현해야 합니다.출처 : salesforce partner community 공지사항
Future메서드와 Queueable 모두 데이터 상태 문제를 가지고 있어서 조심해야 된다 - OK
그래서 Future 메서드에서 sObject를 파라미터로 받지 못하는 이유가 뭔지?
내가 생각한 이유 - class의 인스턴스화 여부
future 메소드는
- 인스턴스화되지 않은 클래스 내에서 실행되고, 비동기적으로 실행되는 정적 메소드이다.
- SObject를 파라미터로 전달할 수 없다.
Queueable Apex 클래스는
- 비동기 작업을 나타내는 개체로 인스턴스화된다.
- SObject를 포함한 다양한 데이터 유형을 파라미터로 받을 수 있다.
반응형