본문 바로가기
SFDC 개념

Salesforce Apex 용어

by 경 훈 2023. 7. 7.
Salesforce 개발자로 시작하는 것은 벅찬 경험일 수 있습니다. 좌우에 떠도는 유행어 때문에 모두가 실제로 말하는 내용을 이해하기 어려울 수 있습니다.

도움을 드리고자 제가(그리고 함께 일한 팀) 자주 사용하는 키워드 용어집을 만들었습니다. 다음에 이 용어 중 하나를 들었을 때 당신은 고장난 만능 번역기와 함께 스타트렉의 한 장면에 착륙했습니다!

 

추상 클래스(Abstract Class)

추상 클래스는 "abstract" 키워드로 정의된 클래스입니다. 이 키워드는 다음과 같은 방식으로 클래스의 동작을 크게 변경합니다.

  • 클래스가 직접 초기화되는 것을 방지합니다.
  • 추상 메서드(서명만 정의하고 본문은 없는 메서드)의 정의를 허용합니다.
  • 가상 메서드 정의를 허용합니다(자세한 내용은 가상 클래스 참조).
  • 보호된 방법의 사용을 허용합니다(자세한 내용은 보호된 방법 참조).
  • 추상 클래스를 확장하는 클래스에서 변수를 정의하고 사용할 수 있습니다.

이 클래스는 다른 클래스가 특정 동작을 확장하고 정의하기 위한 템플릿 클래스가 됩니다. 동작은 인터페이스와 유사하지만 추상 클래스를 사용하여 밀접하게 관련된 여러 클래스 간에 코드 및 변수 선언을 공유해야 합니다. 클래스는 다른 클래스 하나만 확장할 수 있습니다.

 

집계 쿼리

데이터베이스에서 레코드 목록을 반환하는 대신 값과 필드가 SELECT 쿼리에 있는 항목에 따라 달라지는 AggregateResult SObject 목록을 반환하는 특수 유형의 SOQL 쿼리입니다.

다른 집계 함수를 사용하여 집계 쿼리를 추가로 사용자 지정할 수 있습니다.

  1. AVG() – 필드 값의 평균(평균)을 반환합니다.
  2. COUNT() – 쿼리와 일치하는 행 수를 반환합니다.
  3. COUNT_DISTINCT() – 쿼리와 일치하는 고유하고 null이 아닌 필드 값의 수를 반환합니다.
  4. MIN() – 필드의 최소값을 반환합니다(숫자 필드일 필요는 없음).
  5. MAX() – 필드의 최대값을 반환합니다(숫자 필드일 필요는 없음).
  6. SUM() – 숫자 필드의 총 합계 값을 반환합니다.

이러한 기능은 GROUP BY 절을 사용하여 더욱 향상될 수 있습니다(자세한 내용은 GROUP BY 참조).

 

주석(Annotation)

동작을 변경하는 클래스, 메서드 또는 변수에 대한 수정자입니다. 모든 주석은 "@"로 시작합니다. 

Apex에서는 다음 주석에 액세스할 수 있습니다. 

  • @AuraEnabled
  • @Deprecated
  • @Future
  • @InvocableMethod
  • @InvocableVariable
  • @IsTest
  • @JsonAccess
  • @NamespaceAccessible
  • @ReadOnly
  • @RemoteAction
  • @SuppressWarnings
  • @TestSetup
  • @TestVisible
  • @ReadOnly
  • @RestResource(urlMapping=’/yourUrl’)
  • @HttpDelete
  • @HttpGet
  • @HttpPatch
  • @HttpPost
  • @HttpPut
 
 

안티 조인(Anti-Join)

WHERE 절에 NOT IN 절 내에서 사용되는 하위 쿼리가 포함된 테이블에 대한 SOQL 쿼리입니다.

다음은 이번 달에 마감된 Opportunity가 없는 계정을 반환하는 예입니다.

 

인수(Arguments)

런타임 중에 호출될 때 메서드에 전달된 값입니다. 이것은 코드를 작성할 때 정의하는 변수인 매개변수와 대조됩니다.

 

비동기 프로그래밍(Asynchronous Programming)

호출되는 즉시 실행되지 않는 코드입니다. Apex를 비동기식으로 실행하는 네 가지 방법이 있습니다.

 

  • Queueable Apex
  • Schedule Apex
  • Batch Apex
  • Future methods

 

 

