https://trailhead.salesforce.com/ko/content/learn/modules/apex_integration_services
Apex Integration Services
Learn how to integrate with external applications using Apex REST and SOAP services to elevate your app development.
trailhead.salesforce.com
노션 정리 가져오기
1) Apex Integration Overview
학습 목표
- 웹 서비스와 HTTP 콜아웃의 차이점을 설명할 수 있습니다.
- 원격 사이트 설정으로 외부 사이트에 권한을 부여합니다.
(1) Apex에서 외부 서비스에 대한 콜아웃 만들기
에이펙스 콜아웃을 사용하면 에이펙스 코드를 외부 서비스와 긴밀하게 통합할 수 있습니다. 콜아웃은 외부 웹 서비스를 호출하거나 Apex 코드에서 HTTP 요청을 보낸 다음 응답을 수신합니다.
Apex 콜아웃은 두 가지 유형으로 제공됩니다.
- SOAP 웹 서비스에 대한 웹 서비스 콜아웃은 XML을 사용하며, 일반적으로 코드 생성을 위해 헬퍼 문서인 WSDL 문서가 필요합니다.
- 서비스에 대한 HTTP 콜아웃은 일반적으로 JSON과 함께 REST를 사용합니다. 빠르고 간단합니다.
이 두 가지 유형의 콜아웃은 서비스에 요청을 보내고 응답을 받는다는 점에서 비슷합니다.
WSDL 기반 콜아웃은 SOAP 웹 서비스에 적용되는 반면, HTTP 콜아웃은 SOAP 또는 REST 등 모든 HTTP 서비스에서 사용할 수 있습니다.
가능하면 HTTP 서비스를 사용하세요. 이러한 서비스는 일반적으로 상호 작용하기 쉽고, 코드가 훨씬 적게 필요하며, 읽기 쉬운 JSON을 활용합니다.
레거시 애플리케이션과 통합할 때나 공식적인 교환 형식 또는 상태 저장 작업이 필요한 트랜잭션에 주로 SOAP를 사용하게 될 것입니다. 이 모듈에서는 SOAP에 대해 다루겠지만 대부분의 시간을 REST에 할애할 것입니다.
(다른 곳 참고)
SOAP 기반 통합의 경우, Apex를 사용하면 개발자가 WSDL 파일에서 클래스를 생성하여 간단한 객체 액세스 프로토콜에 따라 웹 서비스와 상호 작용할 수 있는 구조화된 접근 방식을 제공할 수 있습니다. _(XML 기반 메시징 프로토콜)
반면, REST 원칙을 준수하는 HTTP 서비스의 경우, 개발자는 Apex를 사용하여 웹 서비스 엔드포인트와 통신하기 위해 GET, POST, PUT, DELETE와 같은 표준 메서드를 활용하여 HTTP 요청을 할 수 있습니다. _ (아키텍처 원칙(표준 메소드 사용))
** 사이트꺼 정리하기 _ https://stories.salesforcecodex.com/2022/09/salesforce/difference-between-soap-and-rest-api/
(2) Authorize Endpoint Addresses 엔드포인트 주소 인증
https://th-apex-http-callout.herokuapp.com
https://th-apex-soap-service.herokuapp.com
다음 단계에 따라 이 두 엔드포인트 URL을 모두 승인하세요.
💡 설정에서 원격 사이트 (Remote Site) 추가하기
- 설정에서 빠른 찾기 상자에 Remote Site Settings 을 입력한 다음 원격 사이트 설정을 클릭합니다.
- Click New Remote Site.
- 원격 사이트 이름에 animals_http를 입력합니다.
- 원격 사이트 URL에 https://th-apex-http-callout.herokuapp.com 을 입력합니다.

- Add a Remote Site
- Name: animals_http
- Remote site URL: https://th-apex-http-callout.herokuapp.com
- Description: Trailhead animal service: HTTP
- Add a Remote Site
- Name: animals_soap
- Remote site URL: https://th-apex-soap-service.herokuapp.com
- Description: Trailhead animal service: SOAP
2) Apex REST Callouts
콜아웃을 수행하여 외부 서비스에서 데이터를 수신합니다.
콜아웃을 수행하여 외부 서비스로 데이터를 전송합니다.
모의 콜아웃을 사용하여 콜아웃을 테스트합니다. - Test callouts by using mock callouts.
(1) HTTP and Callout Basics
REST 콜아웃은 HTTP를 기반으로 합니다.
각 콜아웃 요청은 HTTP 메서드 및 엔드포인트와 연결됩니다. HTTP 메서드는 원하는 작업 유형을 나타냅니다.

