사용자 스토리

Elasticsearch를 통한 CRM 구축

베를린에 본사를 두고 있는 Jilles van Gurp는 Inbot 아키텍처를 선도하는 회사로, 현장의 영업 직원을 위한 모바일 CRM 솔루션을 구축하고 있습니다. Inbot 고객 관리 도우미는 사용 중인 앱에서 고객 의견을 자동으로 캡처하고 영업 프로세스에 실시간 통찰력을 제공하며 휴대전화로 직접 팀 구성원들과 고객 프로젝트에서 협업할 수 있도록 지원합니다.


우리는 Inbot Elasticsearch를 사용하여 대용량 데이터 리프팅 및 분석을 수행하는 모바일 최초의 CRM을 제작하고 있습니다. 이 사례는 모바일 부문에서는 최초로, 일반적인 기업용 IT 관리 부서에서 통제되지 않는 환경에서 실행되는 사례을 의미합니다. 사용자 스마트폰은 영업 직원들이 고객과 의사 소통하는 데 사용하는 것과 동일한 기기이므로 CRM 용도에 사용할 데이터를 수집하기에 적합합니다.

휴대전화에서 데이터가 생성되는 위치에 접근하면 Inbot이 자동적으로 CRM 데이터 수집하여 반복적이고 지루한 데이터 입력 작업을 피할 수 있습니다. 시스템에 데이터가 입력되면 영업 활동에 대한 상황별 보고가 바로 새롭게 적용 되어 수신됩니다. 이 기능은 영업 대리점이 월별 또는 분기별로 늘상 해 오던 영업 활동 집계 업무를 실시간으로 원할하게 할 수 있도록 전환이 됩니다.

왜 Elasticsearch인가?

Elasticsearch는 aggregation 을 이용한 실시간 분석을 제공하기 때문에 우리 시스템에 적용하기에 매우 적합합니다. 이러한 기능을 제공하는 데이터베이스는 별로 없으며 대부분은 전문적인 데이터 마이닝 제품이나 데이터 과학자들이 사용하는 Apache Hadoop과 같은 전문가 도구들 뿐입니다. Elasticsearch aggregation 을 사용하면 지난 분기에 추가된 나의 예비 고객이 몇 명인지, 잠재 고객에서 계약이 성사되기 까지의 평균 시간은 얼마였는지, 우리 팀에서 누가 제일 영업 실적이 우수한지 등의 복잡한 문제에 대한 해답을 실시간으로 얻을 수 있습니다. 또한 Elasticsearch는 방대한 양의 데이터를 저장하고 쿼리 및 랭킹 정보를 매우 유연한 방법으로 제공합니다.

데이터베이스로서의 Elasticsearch

지난 한 해 동안 우리는 Elasticsearch를 기반으로 Inbot 백엔드를 재구축했습니다.

그 전에는 여러 분야에서 문제가 되고 있던 MySQL 기반 프로토타입 백엔드를 사용했습니다.

제가 Inbot에 합류할 당시, 그러니까 위치 기반 검색 회사인 Localstream를 인수한 2014년 초 당초 계획은 Elasticsearch aggregation 을 이용한 새로운 분석 엔진으로 Inbot 데이터 플랫폼을 보완하는 것이었습니다.

그러나 2014년 5월에는 Elasticsearch 기반으로 전체 백엔드를 재구축하고 이것을 데이터베이스로도 사용하기로 결정했습니다. Elasticsearch를 데이터베이스로 사용했던 Localstream과 Lucene을 key-value 저장소로 사용했던 Nokia에서의 경험에 비추어 볼 때 저는 다소 낮은 사양의 서버에서라도 수억 개의 소규모 JSON 프로젝트를 Elasticsearch로 쉽게 관리할 수 있다는 점을 알고 있었습니다.

당시 Elasticsearch를 데이터베이스로 사용하는 방법은 다소 논쟁의 여지가 있었으며 권장 지침은 별도의 데이터 스토어를 두고 여기에서 검색을 위한 데이터를 추출하여 Elasticsearch로 옮기는 것이었습니다. 그 이유는 데이터가 소실될 경우에 주 저장소에서 인덱스를 항상 간단하게 재구축할 수 있으며 모든 문제가 해결되기 때문이었습니다. 이는 물론 Elasticsearch에 내재된 일부 오류 복원 기능에 관한 문제들을 제기한 악명높은 Call Me Maybe 기사 가 발표되기 전이었습니다. 개발자 팀은 이에 대해 명민하게 대응했으며 현재의 최신 릴리스인 1.5.x에서는 대부분의 문제가 해결되었습니다. 곧 출시될 2.0 릴리스는 향상에 관해 더욱 개선된 오류 복원 기능을 제공할 것을 약속합니다.