AuraEnabled

정적 메서드에 대한 주석 또는 Lightning 구성 요소 또는 흐름 내에서 사용에 플래그를 지정하는 인스턴스 변수입니다.

  • 정적 메서드(Static method) : Lightning 구성 요소에서 호출할 수 있는 것으로 이 메서드에 플래그를 지정합니다. 이 사용 사례에서 주석을 "@AuraEnabled(cacheable=true)"로 정의할 수도 있습니다. 이 주석은 반환 값 클라이언트 측을 캐시하고 Wire 서비스에서 메서드를 사용할 수 있도록 하며 DML이 수행되는 것을 방지합니다.
  • 인스턴스 변수(Instances variable) : Lightning 구성 요소로 보낼 때 이 변수를 직렬화해야 하거나 클래스 및 변수를 Flow 내에서 사용자 정의 데이터 유형으로 사용할 수 있음을 나타냅니다. 변수가 유효한 가져오기 및 설정 블록이 있는 변수로 정의된 경우 Lightning 구성 요소에서 이 데이터 유형을 AuraEnabled 메서드의 매개 변수로 사용할 수 있습니다.
 

배치 클래스(Batch Class)

Batchable 인터페이스를 구현하는 클래스로, 클래스를 일괄 작업으로 실행할 수 있습니다. Batch Apex는 비동기식으로 실행되며 1에서 2000 사이의 크기로 많은 수의 레코드를 일괄 처리할 수 있습니다. Batchable 인터페이스는 세 가지 방법으로 구성됩니다.

  1. 시작: 일괄 작업에서 처리할 레코드/객체를 가져오는 데 사용되며 일반적으로 레코드 목록 대신 쿼리에 대한 QueryLocator를 반환합니다.
  2. Execute : 일괄 처리 클래스의 일부로, 이 메서드는 처리할 각 일괄 처리에 대해 호출됩니다.
  3. 마침 : 모든 배치가 처리된 후 호출되며(성공 여부에 관계없이) 모든 사후 작업(예: 작업 상태에 대해 관리자에게 상태 이메일 보내기)에 사용됩니다.
 

호출(Callout)

Salesforce 외부의 외부 서비스에 대한 HTTP 요청입니다. 이들은 Http, HttpRequest 및 HttpResponse 클래스를 활용하여 Apex 코드 조각이 외부 웹 서비스와 통신할 수 있도록 합니다. 일반적으로 일부 JSON 또는 XML을 전송합니다.

콜아웃의 세부 사항은 호출할 외부 서비스에 전적으로 의존하지만 우리가 이들과 통신하는 방법에 대해 이야기할 때 거의 항상 콜아웃을 사용합니다.

 

컨트롤러 클래스(Controller Class)

Visualforce 페이지 뒤에서 논리 역할을 하거나 Lightning 구성 요소 내에서 사용하기 위해 AuraEnabled 메서드를 노출하는 클래스(예: 레코드 가져오기 또는 업데이트된 레코드 가져오기). 이러한 클래스의 이름은 사용자 인터페이스에 대한 모델 보기 컨트롤러 디자인 패턴으로 인해 지정됩니다. 이러한 클래스는 일반적으로 다음과 같이 이름이 지정됩니다.

  • Visualforce페이지 이름 컨트롤러
  • 번개 구성 요소 이름 컨트롤러

사용자 지정 메타데이터(Custom Metadata, CMDT))

사용자 정의 메타데이터 유형은 표준 개체와 별도로 정의된 특수 개체 유형과 같습니다. 이것들은 (개발자로서) 제어할 수 있는 사용자 지정 메타데이터 조각으로, 모든 것을 하드 코딩할 필요 없이 사용자 지정 가능한 코드 조각을 빌드할 수 있습니다.

CMDT를 사용하면 런타임에 쿼리/액세스하여 코드 실행 방법을 사용자 지정할 수 있는 유형의 레코드/인스턴스를 만들 수 있습니다. 이것은 필드를 정의하거나 사용자 정의 관련 목록을 동적으로 작성하는 것부터 통합 내에서 사용할 특정 슬러그를 정의하는 것까지 무엇이든 될 수 있습니다.

