salesforce batch 만드는 방법 예제 1) 세일즈포스 배치

Salesforce Batch 만드는 방법

Salesforce Batch는 대용량 데이터를 효율적으로 처리하기 위한 것이다. 자바의 일반 대용량 처리를 생각하면 된다. Salesforce의 Governor Limits이 있다. 각종 limit으로 데이터 처리가 쉽지 않기 때문에 배치 작업을 해야 한다. 수백만건도 아니고 몇천건만 되도 데이터 작업을 분할하여 실행해야 한다.

Salesforce Batch

Introduction to Salesforce Batch

Batch Apex는 Salesforce에서 대량의 데이터를 처리하는 데 사용되는 비동기 Apex 작업

  • 특징
    • 대량 데이터 정리
    • 복잡한 데이터 변환
    • 정기적인 데이터 동기화
    • 비동기 처리
    • 트랜잭션 분리로 성능 최적화
    • Salesforce Governor Limits 준수

Batch Apex Basics

  • Batch Apex는 Salesforce의 Database.Batchable 인터페이스를 구현하는 클래스
  • Key Components:
    • start Method: 데이터를 초기화하고 쿼리를 정의 ( 대상 모수 선정 )
    • execute Method: 레코드를 처리 (분할잡업)
    • finish Method: 후처리 작업

When to Use Batch Apex

Batch Apex는 다음과 같은 경우에 적합합니다:

  1. 대량 데이터 작업이 필요한 경우.
  2. 정기적인 데이터 동기화가 필요할 때.
  3. Governor Limits로 인해 트랜잭션을 나눌 필요가 있을 때.
  • 대안으로는 Queueable Apex, Future Methods, 또는 Flows를 사용할 수 있음.

Prerequisites for Creating Batch

  • 기본 요구 사항:
    • Salesforce Apex 기본 지식
    • SOQL 및 SOSL 쿼리 작성 능력
    • Salesforce Governor Limits 이해
  • Governor Limits:
    • 단일 Batch Chunk에서 최대 10,000개의 DML 작업
    • 최대 50개의 Query 실행

Batch Apex Architecture

  • start: 데이터를 쿼리하거나 목록을 초기화
  • execute: 쿼리된 데이터를 처리
  • finish: 배치 작업이 완료된 후 수행할 작업을 정의

start 로직 예시

global Database.QueryLocator start(Database.BatchableContext BC) {
    return Database.getQueryLocator('SELECT Id, Name FROM Account');
}

execute 로직 예시

global void execute(Database.BatchableContext BC, List<Account> scope) {
    for (Account acc : scope) {
        acc.Name = 'Updated Name';
    }
    update scope;
}

finish 로직 예시

global void finish(Database.BatchableContext BC) {
    System.debug('finish Batch!!!!!!!!!!');
}

Guide to Creating a Batch Apex

1. Batch Class 생성

//apex 파일 예) AccountUpdateBatch.cls
global class AccountUpdateBatch implements Database.Batchable<SObject> {
    
    global Database.QueryLocator start(Database.BatchableContext BC) {
        return Database.getQueryLocator('SELECT Id, Name FROM Contact');
    }

    global void execute(Database.BatchableContext BC, List<Contact> scope) {
        for (Contact ObjContact : scope) {
            con.LastName = 'Updated Name';
        }
        update scope;
    }

    global void finish(Database.BatchableContext BC) {
        System.debug('Batch Completed!');
    }
}

2. Batch 실행 하는 방법

AccountUpdateBatch batch = new AccountUpdateBatch ();
//200건씩
Database.executeBatch(batch, 200);

3. Test Class 작성

@isTest
private class AccountUpdateBatch_test {

    @isTest 
        static void testBatch() {
        // 테스트 데이터 준비
        List<Contact> contacts = new List<Contact>();
        for (Integer i = 0; i < 200; i++) {
            contacts.add(new Contact(LastName = 'Test' + i));
        }
        insert contacts;

        // 배치 실행
        Test.startTest();
        MyBatchClass batch = new MyBatchClass();
        Database.executeBatch(batch, 200);
        Test.stopTest();

        // 확인
        System.assertEquals('Updated Name', [SELECT LastName FROM Contact LIMIT 1].LastName);
    }
}

참고 문서 : 세일즈포스 가이드

Leave a Comment