# 목차
-
Sobject 란?
-
Apex, Visualforce, Lightning Component
-
개발자 콘솔(Developer Console)
-
Generate & Analyze logs
-
SOQL & SOSL Query
-
DML Statement & Database Method
# SObject 란?
: Salesforce의 개체를 선언하는 생성자
: SObject와 Field는 "API 이름" 으로 호출
: SObject는 모든 개체를 상속 받을 수 있다. 즉, 다른 언어에서의 Object와 비슷하지만, 개체만을 위한 Object형 이라고 생각하면 쉽다.
ex)
SObject sobj = new Book__c(Name = '원피스 1권'); ( O )
SObject sobj = '문자열'; ( X )
List<SObject> sobjList = { new Book__c(Name = '원피스 1권'), new Member__c(Name = '홍길동') }; ( O )
형변환(Type Casting)
서로 다른 개체끼리는 형변환이 불가능하지만, SObject는 각각의 개체로 형변환이 가능하다.
ex)
// 서로 다른 개체끼리의 형변환은 불가능
Member__c member = new Book__c(Name = '원피스 1권'); ( ERROR )
Member__c member = (Member__c)book; ( ERROR )
// SObejct의 형변환은 가능
SObject sobj = new Member__c(Name = '홍길동'); ( O )
Member__c member = (Member__c)sobj; ( O )
String memName = ((Member__c)sobj).Name; ( O )
단, SObject에서는 점 표기법을 사용한 직접적인 필드 접근이 불가능하다.(SObject.Id만 접근 가능)
=> get(), set() 메서드를 통한 접근 또는 형변환 이후 접근 가능
ex)
SObject sobj = new Member__c(Name = '홍길동');
ID memId = sobj.Id; ( O )
String memName = sobj.Name; ( ERROR )
String memName = ((Member__c)sobj).Name; ( O )
# Apex, Visualforce, Lightning Component
1. Apex 란?
: 조직의 비즈니스 프로세스를 사용자 정의하는 데에 사용되는 Salesforce 자체 개발 언어
: Java를 토대로 만들어 졌으며, 조직의 데이터와 상호 작용하는 언어
: Lightning Platform API에 대한 호출, Lightning Platform 서버에서 Flow 및 Transaction 제어문을 실행할 수 있도록 유형화된 객체 지향 언어를 호출 할 수 있음
2. Visualforce 란?
: 모바일 및 데스크톱 앱의 사용자 인터페이스를 구축하기 위한 웹 개발 프레임워크
: 페이지 위주의 개발
3. Lightning Component
: 모바일 및 데스크톱 앱을 개발하기 위한 프레임워크
: 앱의 탭, 페이지, 레코드 페이지, 커뮤니티 페이지 등을 구성하는 옵션 결정 가능
※ Visualforce 와 Lightning Component의 차이
1) Visualforce는 페이지 중심
2) 레코드 저장 시, Visualforce 페이지는 서버와 상호작용을 하고, 사용자 인터페이스를 Reload
3) Lightning Component는 서버보다 단말(Device)에서 더 많은 작업을 한다.
참고) Lightning Experience Development - Lightning Experience 개발 가이드
# 개발자 콘솔(Developer Console)
: 앱 개발, 디버그 및 테스트를 할 수 있도록 Salesforce 브라우저 상에서 제공되는 통합 개발 환경(IDE)
현재 로그인 중인 하나의 조직에만 연결되는 브라우저 기반의 IDE이기 때문에,
복수의 조직에 연결하거나 파일 비교, 동기화, 버전 제어 및 관리 등을 하기 위해서는 Force.com IDE(ex. Eclipse, Visual Studio Code)를 사용
※ Eclipse의 경우, 2019년 10월 부터 지원이 중지되었기 때문에 요즘에는 주로 Visual Studio Code(이하 VSCode)를 많이 사용합니다.
VSCode 개발 환경 구축 방법
2020/07/25 - [Salesforce.com/SFDC Memo] - [SFDC] Visual Studio Code에서 Force.com 개발 환경 구축하기
☞ 개발자 콘솔 여는 방법
# Generate & Analyze Logs
: 대체적으로, Salesforce 개발 중에 발생하는 에러 등, 로그 확인 및 디버깅은 개발자 콘솔에서 이루어진다.
컴파일 에러가 발생했 을 경우, 에러 메시지를 포함한 dialog box 가 표시된다.
상세 내용은, [Logs]탭에 표시되는 로그를 더블 클릭 해서 상세 로그를 표시할 수 있다.
[Debug > View Log Panels]로 현재 표시중인 로그를 다양한 패널 뷰로 표시할 수 있다.
-
[Stack Tree] : 하향식 트리보기를 통해 객체의 계층 구조 및 실행 내의 로그 항목 표시
-
[Execution Stack] : 선택한 항목의 상향식 보기를 표시, 로그 항목을 표시
-
[Execution Log] : 코드를 실행하는 동안 발생한 모든 작업을 표시
-
[Source] : 소스 파일의 내용을 표시, 선택한 로그 항목이 생성될 때 실행되는 코드를 표시
-
[Source List] : 이벤트가 기록될 때 실행중인 코드의 컨텍스트를 표시
-
[Variables] : 선택한 로그 항목을 생성한 코드가 실행될 때 범위에 있었던 변수와 할당된 값을 표시
-
[Execution Overview] : 실행 시간 및 힙의 크기를 포함하여 실행 중인 코드의 통계를 표시
Apex 코드 내에서 CheckPoint(Break point)를 지정하여 특정 지점에서 일어나고 있는 상태를 볼 수 있다.
Checkpoint는 Apex Code 왼쪽의 코드 라인을 클릭해서 지정할 수 있다.
Checkpoint의 확인은 개발자 콘솔의 [Checkpoints] 탭에서 확인 가능합니다.
Apex 코드 내에서의 Debug log 표시하는 방법은 아래의 코드를 사용한다.
System.debug(msg);
또한, 개발자 코드의 로그에서 [Debug only]를 체크하면 Apex 코드 내에서 지정한 로그만을 표시하는 것이 가능하다.
# SOQL & SOSL Query
1. SOQL 이란?
: Salesforce Object Query Language의 약자
: SOQL을 사용하여 데이터베이스(개체)에 저장된 정보를 읽을 수 있음
: SQL(Structured Query Language)와 유사
ex)
// 이름이 홍길동인 회원의 개체ID와 회원명을 검색
SELECT Id, Name FROM Member__c WHERE Name = '홍길동'
[개발자 콘솔 - Query Editor]에서 Query 실행 방법
Apex 코드 내에서의 코드 실행 방법
// Apex 코드내에서의 SOQL Qeury 실행
// 대체적으로 List<>형식으로 습득
List<Member__c> memberList = [SELECT Id, Name FROM Member__c WHERE Name = '홍길동'];
// 특정키를 통해 단일 개체로도 습득 가능
Member__c member1 = [SELECT Id, Name FROM Member__c WHERE Id = '[대상의 개체Id]'];
// WHERE구 등에서 변수를 사용하는 방법
// 변수의 앞에 "콜론(:)"을 붙여서 변수임을 알림
ID memberId = memberList.get(0).Id;
Member__c member2 = [SELECT Id, Name FROM Member__c WHERE Id = :memberId];
2. SOSL 이란?
: Salesforce Object Search Language의 약자
: 레코드에서 텍스트 검색을 수행하는 언어
: SOQL과 달리, 여러 유형의 개체를 동시에 쿼리할 수 있음
: SOQL은 정확한 구문을 필요로 하지만, SOSL은 단어 일치를 사용하여 필드를 검색할 수 있음.
ex) 회원명이 "꼬비" 인 회원 레코드와, "꼬비"회원이 대여중인 도서의 개체ID, 도서명 검색
FIND {꼬비} IN ALL FIELDS RETURNING Book__c(Id, Name), Member__c(Id, Name)
[개발자 콘솔 - Query Editor]에서 Query 실행 방법
Apex 코드 내에서의 코드 실행 방법
// SOSL 검색
List<List<SObject>> soqlResultList = [FIND '꼬비' IN ALL FIELDS RETURNING Book__c(Id, Name), Member__c(Id, Name)];
// SOSL 검색 결과로 부터 각 개체 정보 습득
List<Book__c> bookList = soqlResultList.get(0);
List<Member__c> memberList = soqlResultList.get(1);
// 각 검색 결과 확인
System.debug('도서명 : ' + bookList.get(0).Name);
System.debug('회원명 : ' + memberList.get(0).Name);
# DML Statement & Database Method
1. DML Statement
: 단일 개체 또는 개체 리스트를 허용
: Salesforce에는 INSERT, UPDATE, DELETE, UPSERT(특수DML) 이 존재
※ UPSERT : INSERT와 UPDATE가 합쳐진 DML로, 지정된 필드를 사용해 기존 개체의 존재 여부를 결정하거나 필드가 지정되지 않은 경우, ID를 통해 개체 레코드를 INSERT 또는 UPDATE한다.
(기존 레코드가 없는 경우 => INSERT, 기존 레코드가 존재하는 경우 => UPDATE)
// 단일 레코드 INSERT
Member__c insMember = new Member__c(Name = '홍길동');
insert insMember;
// 다수 레코드 INSERT
List<Member__c> insMemberList = new List<Member__c>();
insMemberList.add(new Member__c(Name = '홍길동1'));
insMemberList.add(new Member__c(Name = '홍길동2'));
insMemberList.add(new Member__c(Name = '홍길동3'));
insert insMemberList;
// 단일 레코드 UPDATE
Member__c updMember = new Member__c(Id = insMember.Id, Name='고길동');
update updMember;
// 다수 레코드 UPDATE
List<Member__c> updMemberList = new List<Member__c>();
updMemberList.add(new Member__c(Id = insMemberList.get(0).Id, Name = '고길동1'));
updMemberList.add(new Member__c(Id = insMemberList.get(1).Id, Name = '고길동2'));
updMemberList.add(new Member__c(Id = insMemberList.get(2).Id, Name = '고길동3'));
update updMemberList;
// 단일 레코드 DELETE
delete insMember;
// 다수 레코드 DELETE
delete insMemberList;
// 단일 레코드 UPSERT
Member__c upsMemberIns = new Member__c(Name = '고길동');
Member__c upsMemberUpd = new Member__c(Id = insMember.Id, Name='고길동');
upsert upsMemberIns; // UPSERT에 의한 INSERT
upsert upsMemberUpd; // UPDATE에 의한 UPDATE
// 다수 레코드 UPSERT
List<Member__c> upsMemberList = new List<Member__c>();
upsMemberList.add(new Member__c(Name = '고길동'));
upsMemberList.add(new Member__c(Id = insMember.Id, Name = '고길동'));
upsert upsMemberList; // 첫번째 요소는 INSERT, 두번째 요소는 UPDATE
2. Database Method
: 정적 메소드(static)이므로 클래스명 및 메소드 명(Database.[메소드명])으로 호출(Salesforce의 표준 라이브러리)
: DML작업을 부분적으로 성공시킬지에 대한 여부 설정 가능(allOrNone : Boolean)
-
[allOrNone = true]인 경우(Default), 전체 성공을 기준으로 함
-
[allOrNone = false]인 경우, 성공한 레코드는 데이터베이스에 commit, 실패한 레코드만 에러가 반환(예외 발생 X)
: Database Method는 DML처리 결과(성공 여부)를 배열로 반환해 준다.
// param1) INSERT할 개체 리스트(또는 단일 개체)
// param2) allOrNone
Database.SaveResult[] results = Database.insert([INSERT 개체리스트], false);
ex)
List<Member__c> insMemList = new List<Member__c>();
insMemList.add(new Member__c(Name = '홍길동'));
insMemList.add(new Member__c(Name = '고길동'));
// 회원 리스트 INSERT
Database.SaveResult[] srList = Database.insert(insMemList, false);
// DML처리 결과 확인
for (Database.SaveResult sr : srList) {
// INSERT 성공여부 체크(isSuccess())
if (sr.isSuccess()) {
// INSERT 성공
System.debug('INSERT 성공 회원의 개체ID : ' + sr.getId());
} else {
// INSERT 실패
for (Database.Error err : sr.getErrors()) {
// ERROR메시지 표시
System.debug(err.getStatusCode() + ' : ' + err.getMessage());
System.debug('실패 레코드 정보 : ' + err.getFields());
}
}
}
DML Statement 와 Database Method 사용
: DML Statement는 예외처리(try-catch)를 통해 즉시 DmlException을 발생, 중단시키는 경우에 사용
: Database Method는 DmlException을 무시하는 경우, 즉, DML 처리 결과에 상관없이, 일단 전부 실행한 뒤, 실패한 요소에 대해서만 따로 처리하는 경우
(물론, Database Method에서도 Exception을 발생 시킬 수 있다.)
참고1) https://developer-cj.tistory.com/ - 어느 Salesforce Developer의 개발 성장기
참고2) https://trailhead.salesforce.com/ - Salesforce Trailhead
'Salesforce.com > SFDC Memo' 카테고리의 다른 글
[SFDC] Salesforce Governor Limits (0) | 2020.08.12 |
---|---|
[SFDC] Visual Studio Code에서 Force.com 개발 환경 구축하기 (0) | 2020.07.25 |