Salesforce에서 데이터를 조회하는 방법 중 하나가 SOQL(Salesforce Object Query Language) 입니다.
SQL과 유사하지만 Salesforce의 객체(Object)를 조회하는데 특화된 언어로, 데이터를 효과적으로 검색하고 조작할 수 있도록 설계되었습니다.
이번 글에서는 SOQL의 개념, 기본 문법, 활용 예제, Apex에서 SOQL을 실행하는 방법 등을 알아보겠습니다.
📌 SOQL이란?
SOQL(Salesforce Object Query Language) 은 Salesforce 데이터베이스에서 객체 데이터를 검색하는 데 사용됩니다.
SQL과 문법이 비슷하지만 SELECT * (모든 열 선택) 을 지원하지 않으며, 트랜잭션을 직접 조작할 수 없습니다.
✅ SOQL과 SQL의 차이점
비교 항목 | SOQL | SQL |
---|---|---|
사용 목적 | Salesforce 데이터 조회 | 관계형 데이터베이스 조회 |
SELECT * 지원 여부 | ❌ 지원하지 않음 | ✅ 지원 |
데이터 조작 가능 여부 | ❌ (조회 전용) | ✅ (INSERT, UPDATE, DELETE 가능) |
관계 조회 | 서브쿼리 사용 (SELECT Name, (SELECT LastName FROM Contacts) FROM Account) | JOIN 사용 (SELECT Account.Name, Contact.LastName FROM Account JOIN Contact ON Account.Id = Contact.AccountId) |
🔎 SOQL 기본 문법
✅ 기본 SELECT 문법
SELECT 필드명 FROM 객체명 WHERE 조건 ORDER BY 필드명 LIMIT 숫자
예제:
SELECT Name, Phone FROM Account WHERE BillingCity = 'San Francisco' ORDER BY Name LIMIT 5
📌 특징
- WHERE: 특정 조건으로 필터링
- ORDER BY: 정렬
- LIMIT: 반환할 데이터 개수 제한
📝 SOQL 활용 예제
1️⃣ 모든 계정(Account) 조회하기
먼저, 샘플 데이터를 추가한 후 조회해 보겠습니다.
데이터 삽입
Account acct = new Account(
Name='SFDC Computing',
Phone='(415)555-1212',
NumberOfEmployees=50,
BillingCity='San Francisco');
insert acct;
Contact con = new Contact(
FirstName='Carol',
LastName='Ruiz',
Phone='(415)555-1212',
Department='Wingo',
AccountId=acct.Id); // Contact와 Account 연결
insert con;
모든 계정 조회
SELECT Name, Phone FROM Account
2️⃣ WHERE 조건을 이용한 데이터 필터링
예제 1: 특정 조건을 만족하는 계정 조회
SELECT Name, Phone FROM Account
WHERE Name = 'SFDC Computing' AND NumberOfEmployees > 25
📌 조건이 여러 개일 경우 AND, OR를 사용하여 조합 가능
SELECT Name, Phone FROM Account
WHERE (Name = 'SFDC Computing' OR (NumberOfEmployees > 25 AND BillingCity = 'Los Angeles'))
3️⃣ LIMIT을 사용하여 반환되는 레코드 수 제한
예제: 1개의 레코드만 반환
Account oneAccountOnly = [SELECT Name, Phone FROM Account LIMIT 1];
LIMIT 4, 4 사용 예제 (5~8번째 데이터 조회)
SELECT Name, Phone FROM Account
ORDER BY Name LIMIT 4 OFFSET 4
4️⃣ Apex에서 SOQL 실행
SOQL을 Apex 코드 내에서 실행할 수도 있습니다.
예제: 특정 조건을 만족하는 계정 조회 후 디버그 출력
Account[] accts = [SELECT Name, Phone FROM Account
WHERE Name = 'SFDC Computing' AND NumberOfEmployees > 25
ORDER BY Name
LIMIT 10];
System.debug(accts.size() + ' account(s) returned.');
System.debug(accts);
📌 SOQL의 변수 바인딩
SOQL에서는 Apex 변수를 사용할 수 있으며, 이를 바인딩(Binding) 이라고 합니다.
String targetDepartment = 'Wingo';
Contact[] techContacts = [SELECT FirstName, LastName
FROM Contact WHERE Department = :targetDepartment];
System.debug(techContacts);
📌 콜론(:)을 사용하여 Apex 변수 값을 SOQL에서 사용할 수 있음
🔁 관계형 데이터 조회 (Parent-Child & Child-Parent)
1️⃣ 계정(Account)과 관련된 연락처(Contact) 조회
SELECT Name, (SELECT LastName FROM Contacts)
FROM Account WHERE Name = 'SFDC Computing'
2️⃣ 연락처(Contact)에서 관련된 계정(Account) 조회
Contact[] cts = [SELECT Account.Name FROM Contact
WHERE FirstName = 'Carol' AND LastName = 'Ruiz'];
Contact carol = cts[0];
String acctName = carol.Account.Name;
System.debug('Carol\'s account name is ' + acctName);
🔄 SOQL For Loops를 사용하여 대량 레코드 처리
Salesforce는 한 번의 SOQL 실행에서 최대 50,000개의 레코드 를 반환할 수 있습니다.
하지만 한 번에 너무 많은 데이터를 가져오면 Heap 크기 초과(OutOfMemory) 오류가 발생할 수 있습니다.
✅ 안전한 방법 (Batch Processing)
for (List<Contact> contacts : [SELECT Id FROM Contact]) {
System.debug(contacts);
System.debug('총 ' + contacts.size() + '개의 연락처 반환됨');
}
📌 예를 들어 220개의 연락처가 있다면
- 첫 번째 실행: 200개
- 두 번째 실행: 20개
이렇게 나눠서 실행됩니다.
🎯 마무리
✔ SOQL은 Salesforce에서 데이터를 조회하는 언어로 SQL과 유사하지만 차이점이 있음
✔ SELECT * 사용 불가 & 데이터 조작 불가 (조회 전용)
✔ Apex에서 실행할 때는 변수 바인딩을 사용하여 데이터 필터링 가능
✔ 관계형 데이터 조회 (Parent-Child & Child-Parent) 지원
✔ 대량 데이터를 처리할 때는 SOQL For Loops를 사용하여 Heap 크기 초과 방지
📌 SOQL을 적절히 활용하면 Salesforce 데이터를 효율적으로 조회하고 관리할 수 있습니다. 🚀
👉 더 많은 정보를 원한다면 Salesforce 공식 Trailhead 강의를 참고하세요!
🔗 Salesforce SOQL 학습하기