그런 다음 이러한 레코드는 코드 및 구성 도구를 통해 액세스할 수 있으며, 이름을 통해 선언적으로 액세스하거나 무료 SOQL 쿼리(캐시되어 있기 때문에!)와 같은 프로그래밍 기법을 통해 액세스할 수 있습니다.

 

사용자 정의 설정(Custom Settings)

사용자 지정 설정은 CMDT와 매우 유사하며 두 가지 유형이 있습니다.

  • List: 이는 일반 레코드와 마찬가지로 Apex에서 동기적으로 쓸 수 있다는 점을 제외하고 사용자 지정 메타데이터와 유사하게 작동합니다. 이것이 요구 사항이 아닌 경우 CMDT가 더 나은 선택입니다!
  • Hierarchical: 이를 통해 조직 전체의 기본값에서 프로필 또는 사용자별 기준에 따른 특정 사용자 지정에 이르기까지 계층적 특성에 따라 사용자 지정을 정의할 수 있습니다.

의존성 주입(Dependency Injection)

클래스의 종속성이 외부적으로 정의되고 클래스가 외부 클래스에 대해 가질 수 있는 모든 종속성이 더 이상 클래스에 밀접하게 결합되지 않아 테스트 중에 모의될 수 있는 디자인 기술입니다.

이 기술을 사용하면 클래스는 일반적으로 생성자나 덜 유리한 @TestVisible 정적 변수를 통해 외부적으로 종속성을 받습니다. 즉, 다른 클래스를 사용하는 클래스를 테스트하려는 경우 다른 클래스와 해당 반환 값을 조롱할 수 있습니다. 본질적으로 이것은 다른 코드 조각(자체 테스트가 있어야 함)을 암시적으로 테스트할 필요 없이 격리된 특정 코드 조각을 테스트할 수 있게 해줍니다. 이렇게 하면 코드베이스의 재사용성, 테스트 가능성 및 유지 관리 가능성이 증가하지만 처음에는 개발을 시작하기가 더 어려울 수 있습니다!

DML

DML은 Data Manipulation Language의 약자로 데이터베이스에 저장된 데이터를 조작하는 데 사용하는 명령문을 설명합니다.

이를 달성하기 위해 코드 전체에서 다음 키워드를 사용합니다.

 

  • Insert
  • Update
  • Delete
  • Upsert
  • Undelete
  • Merge

 

이러한 DML 문 중 일부는 데이터베이스 클래스 내에 있으며 , convertLead()와 같이 해당 문이 없는 다른 메서드도 있습니다.

 

동적 프로그래밍(Dynamic Programming)

일반적으로 Apex 코드를 작성할 때 선언적으로 그렇게 합니다. 이것은 일반적으로 개체의 필드에 액세스할 때 점 표기법을 통해 수행되거나 SOQL 쿼리를 작성할 때 대괄호를 사용하여 수행됩니다. 우리는 디자인 타임에 어떤 일이 일어나길 원하는지 명시적으로 작성했습니다.

동적 프로그래밍은 사용 가능한 데이터 조각을 기반으로 런타임에 작업이나 쿼리에 대한 세부 사항을 유추하도록 하여 이 프로세스를 완전히 뒤집습니다. 이것은 필드 세트에서 쿼리를 동적으로 작성하는 것만큼 간단할 수 있으며 추상 데이터를 기반으로 상위 및 하위 레코드를 생성하는 것과 같이 더 복잡한 것으로 쿼리할 수 있습니다.

동적 apex 는 런타임에 수행해야 하는 작업을 결정할 수 있도록 일반 SObject 클래스와 함께 SObject 토큰 및 SObject 필드 토큰 을 많이 사용합니다.

 

예외(Exception)

코드의 정상적인 실행을 방해하는 코드에서 발생하는 오류입니다. 이것은 일반적으로 코드 조각이 할 수 없는 일을 하려고 할 때 발생합니다(예: 한 번도 설정되지 않은 계정 변수의 필드에 액세스). 많은 기본 제공 예외가 있지만 사용자 정의 예외를 작성하여 적절한 경우 사용자 정의 코드의 실행 흐름을 사용자 정의할 수 있습니다.

예외가 발생하고 처리되지 않으면 트랜잭션이 종료되고 롤백됩니다.

  • Apex의 예외
  • 예외 클래스 및 내장 예외

