# 목차

  • 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 지정

 

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

+ Recent posts