우리가 Elasticsearch를 저장소 레이어로 결정한 이유는 매우 간단합니다.

  • Elasticsearch가 제공하는 것과 같은 고급 실시간 쿼리 기능을 갖춘 단순하고 확장 가능한 데이터 저장 솔루션이 필요했습니다.
  • 이 점을 토대로 실시간 보고, 검색 및 기타 기능을 제공하는 쿼리 기능에 매우 의존했는데, 이는 Elasticsearch가 작동을 중단하면 우리의 주 데이터 저장소가 무엇인지에 관계 없이 Inbot을 사용하지 못하게 된다는 의미였습니다.
  • Elasticsearch가 작동을 중단하는 경우에는 기존에 가지고 있는 유효한 데이터 소스로부터 재구축해야 합니다. 백업인지, 아니면 가동중인 데이터베이스인지는 그다지 중요하지 않습니다. 재구축되기 전까지는 Inbot을 사용할 수 없습니다.
  • 별도의 데이터베이스를 두고 Elasticsearch와 지속적으로 동기화하는 방법은 아키텍처의 지연 시간과 복잡성을 증가시킵니다.
  • Elasticsearch는 높은 확장성과 가용성에 기반을 두고 설계되었습니다. 따라서 우수한 백업 전략이 확립되어 있다면 클러스터의 작동 중단은 드물게 발생하며 복구가 가능합니다. Inbot은 JSON 형식의 원시 데이터를 하루에 수차례 백업하므로 작동 중단이 발생해도 모든 데이터를 다시 인덱싱하는 것만으로 간단하게 복구가 가능합니다.

2014년 11월에 출시된 개선된 Inbot 플랫폼은 CRM 도메인의 연락처, 의견, 사람, 팀, 고객 계정, 거래, 변환 및 기타 비즈니스 요소들을 명시한 문서를 저장합니다. 일반적인 사용자는 각각 수천 개의 연락처, 수만에서 심지어는 수십만 개에 이르는 활동 정보, 거래 이력이 있는 수백 명의 고객과 잠재 고객을 가집니다. 이 모든 데이터는 보고 및 쿼리 작성에 용이하도록 Elasticsearch에 저장됩니다.

CRM에 Elasticsearch 사용하기

Inbot 앱의 수많은 기능들은 Elasticsearch의 직접적인 기능으로 구현되었습니다. 이 앱의 핵심 기능은 사용자의 최근 활동을 토대로 연관있는 연락처와 고객 계정을 하이라이트하는 것입니다. 이 기능은 검색 결과의 순위를 결정하는 데 사용되는 기능 점수 쿼리(예: 이름별 연락처 검색)를 통해 구동됩니다. 점수 결정 기능은 사용자의 최근 활동에 대해 가장 연관성이 높은 연락처를 계산하는 aggregation 쿼리에 기반합니다. 따라서 경험상 사용자에 대해 가장 연관성이 높은 연락처가 항상 하이라이트됩니다. 검색 시 사용자는 1개 또는 2개의 문자 검색으로 가장 관심있는 사람을 찾을 수 있습니다. 드물게 연락하는 사람들은 순위가 낮기 때문입니다.

Inbot에 구현된 대부분의 CRM 기능은 애플리케이션에 통합되어 있는 메모 기능을 통해 액세스할 수 있습니다. 사용자 서로 간 또는 자신의 계정과 연락처에 메모를 남길 수 있습니다. 이 메모는 해시(#) 태그, at(@) 태그 및 기타 메타데이터를 포함할 수 있습니다. 이는 사용자가 해시 태그로 연락처 그룹을 지정할 수 있는 편리한 메커니즘을 제공합니다.

Inbot은 영업 파이프라인을 관리하기 위해 태그를 사용하기도 합니다. 사용자는 자신의 영업 기회를 설계하고 특정 단계에 관련된 #prospect 또는 #sale 등의 해시 태그를 고를 수 있습니다. 사용자가 거래 단계 태그나 기타 태그를 선택할 수 있도록 연락처를 검색하거나 메모를 남길 때 context suggester를 사용합니다.

모든 사용자 데이터는 Elasticsearch에 저장되고 바로 인덱싱되므로, 보고서 및 분석을 제공하는 것은 간편하게 aggregation 쿼리를 실행하고 결과를 제시하기만 하면 됩니다. CRM 보고서는 팀 구성원, 거래 단계 및 기간별로 분할된 활동을 포함합니다. 예를 들어 1월에 얼마나 많은 거래가 종결되었는지, 얼마나 많은 거래가 전망에서 제안 단계로 이동했는지, 5월의 영업 예측은 어떠한지 등은 모두 Elasticsearch의 Inbot 데이터 저장소에서 답변할 수 있는 질문들입니다.

전망

Inbot은 올해 초부터 iOS 스토어에서 판매되고 있습니다. 현재 우리는 최초 고객들을 지원하고 더 많은 기능들을 추가하기 위해 매우 분주합니다. 우리는 과감하게 Elasticsearch를 선택했으며 이는 매우 성공적인 결정이었습니다. Elasticsearch에 저장 중인 사용자 수, 연락처, 활동은 빠르게 성장하고 있습니다. 지금까지 성능은 계획과 예상에 부합하여 실행되고 있습니다. Elasticsearch는 밀리초 내에 대부분의 쿼리에 응답합니다. 일반적인 API 요청은 50-100 ms 미만으로 원활하게 처리됩니다.

전반적으로 우리는 Elasticsearch과 그 우수한 성능, 그리고 발전에 매우 만족하고 있습니다. 우리가 Elasticsearch를 사용하기 시작한 이후 발매된 대부분의 버전들은 우리가 사용하게 된 새로 향상된 기능들과 오류 복구에 대한 개선 사항들을 포함하고 있습니다.