Future Method

"@future" 주석으로 주석이 달린 정적 메서드, 메서드를 호출한 트랜잭션이 완료된 후 메서드가 백그라운드에서 비동기적으로 실행되는 플래그입니다. 이는 외부 시스템에 대한 콜아웃 또는 혼합 DML 작업과 같이 비동기적으로 실행해야 하는 모든 작업을 실행하는 데 유용합니다. 미래의 메서드 매개변수는 SObject와 같은 복잡한 매개변수를 허용하지 않는 기본형이어야 합니다.

일반적으로 새로운 비동기식 메서드가 필요할 때 Queueable Apex는 미래 메서드의 진화이므로 향후 메서드보다 Queueable Apex를 선택해야 합니다. 그러나 조건부 비동기식 실행과 같은 일부 사용 사례는 여전히 미래의 방법을 선호합니다.

 

Helper Class

코드베이스 전반에 걸쳐 다양한 클래스 내에서 재사용될 일부 코드를 포함하는 클래스의 일반 이름입니다. 예를 들어 JSON 웹 토큰 생성을 지원하는 JwtHelper 클래스가 있을 수 있습니다.

코드를 자체 클래스로 마이그레이션하면 시스템의 유지 관리 가능성을 개선하는 데 도움이 됩니다. 이러한 클래스에 접미사 "도우미"가 있는 것이 일반적일 수 있지만 필수 사항은 아니며 재사용하려는 코드를 도우미 클래스, 모듈 또는 유틸리티 클래스라고 부를 수 있습니다.

Inheritance

클래스가 가상/추상 클래스를 확장할 때 이를 상속이라고 합니다. 이것은 한 클래스(하위 클래스)가 다른 클래스(상위 클래스)로부터 동작(메소드 및 잠재적으로 변수/속성의 형태로)을 상속할 수 있도록 합니다. 이것은 클래스 서명에 있는 "extents" 키워드를 사용하여 수행됩니다.

 

상속은 Apex의 핵심 개념이며 올바르게 수행되면 복잡한 코드베이스의 유지 관리 가능성을 높일 수 있습니다.

또한 표준 Apex 도구 세트 내에서 사용 중일 수도 있습니다. 예를 들어 Account SObject 클래스는 기본 SObject 클래스 에서 상속 되어 현재 존재하는 get() 및 put()과 같은 일반 메서드를 호출할 수 있는 기능을 Account 클래스에 부여합니다. SObject 클래스에서. 또한 List<SObject>와 같은 항목은 모두 기본 SObject에서 상속하므로 모든 유형의 SObject를 포함할 수 있으므로 모두 해당 인스턴스로 처리될 수 있습니다.

 

상호 작용

인터페이스는 클래스에 대한 템플릿을 정의하는 방법이며 구현해야 하는 메서드를 정의하지만 메서드 본문은 정의하지 않습니다. 인터페이스를 사용하려는 다른 클래스는 클래스 정의에서 인터페이스를 구현한다고 명시함으로써 그렇게 할 수 있습니다. 그러면 클래스가 인터페이스에 나열된 메서드를 정의하고 구현하도록 합니다. 클래스 확장(추상 및 가상 클래스 참조)과 달리 클래스는 필요한 만큼 인터페이스를 구현할 수 있습니다.

인터페이스의 일반적인 예는 Salesforce에서 제공하는 표준 Batchable, Schedulable 및 Queueable 인터페이스에서 찾을 수 있습니다.

 

JSON

JavaScript Object Notation – 쉽게 저장하거나 전송할 수 있는 문자열에 정보를 쓰는 표준화된 사람이 읽을 수 있는 방법입니다. Apex 내에서 이것은 일반적으로 외부 API와 통신하기 위한 형식으로 사용됩니다.

 

Properties

getter 및 setter를 포함하도록 수정된 정적 또는 인스턴스 변수입니다. 이들은 변수에 액세스하거나 변수를 설정할 때 실행되는 작은 코드 조각입니다. 이것은 변수의 지연 초기화에 유용할 수 있습니다. 이들은 또한 읽기 및 쓰기를 위한 다양한 액세스 수정자를 제공하는 데 사용할 수 있습니다(예: 개인 쓰기 변수).

Protected Method