- 가장 간단한 요청은 GET 요청입니다(GET은 HTTP 메서드)
- GET 요청은 발신자가 서버로부터 리소스에 대한 정보를 얻고자 함을 의미합니다.
- 서버는 이 요청을 수신하고 처리한 후 수신자에게 요청 정보를 반환합니다.
- GET 요청은 브라우저에서 주소로 이동하는 것과 비슷합니다.
- 웹 페이지를 방문하면 브라우저는 백그라운드에서 GET 요청을 수행합니다.
- 브라우저에서는 탐색의 결과로 새 HTML 페이지가 표시됩니다. 콜아웃을 사용하면 결과는 응답 객체입니다.
GET 요청이 어떻게 작동하는지 설명하려면 브라우저를 열고 다음 URI https://th-apex-http-callout.herokuapp.com/animals. 로 이동합니다. 서비스가 JSON이라는 형식으로 응답을 반환하기 때문에 브라우저에 이상한 형식의 동물 목록이 표시됩니다. 간혹 GET 응답의 형식이 XML로 되어 있는 경우도 있습니다.
다음은 일반적인 HTTP 메서드에 대한 설명입니다.
| HTTP Method | Description |
| GET | URL로 식별된 데이터를 검색합니다. |
| POST | 리소스를 만들거나 서버에 데이터를 게시합니다 |
| DELETE | URL로 식별되는 리소스를 삭제합니다. |
| PUT | 요청 본문으로 전송된 리소스를 생성하거나 교체합니다. |
각 요청은 HTTP 메서드 외에도 서비스가 위치한 엔드포인트 주소인 URI를 설정합니다.
예를 들어 엔드포인트는 http://www.example.com/api/resource 일 수 있습니다.
"HTTP 및 콜아웃 기본 사항" 단원의 예제에서 엔드포인트는 https://th-apex-http-callout.herokuapp.com/animals 입니다.
서버가 요청을 처리하면 응답에 상태 코드를 보냅니다. 상태 코드는 요청이 성공적으로 처리되었는지 또는 오류가 발생했는지 여부를 나타냅니다. 요청이 성공하면 서버는 상태 코드 200을 보냅니다. 파일을 찾을 수 없는 경우 404, 내부 서버 오류의 경우 500과 같은 다른 상태 코드를 보셨을 것입니다.
엔드포인트와 HTTP 메서드 외에도 요청에 대한 다른 속성을 설정할 수 있습니다. 예를 들어 요청에는 콘텐츠 유형 등 요청에 대한 자세한 정보를 제공하는 헤더가 포함될 수 있습니다. 요청에는 POST 요청과 같이 서비스로 전송할 데이터도 포함될 수 있습니다. 이후 단계에서 POST 요청의 예를 볼 수 있습니다. POST 요청은 웹 페이지에서 버튼을 클릭하여 양식 데이터를 제출하는 것과 유사합니다. 콜아웃을 사용하면 웹 페이지에 데이터를 수동으로 입력하는 대신 요청 본문의 일부로 데이터를 전송합니다.
(3) Get Data from a Service _서비스에서 데이터 가져오기
이 예에서는 숲 속 생물 목록을 가져오기 위해 웹 서비스에 GET 요청을 보냅니다. 서비스는 JSON 형식으로 응답을 보냅니다. JSON은 기본적으로 문자열이므로 기본 제공 JSONParser 클래스가 이를 객체로 변환합니다. 그런 다음 이 객체를 사용하여 각 동물의 이름을 디버그 로그에 기록할 수 있습니다.
이 단원의 예제를 실행하기 전에 엔드포인트 주소 인증하기 섹션의 단계에 따라 콜아웃의 엔드포인트 URL(https://th-apex-http-callout.herokuapp.com)을 인증해야 합니다. (이전 실습 단계)
Http http = new Http();
HttpRequest request = new HttpRequest();
request.setEndpoint('https://th-apex-http-callout.herokuapp.com/animals');
request.setMethod('GET');
HttpResponse response = http.send(request);
// 요청이 성공하면 JSON 응답을 파싱
if(response.getStatusCode() == 200) {
// JSON 문자열을 원시 데이터 유형의 컬렉션으로 역직렬화
Map<String, Object> results = (Map<String, Object>) JSON.deserializeUntyped(response.getBody());
// 'animals' 키의 값을 목록으로 캐스팅
List<Object> animals = (List<Object>) results.get('animals');
System.debug('Received the following animals:');
for(Object animal: animals) {
System.debug(animal);
}
}


(4) Send Data to a Service _데이터 보내기
HTTP 콜아웃의 또 다른 일반적인 사용 사례는 서비스에 데이터를 전송하는 것입니다. 예를 들어 동영상에서 댓글을 달면 브라우저는 데이터를 제출하기 위해 POST 요청을 합니다.
이 예에서는 동물 이름을 추가하기 위해 웹 서비스에 POST 요청을 보냅니다. 새 이름이 요청 본문에 JSON 문자열로 추가됩니다. 요청 Content-Type 헤더는 서비스가 데이터를 적절히 처리할 수 있도록 전송된 데이터가 JSON 형식임을 알리기 위해 설정됩니다. 서비스는 추가한 동물을 포함한 모든 동물의 상태 코드와 목록을 전송하여 응답합니다.
요청이 성공적으로 처리된 경우 리소스가 생성되었으므로 상태 코드는 201을 반환합니다. 201 이외의 응답이 반환되면 디버그 로그에 응답이 전송됩니다.
Http http = new Http();
HttpRequest request = new HttpRequest();
request.setEndpoint('https://th-apex-http-callout.herokuapp.com/animals');
request.setMethod('POST');
request.setHeader('Content-Type', 'application/json;charset=UTF-8');
// Set the body as a JSON object
request.setBody('{"name":"mighty moose"}');
HttpResponse response = http.send(request);
// Parse the JSON response
// 성공적으로 처리된 경우 리소스가 생성되었으므로 상태 코드 201 반환
if(response.getStatusCode() != 201) {
System.debug('The status code returned was not expected: ' + response.getStatusCode() + ' ' + response.getStatus());
} else {
System.debug(response.getBody());
}

(5) 콜아웃 테스트
- Apex 테스트 메서드가 콜아웃을 지원하지 않으며 콜아웃을 수행하는 테스트가 실패한다는 것입니다.
- 테스트 런타임에서 콜아웃을 '모의'할 수 있다는 것
- 모의 콜아웃을 사용하면 실제로 웹 서비스를 호출하는 대신 테스트에서 반환할 응답을 지정할 수 있습니다. 런타임에 테스트에서 모의 콜아웃을 사용하면 적절한 코드 커버리지를 확보하고 콜아웃으로 인해 건너뛰는 코드 줄이 없는지 확인하는 데 도움이 됩니다.
이 예제는 요청이 메서드와 반환값으로 구성되도록 약간 수정되었지만 본질적으로는 이전 예제와 동일합니다.
(6) StaticResourceCalloutMock으로 콜아웃 테스트하기
- 콜아웃을 테스트하려면 인터페이스를 구현하거나 정적 리소스를 사용하여 모의 콜아웃을 사용하세요.
- 모의 콜아웃을 사용할 때 요청은 엔드포인트로 전송되지 않습니다.
- 대신 Apex 런타임은 정적 리소스에 지정된 응답을 조회하여 대신 반환하는 것을 알고 있습니다.
- Test.setMock 메서드는 테스트 메서드에서 모의 콜아웃이 사용되었음을 런타임에 알립니다.
- 모의 콜아웃이 실제로 작동하는 모습을 살펴봅시다. 먼저 GET 요청에 사용할 JSON 형식의 문자열이 포함된 정적 리소스를 만듭니다.
💡 Static Resource 만들기
- In the Developer Console, select File | New | Static Resource.
- For the name, enter GetAnimalResource.
- For the MIME type, select text/plain, even though we are using JSON.
- Click Submit.
- In the tab that opens for the resource, insert the following content. Make sure that it is all on one line and doesn’t break to the next line. This content is what the mock callout returns. It’s an array of three woodland creatures.{"animals": ["pesky porcupine", "hungry hippo", "squeaky squirrel"]}
- Press CTRL+S to save.

정적 리소스를 만들었습니다. 이제 이 리소스를 사용하는 콜아웃에 대한 테스트를 추가해 보겠습니다.
(7) HttpCalloutMock으로 콜아웃 테스트하기
- POST 콜아웃을 테스트하기 위해 당사는 HttpCalloutMock 인터페이스의 구현을 제공합니다.
- 이 인터페이스를 사용하면 respond 메서드에서 전송되는 응답을 지정할 수 있습니다.
- 테스트 클래스는 Test.setMock 을 다시 호출하여 이 가짜 응답을 보내도록 Apex 런타임에 지시합니다. 첫 번째 인수로 HttpCalloutMock.class를 전달합니다. 두 번째 인자로는 HttpCalloutMock의 인터페이스 구현인 AnimalsHttpCalloutMock의 새 인스턴스를 전달합니다. (이 예제 이후 예제에서는 AnimalsHttpCalloutMock을 작성하겠습니다.)
- 이제 콜아웃을 가로채기 위해 HttpCalloutMock 인터페이스를 구현하는 클래스를 추가합니다. 테스트 컨텍스트에서 HTTP 콜아웃이 호출되면 콜아웃이 이루어지지 않습니다. 대신 AnimalsHttpCalloutMock의 응답 메서드 구현에서 지정한 모의 응답을 받습니다.
AnimalsHttpCalloutMock 생성
@isTest
global class AnimalsHttpCalloutMock implements HttpCalloutMock {
// Implement this interface method
global HTTPResponse respond(HTTPRequest request) {
// Create a fake response
HttpResponse response = new HttpResponse();
response.setHeader('Content-Type', 'application/json');
response.setBody('{"animals": ["majestic badger", "fluffy bunny", "scary bear", "chicken", "mighty moose"]}');
response.setStatusCode(200);
return response;
}
}
테스트 클래스에서 다음 예시와 같이 모의 콜아웃을 설정하는 testPostCallout 메서드를 만듭니다. testPostCallout 메서드는 Test.setMock을 호출한 다음 AnimalsCallouts 클래스에서 makePostCallout 메서드를 호출합니다. 그런 다음 반환되는 응답이 모의 구현의 응답 메서드에서 지정한 것과 일치하는지 확인합니다.
AnimalsCalloutsTest 에 testPostCallout() 메서드 추가하기
@isTest
static void testPostCallout() {
// Set mock callout class
Test.setMock(HttpCalloutMock.class, new AnimalsHttpCalloutMock());
// This causes a fake response to be sent
// from the class that implements HttpCalloutMock.
HttpResponse response = AnimalsCallouts.makePostCallout();
// Verify that the response received contains fake values
String contentType = response.getHeader('Content-Type');
Assert.isTrue(contentType == 'application/json');
String actualValue = response.getBody();
System.debug(response.getBody());
String expectedValue = '{"animals": ["majestic badger", "fluffy bunny", "scary bear", "chicken", "mighty moose"]}';
Assert.areEqual(expectedValue, actualValue);
Assert.areEqual(200, response.getStatusCode());
}

메서드에서 콜아웃을 만들 때
- 메서드는 후속 코드 줄을 실행하기 전에 외부 서비스가 콜아웃 응답을 다시 보낼 때까지 기다립니다. 또는 @future(callout=true)로 주석이 달린 비동기 메서드에 콜아웃 코드를 배치하거나 큐 가능한 Apex를 사용할 수 있습니다. 이렇게 하면 콜아웃이 별도의 스레드에서 실행되고 호출 메서드의 실행이 차단되지 않습니다.
트리거에서 콜아웃을 만들 때
- 콜아웃은 응답을 기다리는 동안 트리거 프로세스를 차단하지 않아야 합니다. 트리거가 콜아웃을 만들 수 있으려면 콜아웃 코드가 포함된 메서드에 @future(callout=true) 주석을 추가하여 별도의 스레드에서 실행되도록 해야 합니다.

3) Apex SOAP Callouts
학습 목표
WSDL2Apex를 사용하여 Apex 클래스를 생성합니다.
SOAP을 사용하여 외부 서비스로 데이터를 전송하는 콜아웃을 수행합니다.
모의 콜아웃을 사용하여 콜아웃을 테스트합니다.
(1) WSDL2Apex를 사용하여 에이펙스 코드 생성하기
- REST 콜아웃 외에도 Apex는 XML을 사용하여 SOAP 웹 서비스에 대한 콜아웃을 만들 수도 있습니다.
- SOAP로 작업하는 것은 고통스럽지만 꼭 필요한 경험일 수 있습니다. 다행히도 프로세스를 더 쉽게 만들어주는 도구가 있습니다.
- WSDL2Apex는 WSDL 문서에서 Apex 클래스를 자동으로 생성합니다.
- 웹 서비스의 WSDL 파일을 다운로드한 다음 WSDL을 업로드하면 WSDL2Apex가 Apex 클래스를 생성합니다.
- Apex 클래스는 SOAP XML을 구성하고, 데이터를 전송하고, 응답 XML을 Apex 객체로 구문 분석합니다.
- 웹 서비스 메시지의 XML을 구성하고 구문 분석하는 로직을 개발하는 대신, WSDL2Apex에서 생성된 Apex 클래스가 내부적으로 모든 오버헤드를 처리하도록 하세요.
- WSDL2Java에 익숙하거나 .NET에서 WSDL을 웹 참조로 가져오는데 익숙한 경우 이 기능은 WSDL2Apex와 유사합니다.
이 예에서는 간단한 계산기 웹 서비스를 사용하여 두 개의 숫자를 더합니다.
가장 먼저 해야 할 일은 Apex 클래스를 생성하기 위해 WSDL 파일을 다운로드하는 것입니다.
이 링크를 클릭하고 계산기.wsdl 파일을 컴퓨터에 다운로드합니다. 다음 단계에서 이 파일이 필요하므로 이 파일을 어디에 저장했는지 기억하세요.
WSDL에서 Apex 클래스 생성하기


