출장 중인 영업 담당자를 위한 REST: Salesforce.com에서 Google 데이터 사용

Lane LiaBraaten, Google 개발자 프로그램
2007년 11월

소개

Salesforce.com과 Google은 인기 있는 'Software as a Service' 애플리케이션을 호스팅합니다. 두 조직 모두 개발자가 이러한 애플리케이션을 구동하는 대규모 데이터 저장소에 액세스할 수 있게 해주는 API를 제공하며, 두 가지 API를 결합하면 흥미로운 작업이 시작됩니다. G Suite는 기업 환경에서 점점 더 많이 사용되고 있으며 Salesforce.com은 맞춤 비즈니스 애플리케이션을 빌드하기 위한 광범위한 플랫폼을 구축했으므로, 개발자가 Google과 Salesforce.com의 강력한 기능을 결합할 수 있는 기회가 많습니다.

이 도움말에서는 Salesforce.com 플랫폼 또는 Google 데이터 프로토콜로 시작한 지 얼마 되지 않은 경우에도 RESTful Google Data API를 사용하여 엔터프라이즈 매시업을 빌드하는 방법을 설명합니다. 개발 환경을 설정하고 기존 Salesforce.com 및 Google 매쉬업을 설치한 후 직접 작성하도록 도와드리겠습니다.

Salesforce.com 담당자님, 안녕하세요.

Salesforce.com 초보자인 경우 먼저 Apex Developer Network인 ADN에서 개발자 계정에 가입하시기 바랍니다. 개발자 계정을 사용하면 모든 기능을 갖춘 Salesforce.com 계정과 Apex 위키토론 게시판을 이용할 수 있습니다.

다음으로, Eclipse용 Apex 툴킷을 다운로드합니다. 도구 키트에는 자바 1.5Eclipse 3.2.2 이상이 필요합니다. Eclipse를 사용하는 방법을 알고 있다면 툴킷의 소프트웨어 업데이트 사이트는 http://www.adnsandbox.com/eclipsetoolkit/10.0/입니다. Eclipse 플러그인에 익숙하지 않거나 설치 중에 문제가 발생하는 경우 Apex 위키에 자세한 설치 안내가 포함되어 있습니다.

툴킷을 설치하면 Eclipse의 도움말 시스템에 통합된 Apex 도움말 콘텐츠에 액세스할 수 있습니다. Eclipse에서 Help | Help Contents | Apex Toolkit for Eclipse로 이동하여 이 콘텐츠를 확인합니다. 도움말 리소스 중 하나는 새 프로젝트를 만들고 S-Control, 클래스, 트리거를 추가하는 방법을 보여주는 빠른 시작 튜토리얼입니다. Apex 코드로 작업한 적이 없다면 계속 진행하기 전에 이 튜토리얼을 살펴보고 Apex 프로젝트를 만들어야 합니다.

Google Calendar로 일정 내보내기

Ron Hess는 Salesforce.com에서 Google 캘린더로 일정을 내보낼 수 있는 Google Calendar 매쉬업 애플리케이션을 제작했습니다. 또한 론은 매쉬업의 작동 방식을 설명하는 도움말도 작성했습니다. 나중에 빌드하는 방법을 보여드리는 Google 스프레드시트 애플리케이션은 Ron의 Google Calendar 매쉬업을 모델링한 것입니다. 고마워요, 론!

