# C++
::: 팁
GitHub (opens new window)에서 C++ SDK의 소스 코드를 얻을 수 있습니다.
C++ SDK는 Mac, Windows를 지원하며, C++11 버전이 필요하고, 크기는 약 144KB입니다.
:::
최신 버전: 1.3.9
업데이트 시간: 2023-11-01
다운로드: SDK Source Code (opens new window)
# 1. SDK 구현
# 1.1 SDK 다운로드
SDK Source Code (opens new window)를 다운로드하고 압축을 풀고 나서 cpp-client/cpp 폴더로 들어갑니다.
include는 SDK의 헤더 파일이고, src는 SDK의 소스 코드 파일이며, thirdparty는 의존하는 서드 파티 라이브러리입니다.
# 1.2 의존 추가
C++ SDK가 의존하는 sqlite, curl, zlib 라이브러리는 플랫폼의 차이로 인해 라이브러리의 형식이 다릅니다. TE에서 컴파일한 라이브러리를 사용할 수 있지만, 자체적으로 컴파일한 라이브러리를 사용할 수도 있습니다.
# 1.2.1 TE에서 컴파일한 라이브러리 사용
라이브러리는 Windows의 x64 플랫폼에서 MGWin 컴파일러로 생성되며, 서드 파티 폴더 내의 컴파일된 라이브러리가 프로젝트에 구성됩니다.
(.dll은 동적 라이브러리, .lib은 정적 라이브러리)
# 1.2.2 자체 컴파일
Windows 플랫폼을 예로 들면:
curl (opens new window) 라이브러리를 다운로드하고, 압축을 풀고 난 후 winbuild 디렉토리로 변경합니다. 컴파일 명령은 다음과 같습니다. 컴파일 결과는 curl 디렉토리 builds 아래에 있습니다.
nmake /f Makefile.vc mode=static ENABLE_IDN=no
zlib (opens new window) 라이브러리를 다운로드하고, 압축을 풀고 난 후, 컴파일 명령을 실행하면, 컴파일 결과가 zlib 디렉토리에 있습니다.
nmake -f win32/Makefile.msc
sqlite (opens new window) 라이브러리를 다운로드하고, 지정된 플랫폼의 라이브러리를 선택합니다.
WARNING
커맨드 라인뿐만 아니라, Visual Studio, Clion 등의 IDE(통합 개발 환경)을 사용하여, 해당 플랫폼용 라이브러리를 생성할 수도 있습니다.
# 1.3 SDK 구현 작업
# 1.3.1 CMake를 사용한 구현
CMake를 사용하여 C++ SDK를 구현하고, cpp 폴더를 프로젝트에 복사한 후, Windows 및 Mac용 다음 구성을 CMakeLists.txt
파일에 추가합니다.
C++ 버전 설정:
set(CMAKE_CXX_STANDARD 11)
헤더 파일 임포트:
include_directories(cpp/include)
Windows 플랫폼 구성 추가:
if(WIN32)
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
include_directories(cpp/thirdparty/x64/curl/include cpp/thirdparty/x64/zlib/include cpp/thirdparty/x64/sqlite/include cpp/thirdparty/x64/openssl/include)
link_directories(cpp/thirdparty/x64/curl/lib cpp/thirdparty/x64/zlib/lib cpp/thirdparty/x64/sqlite/lib cpp/thirdparty/x64/openssl/lib)
else()
include_directories(cpp/thirdparty/x86/curl/include cpp/thirdparty/x86/zlib/include cpp/thirdparty/x86/sqlite/include cpp/thirdparty/x86/openssl/include)
link_directories(cpp/thirdparty/x86/curl/lib cpp/thirdparty/x86/zlib/lib cpp/thirdparty/x86/sqlite/lib cpp/thirdparty/x86/openssl/lib)
endif()
add_library(thinkingdata SHARED cpp/src/ta_analytics_sdk.cpp cpp/src/ta_cpp_helper.cpp cpp/src/ta_cpp_network.cpp cpp/src/ta_cpp_utils.cpp cpp/src/ta_sqlite.cpp cpp/src/ta_timer.cpp cpp/src/ta_event_task.cpp cpp/src/ta_cpp_send.cpp cpp/src/ta_json_object.cpp cpp/src/ta_cJSON.c cpp/src/ta_encrypt.cpp cpp/src/ta_calibrated_time.cpp cpp/src/ta_flush_task.cpp)
target_link_libraries(thinkingdata libcurl sqlite3 zlibwapi libssl libcrypto)
endif()
Mac 플랫폼 구성 추가:
if (CMAKE_HOST_APPLE)
find_library(COCOA Cocoa)
find_library(IOKIT IOKit)
find_package(OpenSSL REQUIRED)
include_directories(${OPENSSL_INCLUDE_DIR})
link_directories(${OPENSSL_LIBRARIES})
add_library(thinkingdata SHARED cpp/src/ta_analytics_sdk.cpp cpp/src/ta_cpp_helper.cpp cpp/src/ta_cpp_network.cpp cpp/src/ta_cpp_utils.cpp cpp/src/ta_sqlite.cpp cpp/src/ta_timer.cpp cpp/src/ta_event_task.cpp cpp/src/ta_cpp_send.cpp cpp/src/ta_json_object.cpp cpp/src/ta_cJSON.c cpp/src/ta_mac_tool.mm cpp/src/ta_encrypt.cpp cpp/src/ta_calibrated_time.cpp cpp/src/ta_flush_task.cpp)
target_link_libraries(thinkingdata curl z sqlite3 ${OPENSSL_LIBRARIES} ${COCOA} ${IOKIT})
endif()
# 1.3.2 자체 컴파일
IDE(통합 개발 환경)를 사용하여 TE 라이브러리를 스스로 컴파일할 수 있습니다. Clion을 사용하여 cpp-client를 열 경우, 프로젝트를 실행한 후 cmake-build-release 디렉토리에서 libthinkingdata라는 이름의 라이브러리를 찾을 수 있습니다. libthinkingdata 라이브러리를 프로젝트에 구성합니다.
# 1.3.3 소스 코드 사용으로 구현
1.2의 서드 파티 의존성 검사를 설정한 후, include 폴더와 src 폴더를 프로젝트에 추가합니다.
# 2. SDK 초기 설정
#include "ta_analytics_sdk.h"
#include "ta_json_object.h"
using namespace thinkingdata;
ThinkingAnalyticsAPI::Init(SERVER_URL, APPID);
파라미터 설명:
APPID
: 프로젝트의 APPID, TE 프로젝트 관리 화면에서 획득 가능- SERVER_URL: 데이터 전송 URL
- SaaS의 경우 프로젝트 관리→데이터 전송 주소에서 확인하세요
- 프라이빗 구축의 경우, 데이터 전송 주소를 지정할 수 있습니다.
# 3. 메인 기능
메인 기능을 사용하기 전에, 유저 식별 규칙을 확인해주세요;
SDK는 게스트 ID를 자동으로 생성하고 로컬에 저장됩니다; 유저가 로그인하기 전에, 게스트 ID를 신분 식별 ID로 사용합니다.
주의: 게스트 ID는 유저가 앱을 재설치할 때 리셋됩니다.
# 3.1 계정 ID 설정
유저가 로그인할 때, login
을 호출하여 유저의 계정 ID를 설정할 수 있습니다. TE 플랫폼은 계정 ID를 신분 식별 ID로 로그아웃을 호출할 때까지 유지합니다. login
을 여러 번 호출하면, 이전 계정 ID가 덮어씌워집니다.
// 유저의 로그인 고유 식별자, 데이터 추적에서 #account_id에 해당합니다. #Account_id는 현재 TE입니다.
ThinkingAnalyticsAPI::Login("TE");
Login
을 여러 번 호출할 수 있으며, 호출할 때마다 들어오는 계정 ID가 이전에 저장된 ID와 일치하는지 여부가 결정됩니다. 일치하는 경우 호출은 무시되고, 일치하지 않는 경우 이전 ID가 덮어씌워집니다.
이 방법에서는 로그인 이벤트가 전송되지 않습니다.
# 3.2 이벤트 전송
track
을 호출하여 이벤트를 전송합니다. 데이터 트래킹 정책을 미리 준비한 후에 전송해주세요. 다음은 모델 코드입니다. 예: 아이템 구매
TDJSONObject 이벤트_속성;
이벤트_속성.SetString("name1", "name1"); //문자열
이벤트_속성.SetNumber("test_number_int", 3); //숫자
이벤트_속성.SetBool("test_bool", true); //불린
이벤트_속성.SetDateTime("test_time1", time(NULL), 0); //시간
std::vectorstd::string test_list;
test_list.push_back("item11");
test_list.push_back("item21");
이벤트_속성.SetList("test_list1", test_list); //배열
ThinkingAnalyticsAPI::Track("CPP_event", 이벤트_속성);
- 이벤트 이름은 문자열 타입이며, 영문자와 숫자, "_"를 포함하며, 최대 50자입니다.
- 이벤트 속성은
TDJSONObject
타입이며, 각 요소별로 속성을 나타냅니다.- Key는 해당 속성의 이름이며 문자열 타입이고, 영문자와 숫자, "_"를 포함하며, 최대 50자입니다. TE시스템은 일괄적으로 소문자로 통일됩니다.
- Value는 해당 속성의 값이며, String, Number, Bloon, Time, object, array, list object를 지원합니다.
유저 속성은 이벤트 속성과 일치해야 합니다.
# 3.3 유저 속성 설정
일반적인 유저 속성에 대해서는, UserSet
을 사용하여 설정할 수 있으며, UserSet은 원래 값이 덮어씌워집니다. 처음에 해당 속성에 값이 없는 경우, 속성이 새로 생성됩니다. 다음은 코드 예시입니다.
TDJSONObject userProperties;
userProperties.SetString("user_name", "TA");
ThinkingAnalyticsAPI::UserSet(userProperties);
# 4. 코드 예시 요약
다음 코드 예시에 모든 작업이 포함되어 있으며, 다음 순서로 사용하는 것을 권장합니다.
#include "ta_analytics_sdk.h"
using namespace thinkingdata;
//SDK 초기화
ThinkingAnalyticsAPI::Init(SERVER_URL, APPID);
//유저가 로그인한 경우, 유저의 계정 ID를 신분 식별자로 설정할 수 있습니다.
ThinkingAnalyticsAPI::Login("TA");
//이벤트 전송
TDJSONObject 이벤트_속성;
이벤트_속성.SetString("name1", "name1");//문자열
이벤트_속성.SetNumber("test_number_int", 3);//숫자
이벤트_속성.SetBool("test_bool", true);//불린
이벤트_속성.SetDateTime("test_time1", time(NULL), 0);//시간
std::vectorstd::string test_list;
test_list.push_back("item11");
test_list.push_back("item21");
이벤트_속성.SetList("test_list1", test_list);//리스트
ThinkingAnalyticsAPI::Track("CPP_event", 이벤트_속성);;
//유저 속성 설정
TDJSONObject userProperties;
userProperties.SetString("user_name", "TA");
ThinkingAnalyticsAPI::UserSet(userProperties);