SOQL 쿼리 완벽 정리: Apex에서 Salesforce 데이터 조회하는 방법

Salesforce에서 데이터를 조회하는 방법 중 하나가 SOQL(Salesforce Object Query Language) 입니다.
SQL과 유사하지만 Salesforce의 객체(Object)를 조회하는데 특화된 언어로, 데이터를 효과적으로 검색하고 조작할 수 있도록 설계되었습니다.

이번 글에서는 SOQL의 개념, 기본 문법, 활용 예제, Apex에서 SOQL을 실행하는 방법 등을 알아보겠습니다.


📌 SOQL이란?

SOQL(Salesforce Object Query Language) 은 Salesforce 데이터베이스에서 객체 데이터를 검색하는 데 사용됩니다.
SQL과 문법이 비슷하지만 SELECT * (모든 열 선택) 을 지원하지 않으며, 트랜잭션을 직접 조작할 수 없습니다.

✅ SOQL과 SQL의 차이점

비교 항목SOQLSQL
사용 목적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 학습하기