Salesforce.com 고급 사용자는 안내에 따라 Ron의 Google 캘린더 애플리케이션을 통합하고 사용할 수 있습니다. 처음에는 도움이 필요해서 Ron의 앱이 작동하는 것을 볼 수 있었습니다.

  1. 애플리케이션을 설치합니다.
    • Google Calendar 매쉬업 페이지로 이동하여 지금 다운로드를 클릭합니다.
    • ADN 사용자 인증 정보를 입력하고 계속을 클릭합니다.
    • 이용약관을 읽고 계속을 클릭합니다.
    • '패키지 콘텐츠 검사' 페이지에서 다음을 클릭합니다.
    • 보안 수준을 선택하고 다음을 클릭합니다.
    • Install을 클릭합니다.
  2. Salesforce.com AJAX 프록시 구성하기
    • '관리 설정' 메뉴에서 보안 제어 | 원격 사이트 설정을 클릭합니다.
    • Remote Site Settings(새 원격 사이트)를 클릭합니다.
    • '원격 사이트 이름'으로 Google을 입력하고 '원격 사이트 URL'에는 https://www.google.com을 사용합니다.
    • 저장을 클릭합니다.
  3. 일정 세부정보 페이지에 'Google에 추가' 버튼을 추가합니다.
    • '앱 설정' 메뉴에서 맞춤설정 | 활동 | 이벤트 페이지 레이아웃을 클릭합니다.
    • '이벤트 레이아웃' 행에서 수정을 클릭합니다.
    • '세부정보 페이지 버튼' 영역을 더블클릭합니다.
    • 'Google에 추가'를 강조표시하고 오른쪽(>) 화살표를 클릭하여 버튼을 추가합니다.
    • OK를 클릭합니다.
    • '페이지 레이아웃 속성' 페이지에서 저장을 클릭합니다.
  4. 일정 내보내기
    • 왼쪽 상단의 을 클릭하여 캘린더를 봅니다.
    • 일정이 없는 경우 새 일정을 클릭하여 일정을 만듭니다.
    • 일정을 클릭하여 일정 세부정보 페이지를 확인합니다.
    • Google에 추가 버튼을 클릭합니다.
    • 자바스크립트 알림을 통해 확인을 클릭합니다.
    • Google 사용자 이름과 비밀번호로 로그인합니다.
    • 액세스 권한 부여를 클릭하여 SalesForce 애플리케이션에 Google 캘린더에 대한 쓰기 액세스 권한을 부여합니다.
    • Google Calendar에서 일정 보기

Google Sheets 애플리케이션 빌드

Salesforce.com 페이지를 여기저기 클릭해 보면서 코드를 작성할 준비는 지긋지긋합니다. Eclipse를 다시 실행하면 이제 만든 Apex 프로젝트에 Ron을 위한 S-Controls인 Google Calendar 앱이 포함됩니다. Eclipse용 Apex 툴킷이 Salesforce.com-pretty와 훌륭하게 동기화되기 때문입니다.

인증 제어와 같은 Google Calendar 매쉬업의 기능 몇 가지를 재사용하여 Google 데이터 앱을 직접 빌드할 수 있습니다. 이 섹션의 나머지 부분에서는 Salesforce.com 연락처를 Google Sheets로 내보내는 앱을 빌드하는 방법을 보여드리겠습니다.

간단한 S-Control 게시

S-Control은 Salesforce.com에서 호스팅하고 사용자가 애플리케이션에 액세스할 때 웹브라우저에서 실행되는 파일입니다. S-Control에는 HTML, CSS 또는 자바스크립트와 같이 웹브라우저에서 표시하거나 실행할 수 있는 모든 유형의 콘텐츠가 포함될 수 있습니다.

Salesforce.com 및 Google 매쉬업에는 몇 가지 움직이는 부분이 있습니다. 가장 먼저 한 작업은 'Google로 내보내기' 버튼을 간단한 S-Control-을 호출하는 연락처 목록 페이지에 추가하는 것이었습니다.

Apex 프로젝트에서 'S-Controls' 폴더를 마우스 오른쪽 버튼으로 클릭하고 Apex | New S-Control을 선택합니다. 새 S-Control에 라벨과 export_contacts의 이름을 지정한 후 맞춤 HTML을 그대로 두고 마침을 클릭합니다.

새로운 S-Control에는 스켈레톤 HTML 파일이 포함됩니다. <head>에 여러 자바스크립트를 추가하겠지만, <body>에 먼저 내용을 입력할 수 있으므로 연락처를 내보내는 동안 사용자에게 보여줄 내용을 파악할 수 있습니다. 이 HTML을 S-Control 본문에 복사하여 '대기 중인 점'과 Google Sheets 로고를 표시합니다.

<div id="waiting" align="center" />
  <img src="/img/icon/home32.png" height="64" width="64" />
  <img src="/img/waiting_dots.gif" alt="Please wait..." title="Please wait..." height="25" width="196" />
  <img src="http://docs.google.com/images/doclist/logo_docs.gif" />
  <p><h3>Exporting contacts to Google Spreadsheets, please wait...</h3></p>

</div>