- 생성된 Apex 클래스에는 WSDL 문서로 표현되는 타사 웹 서비스를 호출하기 위한 스텁 및 유형 클래스가 포함됩니다.
- 이러한 클래스를 사용하면 Apex에서 외부 웹 서비스를 호출할 수 있습니다.
- 생성된 각 클래스에 대해 동일한 이름과 접두사 Async를 붙인 두 번째 클래스가 생성됩니다.
- calculatorServices 클래스는 동기식 콜아웃을 위한 클래스입니다.
- AsyncCalculatorServices 클래스는 비동기 콜아웃용입니다.
콜아웃 실행하기
이제 콜아웃을 실행하여 두 개의 숫자가 올바르게 추가되는지 확인할 수 있습니다. 계산기를 준비하여 결과를 확인하세요.
Debug | Open Execute Anonymous Window. 테스트 실행
calculatorServices.CalculatorImplPort calculator = new calculatorServices.CalculatorImplPort();
Double x = 1.0;
Double y = 2.0;
Double result = calculator.doAdd(x,y);
System.debug(result);

(2) 웹 서비스 콜아웃 테스트
- Apex 코드를 배포하거나 패키징하려면 해당 코드의 75% 이상에 테스트 커버리지가 있어야 한다는 사실을 알고 있습니다. 이 커버리지에는 WSDL2Apex에서 생성된 클래스가 포함됩니다.
- 이전에도 언급했지만, 테스트 메서드는 웹 서비스 콜아웃을 지원하지 않으며, 웹 서비스 콜아웃을 수행하는 테스트는 실패합니다.
그래서 우리가 해야 할 일이 조금 있습니다. 테스트 실패를 방지하고 코드 커버리지를 늘리기 위해 Apex는 내장된 WebServiceMock 인터페이스와 Test.setMock 메서드를 제공합니다. 이 인터페이스를 사용하여 테스트 메서드에서 가짜 응답을 수신하여 필요한 테스트 커버리지를 제공할 수 있습니다.
콜아웃에 대한 모의 응답 지정
- WSDL에서 Apex 클래스를 만들면 자동 생성된 클래스의 메서드는 외부 서비스에 대한 콜아웃을 수행하는 WebServiceCallout.invoke를 호출합니다.
- 이러한 메서드를 테스트할 때 WebServiceCallout.invoke가 호출될 때마다 가짜 응답을 생성하도록 Apex 런타임에 지시할 수 있습니다. 이렇게 하려면 WebServiceMock 인터페이스를 구현하고 테스트 런타임이 전송할 가짜 응답을 지정하세요.
테스트 메서드에서 Test.setMock을 호출하여 Apex 런타임이 이 가짜 응답을 보내도록 지시합니다.
▼ 첫 번째 인수로 WebServiceMock.class를 전달합니다. 두 번째 인자로 WebServiceMock 인터페이스 구현의 새 인스턴스를 전달합니다.
Test.setMock(WebServiceMock.class, new MyWebServiceMockImpl());
AwesomeCalculatorTest.apex 부분에서 Test.setMock 호출 부분
public class AwesomeCalculator {
public static Double add(Double x, Double y) {
calculatorServices.CalculatorImplPort calculator = new calculatorServices.CalculatorImplPort();
return calculator.doAdd(x,y);
}
}
이 예제에서는 콜아웃을 만드는 클래스, 테스트를 위한 모의 구현, 테스트 클래스 자체를 만듭니다.
@isTest
global class CalculatorCalloutMock implements WebServiceMock {
global void doInvoke(
Object stub,
Object request,
Map<String, Object> response,
String endpoint,
String soapAction,
String requestName,
String responseNS,
String responseName,
String responseType) {
// start - specify the response you want to send
calculatorServices.doAddResponse response_x =
new calculatorServices.doAddResponse();
response_x.return_x = 3.0;
// end
response.put('response_x', response_x);
}
}
모의 구현을 만들어 테스트하는 동안 콜아웃을 가짜로 만듭니다. WebServiceMock의 구현은 테스트를 위해 지정한 응답을 반환하는 doInvoke 메서드를 호출합니다. 이 코드의 대부분은 상용구이며, 웹 서비스가 값을 위조할 수 있도록 응답을 반환하는 방법을 파악하는 것이 가장 어려운 부분이다.
@isTest
private class AwesomeCalculatorTest {
@isTest static void testCallout() {
// This causes a fake response to be generated
Test.setMock(WebServiceMock.class, new CalculatorCalloutMock());
// Call the method that invokes a callout
Double x = 1.0;
Double y = 2.0;
Double result = AwesomeCalculator.add(x, y);
// Verify that a fake result is returned
Assert.areEqual(3.0, result);
}
}
마지막으로, 테스트 메서드는 AwesomeCalculator 클래스에서 호출을 하기 전에 Test.setMock을 호출하여 가짜 응답을 보내도록 Apex 런타임에 지시해야 합니다. 다른 테스트 메서드와 마찬가지로 모의 응답에서 올바른 결과가 수신되었다고 주장합니다.
위 테스트 실행 시