접근 한정자를 "보호"하는 메서드(일반적인 공개/비공개와 반대). 이것은 한 가지 주요 예외를 제외하고는 비공개 메서드처럼 작동합니다. 보호된 메서드는 정의된 클래스를 확장하는 모든 클래스에서 액세스할 수 있습니다.

Queueable Class

단순성과 일괄 작업의 기능을 결합하여 미래 작업의 진화를 위해 설계된 비동기식 Apex 유형입니다. Queueable 클래스는 클래스를 정의하여(처리를 수행하는) 고급 비동기 처리를 활성화하는 구조를 제공한 다음, 이를 호출하고 필요한 경우 추적할 수 있도록 작업 ID를 가져옵니다.

Queueable Apex 는 작업을 대기열에 넣을 때 복잡한 개체(SObject 포함)를 매개변수로 사용할 수 있도록 함으로써 미래 메서드를 한 단계 더 발전시킵니다.

작업은 또한 다른 대기열에 있는 작업을 초기화할 수 있으므로 작업을 연결하여(하나가 완료될 때 시작) 순차적 처리를 허용합니다. 트랜잭션 종료자를 대기열에 추가할 수도 있으므로 대기열에 있는 작업이 완료되면 오류 처리와 같은 조치를 취할 수 있습니다.

 
 

Relational SOQL

쿼리된 개체에 대한 관련 개체를 참조하는 SOQL 쿼리입니다.

 
  • 하위 쿼리: 쿼리된 레코드와 함께 하위 레코드를 반환하는 SELECT 절에 추가된 하위 쿼리입니다. 이 유형의 쿼리는 복수 관계 이름을 사용합니다.
  • 상위 쿼리: 대상 개체가 조회하는 레코드를 대상으로 하는 SELECT 절에 포함된 필드입니다. 이것은 점 표기법을 통해 수행됩니다(예: Account.Name). 사용자 정의 개체의 경우 관계 필드에 __c 대신 __r이 접미사로 붙습니다.
 

Scheduled Class

다른 Apex 코드와 함께 대기열에 넣고 실행할 때의 cron 표현식을 제공하거나 UI를 통해 훨씬 덜 정밀하게 예약하여 특정 시간에 실행되도록 설정할 수 있는 클래스입니다. .

이러한 클래스에는 플랫폼이 예약된 시간에 메서드를 호출할 때 호출되는 실행 메서드가 있습니다. 이는 외부 시스템과 주기적으로 동기화하거나 배치 클래스가 야간 작업을 위해 대기해야 하는지 여부를 확인하는 데 유용할 수 있습니다.

 

Semi-Join

WHERE 절에 IN 절 내에서 사용되는 하위 쿼리가 포함된 테이블에 대한 SOQL 쿼리입니다. 다음은 이번 달에 마감된 기회가 있는 계정을 반환하는 예입니다.

Singleton

클래스의 단일 인스턴스만 한 번에 초기화할 수 있도록 하는 클래스에 대한 디자인 패턴입니다. 일반적으로 이 유형의 클래스에는 개인 생성자가 있습니다. 이 클래스의 인스턴스를 얻으려면 클래스의 이미 초기화된 인스턴스를 초기화하거나 반환하는 공용 정적 메서드를 호출합니다.

싱글톤은 특정 비용이 많이 드는 작업(예: 특정 비즈니스 단위에 대한 계정 ID 가져오기)을 수행해야 하거나 트랜잭션 전체에서 잠재적으로 반복해야 할 때 유용합니다. 싱글톤은 이러한 작업이 필요한 경우에만 수행되도록 하는 좋은 선택이 될 수 있습니다.

SOQL

Salesforce 데이터베이스와 상호 작용하는 데 사용되는 쿼리 언어입니다. SQL과 달리 SOQL은 데이터베이스 테이블에서 데이터를 읽는 데만 사용되며 레코드 쓰기에는 사용되지 않으며 대신 Apex 내에서 DML을 사용합니다.

Trigger

트리거는 데이터베이스 작업(예: 레코드 생성 또는 업데이트)에서 호출되는 Apex 코드 조각으로 사용자 지정 기능을 실행할 수 있습니다. 여기에는 계산 및 복잡한 유효성 검사에서 레코드 삭제 방지에 이르기까지 다양합니다.

트리거는 두 가지 유형으로 나뉩니다.