이제 S-Control을 게시하고 S-Control을 호출하는 버튼을 설정할 수 있습니다.

  1. Eclipse를 사용하여 S-Control 파일을 게시합니다.
    • Apex 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 Apex | Synchronize with Salesforce를 선택합니다.
    • 디렉터리 트리에서 새 S-Control을 찾아 마우스 오른쪽 버튼으로 클릭한 다음 Remote remote and publish to server를 선택합니다.
    • S-Control을 찾을 수 없다면 Apex 툴킷에서 이미 업로드한 것일 수 있지만, 최신 코드가 서버에서 실행되도록 하려면 동기화 시점을 사용하는 것이 좋습니다.
  2. Salesforce.com UI를 사용하여 이 S-Control을 호출하는 버튼을 정의합니다.
    • '앱 설정' 메뉴에서 맞춤설정 | 연락처 | 버튼 및 링크를 클릭합니다.
    • '맞춤 버튼 및 링크' 섹션에서 새로 만들기를 클릭합니다.
    • 라벨에 Google로 내보내기를 입력하고 이름으로 Export_to_Google을 유지합니다.
    • 디스플레이 유형으로 '목록 버튼'을 선택합니다.
    • 콘텐츠 소스로 'Custom S-Control'을 선택합니다.
    • 동작으로 '기존 창에 사이드바 표시'를 선택합니다.
    • 맞춤 S-Control 메뉴에서 'export_contacts'를 선택합니다.
  3. 연락처 목록에 버튼을 추가합니다.
    • '앱 설정' 메뉴에서 맞춤설정 | 연락처 | 검색 레이아웃을 클릭합니다.
    • '연락처 목록 보기' 행에서 수정을 클릭합니다.
    • 'Google로 내보내기'를 강조표시하고 오른쪽(>) 화살표를 클릭하여 버튼을 추가합니다.
    • 저장을 클릭합니다.
  4. 다음과 같이 시승해 보세요.
    • 연락처 탭을 클릭합니다.
    • 보기로 '모든 연락처'를 선택하고 이동!을 클릭합니다.
    • 새로운 Google로 내보내기 버튼을 클릭합니다.
    • 'waiting_dots'를 시청하되 다른 현상은 발생하지 않습니다.

Google Sheets와 상호작용

Google Calendar 매쉬업의 소스를 살펴보면 gcal_snippet.scf 파일에 Google Calendar 서버의 추상화가 포함되어 있음을 확인할 수 있습니다. Google Sheets와 상호작용하려면 Google Sheets 서버에 사용할 비슷한 파일을 만들어야 합니다. Salesforce.com AJAX 프록시를 사용하고 Google AuthSub로 인증하기 위해 론 헤스의 코드를 재사용하고 Google 캘린더에 이벤트를 쓰는 함수를 Google 스프레드시트에 정보를 쓰는 함수로 대체했습니다. 이 파일의 전체 소스는 gspreadsheet_snippet.scf에서 확인할 수 있습니다.

다음으로, Salesforce.com에서 연락처 정보를 검색하고 Google 스프레드시트에 기록하도록 export_contacts.scf S-Control에 자바스크립트를 추가했습니다. Salesforce.com에서 손쉽게 데이터를 내보낼 수 있습니다. 쿼리를 구성하고 데이터가 반환될 때 실행할 콜백 함수를 제공하면 됩니다. 예를 들면 다음과 같습니다.

  var query = 'Select FirstName, LastName, Phone From Contact';
  var queryResult = sforce.connection.query(query, queryCallback);

Salesforce.com의 연락처 정보를 확보하면 내보낼 위치를 파악해야 합니다. RESTful Google 데이터 프로토콜에서 각 스프레드시트는 고유 URL로 식별할 수 있습니다. 메타피드 URL http://spreadsheets.google.com/feeds/spreadsheets/private/full을 쿼리하여 사용자의 스프레드시트 및 연결된 URL 목록을 가져올 수 있습니다. 다음 방법은 이러한 스프레드시트를 반복하여 특정 제목이 포함된 스프레드시트를 찾습니다. 올바른 스프레드시트를 찾으면 먼저 워크시트의 목록을 가져온 다음 첫 번째 워크시트의 셀 피드 URL을 반환합니다.