이제 AwesomeCalculator 클래스에 코드 커버리지가 100% 표시되어야 합니다!
4) Apex Web Services
두 가지 유형의 Apex 웹 서비스에 대해 설명하고 이러한 서비스에 대한 개괄적인 개요를 제공합니다.
- 각 HTTP 메서드에 대한 메서드가 포함된 Apex REST 클래스를 생성합니다.
- 엔드포인트를 사용하여 사용자 지정 Apex REST 메서드를 호출합니다.
- JSON 형식의 요청 본문을 전송하여 사용자 지정 Apex REST 메서드에 데이터를 전달합니다.
- Apex REST 메서드에 대한 테스트 메서드를 작성하고 테스트 REST 요청에서 속성을 설정합니다.
- 매개 변수 값을 사용하여 메서드를 호출하여 Apex REST 메서드에 대한 테스트 메서드를 작성합니다.
(1) Apex 클래스를 웹 서비스로 노출하기
Apex 클래스 메서드를 REST 또는 SOAP 웹 서비스 작업으로 노출할 수 있습니다. 웹을 통해 메서드를 호출할 수 있도록 함으로써 외부 애플리케이션을 Salesforce와 통합할 수 있습니다.
예를 들어, 회사의 콜센터에서 내부 애플리케이션을 사용하여 온프레미스 리소스를 관리한다고 가정했을 때, 고객 지원 담당자는 동일한 애플리케이션을 사용하여 Salesforce에서 사례 기록을 관리하는 등 일상적인 업무를 수행해야 합니다. 상담원은 하나의 인터페이스를 사용하여 사례 기록을 보고 업데이트하고 내부 리소스에 액세스할 수 있습니다. 애플리케이션은 Apex 웹 서비스 클래스를 호출하여 Salesforce 사례 기록을 관리합니다.
클래스를 REST 서비스로 노출
- 클래스를 전역으로 정의하고 메서드를 전역 정적으로 정의합니다.
@RestResource(urlMapping='/Account/*')
global with sharing class MyRestResource {
@HttpGet
global static Account getRecord() {
// Add your code
}
}
- 클래스와 메서드에 어노테이션을 추가합니다. 예를 들어, 이 샘플 Apex REST 클래스는 하나의 메서드를 사용합니다. getRecord 메서드는 사용자 지정 REST API 호출입니다. 이 메서드는 @HttpGet 으로 어노테이션되며 GET 요청에 대해 호출됩니다.
- 보시다시피, 클래스에는 @RestResource(urlMapping='/Account/*')로 주석이 추가되어 있습니다.
- Apex REST의 기본 엔드포인트는 https://yourInstance.my.salesforce.com/services/apexrest/ 입니다. 2
- URL 매핑이 기본 엔드포인트에 추가되어 REST 서비스의 엔드포인트를 형성합니다.
- 예를 들어, 클래스 예제에서 REST 엔드포인트는 https://yourInstance.my.salesforce.com/services/apexrest/ 입니다.
- 조직의 경우 https://yourInstance.my.salesforce.com/services/apexrest/Account/*와 같이 보일 수 있습니다.
- *이 모듈에서 링크나 코드에 "yourInstance"가 표시되면 Salesforce Org 인스턴스로 변경해야 합니다.
URL 매핑은 대소문자를 구분하며 와일드카드 문자(*)를 포함할 수 있습니다.
노출된 각 메서드를 global static 으로 정의하고 어노테이션을 추가하여 HTTP 메서드와 연결합니다. 각 어노테이션은 각 Apex 클래스에서 한 번만 사용할 수 있습니다.
| Annotation | Action | Details |
| @HttpGet | Read | 레코드를 읽거나 검색 |
| @HttpPost | Create | Creates records. |
| @HttpDelete | Delete | Deletes records. |
| @HttpPut | Upsert | 일반적으로 기존 레코드를 업데이트하거나 레코드를 생성하는 데 사용 |
| @HttpPatch | Update | 일반적으로 기존 레코드의 필드를 업데이트하는 데 사용 |
(2) 클래스를 SOAP 서비스로 노출
Apex 클래스를 SOAP 웹 서비스로 제공하는 것은 REST를 사용하는 것만큼이나 쉽습니다. 클래스를 global 으로 정의합니다. 노출하려는 각 메서드에 webservice 키워드와 static 정의 수정자를 추가합니다. 웹서비스 키워드는 추가된 메소드에 대한 전역 액세스를 제공합니다.
global with sharing class MySOAPWebService {
webservice static Account getRecord(String id) {
// Add your code
}
}
예를 들어, 다음은 하나의 메서드가 있는 샘플 클래스입니다. getRecord 메서드는 계정 레코드를 반환하는 사용자 지정 SOAP API 호출입니다.
외부 애플리케이션은 클래스 WSDL 파일을 사용하여 사용자 지정 Apex 메서드를 웹 서비스 작업으로 호출할 수 있습니다. 설정의 Apex 클래스 페이지에서 액세스하는 클래스 세부 정보 페이지에서 클래스에 대한 이 WSDL을 생성합니다. 일반적으로 웹 서비스용 통합을 작성하기 위해 타사 개발자에게 WSDL 파일을 보내거나 직접 사용합니다.
플랫폼 보안은 최고 수준의 Salesforce 시민이므로 웹 서비스에는 인증이 필요합니다. 외부 애플리케이션은 로그인 기능을 위해 Apex 클래스 WSDL 외에도 Enterprise WSDL 또는 파트너 WSDL을 사용해야 합니다.
(3) Apex REST 연습
다음 몇 단계는 Apex REST 서비스를 빌드하는 과정을 안내합니다.
먼저 REST 서비스로 노출되는 Apex 클래스를 만듭니다. 그런 다음 클라이언트에서 몇 가지 메서드를 호출하고 마지막으로 단위 테스트를 작성합니다. 코드가 꽤 많지만 노력할 만한 가치가 있습니다!
- Apex 클래스는 케이스 레코드를 관리합니다.
- 클래스에는 5개의 메서드가 있으며, 각 메서드는 HTTP 메서드에 해당합니다.
- 예를 들어 클라이언트 애플리케이션이 GET HTTP 메서드에 대한 REST 호출을 호출하면 getCaseById 메서드가 호출됩니다.
이 클래스는 /Cases/*의 URL 매핑으로 정의되므로 이 REST 서비스를 호출하는 데 사용되는 엔드포인트는 https://yourInstance.my.salesforce.com/services/apexrest/Cases/ 로 시작하는 모든 URI입니다.
기존 코드를 손상시키지 않고 기능 업그레이드를 제공할 수 있도록 API 엔드포인트의 버전 관리도 고려하는 것이 좋습니다. 이 기능을 구현하기 위해 /Cases/v1/* 및 /Cases/v2/*의 URL 매핑을 지정하는 두 개의 클래스를 만들 수 있습니다
Apex REST 클래스를 생성하기
@RestResource(urlMapping='/Cases/*')
global with sharing class CaseManager {
@HttpGet
global static Case getCaseById() {
RestRequest request = RestContext.request;
// URL 끝에서 케이스아이디를 가져옵니다.
String caseId = request.requestURI.substring(
request.requestURI.lastIndexOf('/')+1);
Case result = [SELECT CaseNumber,Subject,Status,Origin,Priority
FROM Case
WHERE Id = :caseId];
return result;
}
@HttpPost
global static ID createCase(String subject, String status,
String origin, String priority) {
Case thisCase = new Case(
Subject=subject,
Status=status,
Origin=origin,
Priority=priority);
insert thisCase;
return thisCase.Id;
}
@HttpDelete
global static void deleteCase() {
RestRequest request = RestContext.request;
String caseId = request.requestURI.substring(
request.requestURI.lastIndexOf('/')+1);
Case thisCase = [SELECT Id FROM Case WHERE Id = :caseId];
delete thisCase;
}
@HttpPut
global static ID upsertCase(String subject, String status,
String origin, String priority, String id) {
Case thisCase = new Case(
Id=id,
Subject=subject,
Status=status,
Origin=origin,
Priority=priority);
// Id가 있으면 대/소문자를 일치시킵니다.
// 그렇지 않으면 새 케이스를 만듭니다.
upsert thisCase;
// Return the case ID.
return thisCase.Id;
}
@HttpPatch
global static ID updateCaseFields() {
RestRequest request = RestContext.request;
String caseId = request.requestURI.substring(
request.requestURI.lastIndexOf('/')+1);
Case thisCase = [SELECT Id FROM Case WHERE Id = :caseId];
// JSON 문자열을 이름-값 쌍으로 역직렬화
Map<String, Object> params = (Map<String, Object>)JSON.deserializeUntyped(request.requestbody.tostring());
// 각 매개변수 필드와 값을 반복
for(String fieldName : params.keySet()) {
// Case sObject의 필드와 값을 설정
thisCase.put(fieldName, params.get(fieldName));
}
update thisCase;
return thisCase.Id;
}
}
POST 메서드를 사용하여 레코드 만들기 (Workbench 사용)
방금 만든 Apex REST 클래스를 사용하기. 먼저 POST 메서드를 호출하여 사례 레코드를 생성하겠습니다.
REST 서비스를 호출하려면... REST 클라이언트를 사용해야 합니다!
자체 API 클라이언트, cURL 명령줄 도구 또는 PHP용 curl 라이브러리 등 거의 모든 REST 클라이언트를 사용할 수 있습니다. 여기서는 Workbench 도구를 REST 클라이언트 애플리케이션으로 사용하겠습니다.
Apex REST는 리소스 표현을 위해 두 가지 형식을 지원합니다: JSON과 XML. JSON 표현은 기본적으로 요청 또는 응답의 본문에 전달되며, 형식은 HTTP 헤더의 Content-Type 속성으로 표시됩니다.
JSON은 XML보다 읽고 이해하기 쉽기 때문에 이 단원에서는 JSON만 사용합니다. 이 단계에서는 사례 레코드를 JSON 형식으로 전송합니다.
Apex REST는 OAuth 2.0 및 세션 인증 메커니즘을 지원합니다. 간단히 말해, 업계 표준을 사용하여 애플리케이션과 데이터를 안전하게 유지한다는 의미입니다.
Workbench를 사용하면 테스트를 더 쉽게 수행할 수 있습니다.
- Workbench는 관리자와 개발자가 Lightning Platform API를 통해 조직과 상호 작용할 수 있는 강력한 웹 기반 도구 모음입니다.
- Workbench를 사용하면 사용자 이름과 비밀번호로 Salesforce에 로그인할 때 세션 인증을 사용합니다.
- 그리고 REST Explorer를 사용하여 REST 서비스를 호출합니다.
💡 Workbench 에서 POST 사용하기
- https://workbench.developerforce.com/login.php 으로 이동합니다.
- 환경에서 프로덕션을 선택합니다.
- API 버전 드롭다운에서 최신 API 버전을 선택합니다.
- 최신 버전에 문제가 있는 경우 다른 API 버전을 선택해야 할 수도 있습니다.
- 서비스 약관에 동의하고 Salesforce로 로그인을 클릭합니다.
- Workbench가 사용자 정보에 액세스할 수 있도록 허용하려면 허용을 클릭합니다.
- 로그인 자격 증명을 입력한 다음 Salesforce에 로그인을 클릭합니다.
- 로그인한 후 유틸리티 | REST 탐색기를 선택합니다.
- POST를 선택합니다.
- REST Explorer가 허용하는 URL 경로는 조직의 인스턴스 URL에 상대적입니다. 인스턴스 URL에 추가되는 경로만 제공하세요. 상대 URI 입력 필드에서 기본 URI를 /services/apexrest/Cases/로 바꿉니다.
- 요청 본문에는 삽입할 개체의 다음 JSON 문자열 표현을 삽입합니다.

12. 실행 Execute 을 클릭합니다. 이 호출은 POST HTTP 메소드와 연결된 메소드, 즉 createCase 메소드를 호출합니다.
13. Show Raw Response 반환된 응답 확인하기. 다음 단계에서 사용할 수 있도록 ID 값을 저장하세요.
사용자 지정 GET 메서드로 데이터 검색하기
💡 GET 메서드로 데이터 검색
- 워크벤치에서 GET을 선택
- /services/apexrest/Cases/<Record ID> URI를 입력하고 <레코드 ID>를 이전 단계에서 만든 레코드의 ID로 바꿉니다.
- 실행을 클릭합니다. 이 호출은 GET HTTP 메서드와 연결된 메서드, 즉 getCaseById 메서드를 호출
- 반환된 응답을 보려면 click Show Raw Response.

사용자 지정 PUT 또는 PATCH 메서드로 데이터 업데이트
- PUT 또는 PATCH HTTP 메서드로 레코드를 업데이트할 수 있습니다.
- PUT 메서드는 리소스가 있는 경우 전체 리소스를 업데이트하거나 리소스가 없는 경우 리소스를 생성합니다.
- PUT은 기본적으로 업서트 메서드입니다.
- PATCH 메서드는 기존 리소스의 지정된 부분만 업데이트합니다. Apex에서 업데이트 작업은 지정된 필드만 업데이트하고 전체 레코드를 덮어쓰지 않습니다.
업데이트 메서드인지 업서트 메서드인지 결정하기 위해 Apex 코드를 작성해 보겠습니다.
PUT 메서드로 데이터 업데이트
- CaseManager 클래스에 추가한 upsertCase 메서드는 PUT 액션을 구현합니다.
이 메서드는 참조를 위해 여기에 포함되어 있습니다. 이 메서드는 기본 제공 upsert Apex DML 메서드를 사용하여 ID 값과 일치시켜 대/소문자 레코드 필드를 생성하거나 덮어씁니다. 요청 본문에 ID가 전송되면 대/소문자 sObject가 채워집니다. 그렇지 않으면 ID 없이 대/소문자 sObject가 생성됩니다. 채워진 대/소문자 sObject를 사용하여 upsert 메서드가 호출되고 나머지는 DML 문이 처리합니다!


실행을 클릭합니다.
이 요청은 REST 서비스에서 upsertCase 메서드를 호출합니다. 상태, 제목 및 우선순위 필드가 업데이트됩니다. 제목은 이전 제목과 값이 일치하더라도 업데이트됩니다. 또한 요청 본문에 Case Origin 필드에 대한 값이 포함되어 있지 않았기 때문에 upsertCase 메서드의 origin 매개 변수는 null입니다. 결과적으로 레코드가 업데이트되면 Origin 필드가 지워집니다.
https://yourInstance.my.salesforce.com/<Record ID>
Instance 는 Setup 설정에서 Company Information 에서 확인할 수 있다.
https://AP62.my.salesforce.com/500J4000001ks6jIAA

PATCH Method로 데이터 업데이트
PUT 메서드의 대안으로 PATCH 메서드를 사용하여 레코드 필드를 업데이트합니다.
PATCH 메서드는 다양한 방식으로 구현할 수 있습니다. 한 가지 방법은 메서드에 업데이트할 각 필드에 대한 매개 변수를 지정하는 것입니다.
예를 들어 다음과 같은 서명을 사용하여 케이스의 우선순위를 업데이트하는 메서드를 만들 수 있습니다: updateCasePriority(문자열 우선순위). 여러 필드를 업데이트하려면 원하는 모든 필드를 매개 변수로 나열할 수 있습니다.
더 많은 유연성을 제공하는 또 다른 접근 방식은 요청 본문에서 필드를 JSON 이름/값 쌍으로 전달하는 것입니다. 이렇게 하면 메서드가 임의의 수의 매개변수를 허용할 수 있으며, 매개변수가 메서드의 서명에 고정되지 않습니다. 이 접근 방식의 또 다른 장점은 JSON 문자열에 포함되지 않아 실수로 지워지는 필드가 없다는 것입니다.
CaseManager 클래스에 추가한 updateCaseFields 메서드는 이 두 번째 접근 방식을 사용합니다. 이 메서드는 요청 본문에서 JSON 문자열을 이름/값 쌍의 맵으로 역직렬화하고 sObject put 메서드를 사용하여 필드를 설정합니다.


Apex REST 클래스 테스트
매개변수 값을 전달하여 클래스 메서드를 호출한 다음 결과를 확인하기만 하면 다른 Apex 클래스를 테스트하는 것과 유사하게 Apex REST 클래스를 테스트할 수 있습니다. 매개 변수를 받지 않거나 REST 요청의 정보에 의존하는 메서드의 경우 테스트 REST 요청을 생성하세요.
일반적으로 Apex REST 서비스를 테스트하는 방법은 다음과 같습니다. REST 요청을 시뮬레이션하려면 테스트 메서드에서 RestRequest를 만든 다음 다음과 같이 요청에 대한 속성을 설정합니다. 요청에 "전달"하는 매개 변수를 추가하여 URI 매개 변수를 시뮬레이션할 수도 있습니다.
@IsTest
private class CaseManagerTest {
@isTest static void testGetCaseById() {
Id recordId = createTestRecord();
// Set up a test request
RestRequest request = new RestRequest();
request.requestUri =
'https://AP62.my.salesforce.com/services/apexrest/Cases/'
+ recordId;
request.httpMethod = 'GET';
RestContext.request = request;
// Call the method to test
Case thisCase = CaseManager.getCaseById();
// Verify results
Assert.isTrue(thisCase != null);
Assert.areEqual('Test record', thisCase.Subject);
}
@isTest static void testCreateCase() {
// Call the method to test
ID thisCaseId = CaseManager.createCase(
'Ferocious chipmunk', 'New', 'Phone', 'Low');
// Verify results
Assert.isTrue(thisCaseId != null);
Case thisCase = [SELECT Id,Subject FROM Case WHERE Id=:thisCaseId];
Assert.isTrue(thisCase != null);
Assert.areEqual(thisCase.Subject, 'Ferocious chipmunk');
}
@isTest static void testDeleteCase() {
Id recordId = createTestRecord();
// Set up a test request
RestRequest request = new RestRequest();
request.requestUri =
'https://yourInstance.my.salesforce.com/services/apexrest/Cases/'
+ recordId;
request.httpMethod = 'DELETE';
RestContext.request = request;
// Call the method to test
CaseManager.deleteCase();
// Verify record is deleted
List<Case> cases = [SELECT Id FROM Case WHERE Id=:recordId];
Assert.isTrue(cases.size() == 0);
}
@isTest static void testUpsertCase() {
// 1. Insert new record
ID case1Id = CaseManager.upsertCase(
'Ferocious chipmunk', 'New', 'Phone', 'Low', null);
// Verify new record was created
Assert.isTrue(Case1Id != null);
Case case1 = [SELECT Id,Subject FROM Case WHERE Id=:case1Id];
Assert.isTrue(case1 != null);
Assert.areEqual(case1.Subject, 'Ferocious chipmunk');
// 2. Update status of existing record to Working
ID case2Id = CaseManager.upsertCase(
'Ferocious chipmunk', 'Working', 'Phone', 'Low', case1Id);
// Verify record was updated
Assert.areEqual(case1Id, case2Id);
Case case2 = [SELECT Id,Status FROM Case WHERE Id=:case2Id];
Assert.isTrue(case2 != null);
Assert.areEqual(case2.Status, 'Working');
}
@isTest static void testUpdateCaseFields() {
Id recordId = createTestRecord();
RestRequest request = new RestRequest();
request.requestUri =
'https://yourInstance.my.salesforce.com/services/apexrest/Cases/'
+ recordId;
request.httpMethod = 'PATCH';
request.addHeader('Content-Type', 'application/json');
request.requestBody = Blob.valueOf('{"status": "Working"}');
RestContext.request = request;
// Update status of existing record to Working
ID thisCaseId = CaseManager.updateCaseFields();
// Verify record was updated
Assert.isTrue(thisCaseId != null);
Case thisCase = [SELECT Id,Status FROM Case WHERE Id=:thisCaseId];
Assert.isTrue(thisCase != null);
Assert.areEqual(thisCase.Status, 'Working');
}
// Helper method
static Id createTestRecord() {
// Create test record
Case caseTest = new Case(
Subject='Test record',
Status='New',
Origin='Phone',
Priority='Medium');
insert caseTest;
return caseTest.Id;
}
}

Apex REST에서 지원되는 데이터 유형
Apex REST는 매개변수 및 반환 값에 대해 다음 데이터 유형을 지원합니다.
- Apex 프리미티브(객체 및 블롭 제외).
- sObjects
- Apex 프리미티브 또는 sObjects의 목록 또는 맵(문자열 키가 있는 맵만 지원됨).
- 위에 나열된 유형의 멤버 변수를 포함하는 사용자 정의 유형.
Apex REST 엔드포인트의 네임스페이스
Apex REST 메서드는 관리형 및 비관리형 패키지에서 사용할 수 있습니다. 관리형 패키지에 포함된 Apex REST 메서드를 호출할 때는 REST 호출 URL에 관리형 패키지 네임스페이스를 포함해야 합니다.
예를 들어 클래스가 packageNamespace라는 관리 패키지 네임스페이스에 포함되어 있고 Apex REST 메서드가 /MyMethod/*의 URL 매핑을 사용하는 경우 REST를 통해 이러한 메서드를 호출하는 데 사용되는 URL은 https://instance.my.salesforce.com/services/apexrest/packageNamespace/MyMethod/ 형식이 됩니다.
사용자 지정 Apex 웹 서비스 및 Salesforce API
REST 및 SOAP 서비스를 위한 사용자 지정 Apex 코드를 사용하는 대신, 외부 애플리케이션은 Salesforce의 REST 및 SOAP API를 사용하여 Salesforce와 통합할 수 있습니다.
- 이러한 API를 사용하면 레코드를 생성, 업데이트 및 삭제할 수 있습니다.
- 그러나 Apex 웹 서비스 사용의 장점은 복잡한 로직을 캡슐화할 수 있다는 것입니다.
- 이 로직은 소비하는 애플리케이션에서 숨겨집니다. 또한 Apex 클래스 작업은 클라이언트와 Salesforce 서버 간에 수행되는 왕복 횟수가 적기 때문에 개별 API 호출보다 더 빠를 수 있습니다.
- Apex 웹 서비스 호출을 사용하면 요청이 한 번만 전송되고 메서드 내의 모든 작업이 서버에서 수행됩니다.
Apex 웹 서비스의 보안 고려 사항
Apex 웹 서비스 메서드가 실행되는 보안 컨텍스트는 Salesforce API의 보안 컨텍스트와 다릅니다.
Salesforce API와 달리 Apex 웹 서비스 메서드는 시스템 권한으로 실행되며 사용자의 개체 및 필드 권한을 존중하지 않습니다. Apex 웹 서비스 메서드는 with sharing 키워드를 사용하여 선언할 때 공유 규칙을 적용합니다.
트레일헤드 실습
💡 계정과 해당 연락처를 반환하는 Apex REST 서비스를 만듭니다.
계정/<Accounts_ID>/contacts에서 액세스할 수 있는 Apex REST 클래스를 만듭니다.
이 서비스는 계정의 ID와 이름, 그리고 계정과 연결된 모든 연락처의 ID와 이름을 반환합니다.
클래스에 대해 100% 코드 커버리지를 달성하는 단위 테스트를 작성하고 Apex 테스트를 실행합니다.
@RestResource(urlMapping='/Accounts/*/contacts')
global class AccountManager {
@HttpGet
global static Account getAccount() {
RestRequest request = RestContext.request;
// URL 끝에서 케이스아이디를 가져옵니다.
// String accountId = request.requestURI.substring(
// request.requestURI.lastIndexOf('/')+1);
String accountId = request.requestURI.substringBetween('Accounts/','/contacts');
Account result = [SELECT ID, NAME, (SELECT Id, Name FROM Contacts)
FROM Account WHERE Id = :accountId];
system.debug('Result is :' + result);
return result;
}
}
▲ Apex 클래스 만들기
- Name: AccountManager
- 클래스에는 getAccount라는 메서드가 있어야 합니다.
- 메서드에 @HttpGet으로 주석을 달고 계정 개체를 반환해야 합니다.
- 메서드는 요청된 레코드의 ID 및 이름과 해당 ID 및 이름과 연결된 모든 연락처를 반환해야 합니다.
@IsTest
private class AccountManagerTest {
@isTest static void testAccountManager() {
Id recordId = createTestRecord();
// Set up a test request
RestRequest request = new RestRequest();
request.requestUri =
'<https://AP62.salesforce.com/services/apexrest/Accounts/>' + recordId + '/contacts';
// 'mindful-panda-hnixis-dev-ed.trailblaze.lightning.force.com/services/apexrest/Accounts/'+recordId+'/contacts';
// 주소를 프로필 네임으로 변경(둘 다 해도 100% 커버리지 뜸), 그리고 계정, 연락처 - Validation Rules 비활성화.
request.httpMethod = 'GET';
RestContext.request = request;
// Call the method to test
Account thisAccount = AccountManager.getAccount();
// Verify results
Assert.isTrue(thisAccount != null);
// Assert.isTrue(thisAccount.Contacts.size() == 3);
}
// Helper method
static Id createTestRecord() {
// Create test record
Account AccountTest = new Account(Name='AccountTest');
insert AccountTest;
// Contact 가져오기
// Contact TestCon= new Contact(LastName='TestCon', AccountId = AccountTest.id);
List contacts = new List();
Contact TestCon = new Contact();
for(Integer i=1;i<=3;i++){
contacts.add(new Contact(LastName='Test Contact'+i, AccountId=AccountTest.Id));
}
insert contacts;
return AccountTest.Id;
}
}
▲ 단위 테스트 만들기
- 단위 테스트는 AccountManagerTest라는 별도의 Apex 클래스에 있어야 합니다.
- 단위 테스트는 AccountManager 클래스에 포함된 모든 코드 줄을 커버해야 하며, 그 결과 코드 커버리지가 100%가 되어야 합니다.
| 먼저 AccountManager 클래스에는 @RestResource 어노테이션인 이 클래스가 REST API 엔드포인트로 사용된다는 것을 의미그리고 urlMapping 속성에 정의된 대로 /Accounts/*/contacts URL에 매핑됩니다. getAccount() 메서드는 HTTP GET 요청을 처리합니다. 이 메서드는 요청 URI에서 계정 ID를 추출하고, 해당 계정의 정보와 연락처 목록을 가져와 반환합니다. AccountManagerTest 클래스는 이 getAccount() 메서드를 테스트하기 위한 클래스. testAccountManager() 메서드에서는 테스트를 위한 계정과 연락처 데이터를 생성하고, 이를 이용하여 getAccount() 메서드를 호출하고 결과를 검증합니다. createTestRecord() 메서드는 테스트에 필요한 계정과 연락처 데이터를 생성하는 헬퍼 메서드입니다. 계정 하나와 연락처 3개를 생성하여 계정 ID를 반환합니다. |
5) Postman 활용하기
https://quickstarts.postman.com/guide/connect-postman-to-salesforce/index.html?index=..%2F..index#2
페이지 참고하면서 Postman과 Salesforce 연결
Postman에서 Workspace 생성 후 API → fork 생성 → Get New Access Token → endpoint에 내 인스턴스 URL 추가

Postman에서 REST 폴더 -> GET(Limits) 한도 가져오기 테스트 -> 200 OK 이면 성공 -> Object 데이터 넣기 실습

2. Connected app 만들어서 연결하는 방법
영상 보면서 참고
'Salesforce > 정리' 카테고리의 다른 글
| 개발자 초급 정리 (3. 수식 필드, 4. Apex 기본 및 데이터베이스) (0) | 2024.09.06 |
|---|---|
| 개발자 초급 정리 (1. Salesforce 개발 시작하기, 2. 샘플 앱 설치) (0) | 2024.08.29 |
| Experience Cloud 회원가입 부분 (CommunitiesSelfReg 추가) (0) | 2024.08.19 |
| Experiences Cloud 부분 (외부 회원가입) (0) | 2024.08.08 |
댓글