트리거 전: 레코드가 데이터베이스에 저장되고 일반적으로 동일한 레코드 계산 및 유효성 검사를 수행하는 데 사용되기 전에 실행합니다.

트리거 후: 레코드가 데이터베이스에 저장된 후 실행됩니다. 이후 트리거를 통과하는 레코드는 읽기 전용이므로 이러한 유형의 트리거는 일반적으로 Salesforce에서 설정한 필드가 필요할 때 사용됩니다(예: 생성 트리거의 레코드 ID). 호출할 트리거입니다.

 

Trigger Framework

트리거 프레임워크 는 Salesforce 내에서 트리거를 작성하는 표준화된 방법입니다 . 다양한 트리거 프레임워크와 접근 방식이 있지만, 모두 트리거에서 논리를 더 쉽게 유지 관리하고 테스트할 수 있는 별도의 클래스로 전환한다는 공통 목표를 공유합니다.

일반적으로 트리거 프레임워크는 가상 클래스, 인터페이스 또는 정적 트리거 핸들러 클래스를 사용하여 일반적이고 일관된 방식(실제 트리거가 실행될 때 위임됨)으로 비즈니스 로직을 쉽게 호출할 수 있습니다.

일부 트리거 프레임워크에는 호출되는 작업과 해당 호출 순서(예: EDA TDTM)를 제어할 수 있도록 구성을 허용하는 것과 같은 추가 기능이 제공되는 반면, 나머지는 완전히 코드로 작성될 수 있습니다.

 

Try/Catch

코드에서 throw된 예외를 처리하는 구문입니다. 이들은 2개 또는 3개의 코드 블록으로 구성됩니다.

  1. Try: 이 코드 블록은 위험한 코드가 실행되는 곳입니다.
  2. Catch: 매개변수가 있는 하나 이상의 코드 블록으로, 이 매개변수는 처리할 예외 유형입니다. 이 블록은 try 블록 내에서 예외가 발생하고 예외 유형이 catch의 매개변수와 일치하는 경우에만 호출됩니다. 이는 발생된 모든 예외를 처리하기 위한 일반 예외일 수 있습니다.
  3. Finally: try 또는 catch가 실행을 완료한 후 실행할 코드 블록입니다.
 

Upsert

삽입과 업데이트의 조합인 DML 문. 레코드 ID가 지정되면 이 작업은 업데이트처럼 작동합니다. 레코드 ID가 지정되지 않은 경우 이 작업은 삽입처럼 작동합니다. 이 작업은 추가 매개변수인 외부 Id 필드를 사용할 수도 있습니다. 이 필드는 지정된 경우 레코드를 업데이트하거나 삽입해야 하는지 여부를 결정하는 데 사용됩니다.

Virtual Class

"가상" 키워드로 정의된 클래스입니다. 이 유형의 클래스는 가상 클래스를 초기화할 수 있다는 점을 제외하면 추상 클래스와 매우 유사합니다. 가상 클래스를 사용하면 가상 메서드를 사용할 수 있습니다. 이 메서드는 virtual 키워드를 사용하여 가상 클래스를 확장하는 클래스가 선택적으로 가상 메서드의 동작을 재정의할 수 있다는 점을 제외하면 일반 메서드와 동일합니다. 클래스는 다른 클래스 하나만 확장할 수 있습니다.

Wrapper Class

고유한 방법을 요구하지 않고 이러한 정보 조각의 전송 또는 조작을 단순화하기 위해 서로 다른 정보 조각을 함께 그룹화해야 하는 경우에 대한 디자인 패턴 및 공통 용어입니다. 이는 일반적으로 Lightning 구성 요소 및 VisualForce 내에서 SObject 및 관련 정보(예: 형제 레코드 또는 계산된 값)를 그룹화하여 UI에서 사용하는 데 사용되며, 그렇지 않으면 래퍼 클래스 없이 수행하기 어렵습니다.

 

출처 : https://aboutw3.tistory.com/8473

'SFDC 개념' 카테고리의 다른 글

Visualforce - 기본4  (0) 2023.06.26
Visualforce - 기본3  (0) 2023.06.26
Visualforce - 기본2  (0) 2023.06.26
Visualforce - 기본1  (0) 2023.06.26
APEX - Trigger  (0) 2023.06.26

댓글