function getCellFeedUrl() {
  var SPREADSHEET_TITLE = 'Salesforce.com Contacts';
  var WORKSHEET_REL = 'http://schemas.google.com/spreadsheets/2006#worksheetsfeed';
  var CELLSFEED_REL = 'http://schemas.google.com/spreadsheets/2006#cellsfeed';

  // Query to find the spreadheet called "Salesforce.com Contacts"
  var spreadsheets = g.getFeed('http://spreadsheets.google.com/feeds/spreadsheets/private/full');
  var entries = g.getEntryList(spreadsheets);
  for (var e in entries) {
    if (g.getTitle(entries[e]) == SPREADSHEET_TITLE) {
      var worksheetsFeedUrl = g.link(entries[e],WORKSHEET_REL);
      var worksheets = g.getFeed(worksheetsFeedUrl);
      var worksheetEntries = g.getEntryList(worksheets);
      return g.link(worksheetEntries[0], CELLSFEED_REL);
    }
  }
}

Google Sheets 데이터 API에서 사용할 수 있는 피드에 대한 자세한 내용은 참조 가이드에서 확인할 수 있습니다.

queryCallback 함수는 getCellFeedUrl 메서드를 사용하여 셀 업데이트 요청을 보내는 데 필요한 셀 피드 URL을 찾은 다음 한 번에 셀의 연락처 정보를 작성합니다.

function queryCallback(queryResult) {
  var cellFeedUrl = getCellFeedUrl();
  var contacts = queryResult.getArray('records');
  for (var i=0; i<contacts.length; i++) {
    g.updateCell(cellFeedUrl, i+1, 1, contacts[i].LastName + ", " + contacts[i].FirstName);
    g.updateCell(cellFeedUrl, i+1, 2, contacts[i].Phone);
  }
  
  jumpback(); // Return to the contacts page when your done
}

updateCell 메서드는 gspreadsheet_snippet.scf S-Control에 있습니다. 이 메서드는 지정된 행과 열의 셀 수정 URL을 가져온 다음 업데이트된 셀의 Google 데이터 표현이 포함된 HTTP PUT 메시지를 전송합니다.

GoogleSpreadsheet.prototype.updateCell = function(cellsFeedUrl, row, column, content ) {
  var cellEntry = this.getFeed(cellsFeedUrl+'/R'+row+'C'+column);
  var cellEditUrl = this.link(cellEntry,'edit');

  var newCellEntry = "<atom:entry xmlns:atom='http://www.w3.org/2005/Atom'>" +
      "<atom:category scheme='http://schemas.google.com/spreadsheets/2006' " +
      "term='http://schemas.google.com/spreadsheets/2006#cell' />" +
      "<gs:cell xmlns:gs='http://schemas.google.com/spreadsheets/2006' " +
      "row='" + row + "' col='" + column + "' inputValue='" + content + "' />" +
      "</atom:entry>";

  this.putEntry(cellEditUrl, newCellEntry);
} 

Google Sheets 데이터 API로 셀을 업데이트하는 방법에 관한 자세한 내용은 개발자 가이드를 참고하세요.

Google Sheets 데이터 API에서는 하위 도메인 https://spreadsheets.google.com을 사용하므로 위의 코드가 작동하기 전에 Salesforce.com AJAX 프록시 서버를 구성하고 https://spreadsheets.google.com를 추가해야 합니다.

또한 Google Docs로 이동해 데이터를 저장할 새 스프레드시트를 만들어야 합니다. Salesforce.com 연락처로 저장해야 합니다.

이러한 S-Controls를 업로드하면 연락처 정보를 Google Sheets로 내보낼 수 있습니다. 다른 방법은 어떨까요? Salesforce.com 및 Google 데이터 API에 대한 지식이 있으면 Google Sheets에서 Salesforce.com으로 연락처 정보를 가져오는 코드를 작성할 수도 있습니다.

마무리

이 글은 간헐적으로 설명되어 있지만 Salesforce.com 플랫폼과 Google 데이터 API에 대해 잘 알게 되었으므로 이 강력한 시스템을 활용하기 위해 작성할 수 있는 모든 애플리케이션에 대해 생각해 보세요. Google 데이터 API 제품군은 계속 확대되고 있어 애플리케이션에서 활용할 수 있는 정보가 더 많이 제공되고 Salesforce.com 플랫폼은 이 도움말에서 다루지 않은 많은 유용한 도구를 제공합니다. AppExchange에서 차세대 엔터프라이즈 매쉬업을 찾아보겠습니다.

즐겁게 코딩해 보세요!

자료