C++
최신 버전: v1.5.3
업데이트 시간: 2025-10-11
리소스 다운로드: SDK 소스 코드
1. SDK 통합
1.1 SDK 다운로드
SDK 소스 코드를 다운로드하고 압축을 해제한 후 cpp-client/cpp 폴더로 이동합니다.
include는 SDK의 헤더 파일, src는 SDK 소스 코드 파일, thirdparty는 의존하는 서드파티 라이브러리입니다.
cpp-client
├── CMakeLists.txt
├── cpp
│ ├── include
│ ├── src
│ └── thirdparty
└── main.cpp
1.2 의존성 추가
C++ SDK는 sqlite, curl, zlib, openssl 라이브러리에 의존하며, 플랫폼 특성의 차이로 라이브러리 형식도 다릅니다. ThinkingAI에서 컴파일한 라이브러리를 사용할 수도 있고, 라이브러리를 직접 컴파일할 수도 있습니다.
1.2.1 ThinkingAI에서 컴파일한 라이브러리 사용
이 라이브러리는 windows 플랫폼의 컴파일러로 생성한 라이브러리입니다. thirdparty 폴더에 있는 컴파일된 라이브러리를 프로젝트에 설정합니다. (.dll은 동적 라이브러리, .lib는 정적 라이브러리입니다)
thirdparty
├── x64
│ ├── curl
│ ├── openssl
│ ├── sqlite
│ └── zlib
└── x86
1.2.2 직접 컴파일
여기서는 Windows 플랫폼을 예로 듭니다.
curl 라이브러리 https://github.com/curl/curl/releases/tag/curl-7_61_1을 다운로드하고 압축을 해제한 후 winbuild 디렉터리로 이동하여 컴파일합니다. 컴파일 명령은 다음과 같으며, 컴파일 결과는 curl 디렉터리의 builds에 생성됩니다.
nmake /f Makefile.vc mode=static ENABLE_IDN=no
zlib 라이브러리 https://github.com/madler/zlib/releases/tag/v1.2.11을 다운로드하고 압축을 해제한 후 컴파일 명령을 실행합니다. 컴파일 결과는 zlib 디렉터리에 생성됩니다.
nmake -f win32/Makefile.msc
sqlite 라이브러리 https://www.sqlite.org/download.html을 다운로드할 때 해당 플랫폼용 라이브러리를 선택합니다.
명령줄 방식 외에도 Visual Studio, CLion 등 IDE(통합 개발 환경)를 사용하여 해당 플랫폼용 라이브러리를 생성할 수 있습니다.
openssl 라이브러리 https://github.com/openssl/openssl을 다운로드하고 해당 플랫폼용 라이브러리를 직접 컴파일합니다.
1.3 SDK 통합
1.3.1 CMake로 통합
CMake로 C++ SDK를 통합하려면 cpp 폴더를 프로젝트에 복사하고, CMakeLists.txt 파일에 Windows와 Mac용으로 각각 다음 설정을 추가합니다.
C++ 버전 설정:
set(CMAKE_CXX_STANDARD 11)
헤더 파일 포함:
include_directories(cpp/include)
Windows 플랫폼 설정 추가:
if(WIN32)
if(CMAKE_SIZEOF_VOID_P EQUAL 8) # x64 플랫폼
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() # Win32 플랫폼
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(통합 개발 환경)를 사용하여 ThinkingAI 라이브러리를 직접 컴파일할 수 있습니다
- SDK 코드를 다운로드한 후 cmakelist 파일이 있는 디렉터리로 cd합니다
- 다음 명령을 실행합니다
//windows 플랫폼에서 visual studio로 컴파일
//x86
cmake -S . -B build -G "Visual Studio 17 2022" -A Win32
//x64
cmake -S . -B build -G "Visual Studio 17 2022" -A x64
//Mac 플랫폼
// arm64 플랫폼 m1
arch -arm64 cmake -B build
arch -arm64 cmake --build build
//x86_64 플랫폼 intel
arch -x86_64 cmake -B build
arch -x86_64 cmake --build build
1.3.3 소스 코드로 통합
1.2단계의 서드파티 의존성 설정을 완료한 후 include와 src 폴더를 프로젝트에 추가합니다.
.
├── cmake-build-debug
├── cmake-build-release
├── CMakeLists.txt
├── cpp
│ ├── include
│ ├── src
│ └── thirdparty
└── main.cpp
1.3.4 ThinkingAI에서 컴파일한 라이브러리 사용
다운로드하여 압축을 해제하면 x64 및 x86 플랫폼용 dll 파일을 찾을 수 있으며, 바로 사용할 수 있습니다.
2. SDK 초기화
#include "ta_analytics_sdk.h"
#include "ta_json_object.h"
using namespace thinkingdata;
ThinkingAnalyticsAPI::Init(SERVER_URL, APPID);
파라미터 설명:
-
APPID: 프로젝트의 APPID로, AE 백엔드의 프로젝트 관리 페이지에서 확인할 수 있습니다 -
SERVER_URL: 데이터 전송 URL- 클라우드 서비스를 사용하는 경우 다음을 입력합니다: https://global-receiver-ta.thinkingdata.cn
- 프라이빗 배포 버전을 사용하는 경우 데이터 수집 주소에 도메인을 바인딩하고 HTTPS 인증서를 설정하십시오: https://데이터 수집 주소에 바인딩한 도메인
3. 자주 사용하는 기능
자주 사용하는 기능을 사용하기 전에 먼저 유저 식별 규칙을 이해하는 것을 권장합니다. SDK는 기본적으로 난수를 생성하여 게스트 ID로 사용하고, 게스트 ID를 로컬에 영구 저장합니다. 유저가 로그인하기 전에는 게스트 ID가 신원 식별 ID로 사용됩니다. 참고: 게스트 ID는 유저가 앱을 재설치하거나 디바이스를 변경하면 바뀝니다.
3.1 계정 ID 설정
유저가 로그인할 때 Login을 호출하여 유저의 계정 ID를 설정할 수 있습니다. AE 플랫폼은 계정 ID를 신원 식별 ID로 사용하며, 설정한 계정 ID는 LogOut을 호출하기 전까지 계속 유지됩니다. Login을 여러 번 호출하면 이전 계정 ID를 덮어씁니다.
// 유저의 로그인 고유 식별자로, 전송 데이터의 #account_id에 해당합니다. 이때 #account_id의 값은 TA입니다
ThinkingAnalyticsAPI::Login("TA");
Login은 여러 번 호출할 수 있습니다. 호출할 때마다 전달된 계정 ID가 이전에 저장된 ID와 같은지 확인하여, 같으면 호출을 무시하고 다르면 이전 ID를 덮어씁니다.
이 메서드는 로그인 이벤트를 전송하지 않습니다
3.2 이벤트 전송
Track을 호출하여 이벤트를 전송할 수 있습니다. 앞서 정리한 트래킹 문서에 따라 이벤트 속성과 전송 조건을 설정하는 것을 권장합니다. 여기서는 유저가 어떤 상품을 구매하는 경우를 예로 듭니다:
TDJSONObject event_properties;
event_properties.SetString("name1", "name1");//문자열
event_properties.SetNumber("test_number_int", 3);//숫자
event_properties.SetBool("test_bool", true);//bool
event_properties.SetDateTime("test_time1", time(NULL), 0);//시간
std::vector<std::string> test_list;
test_list.push_back("item11");
test_list.push_back("item21");
event_properties.SetList("test_list1", test_list);//배열
ThinkingAnalyticsAPI::Track("CPP_event", event_properties);
-
이벤트 이름은 문자열 타입이며, 영문자로 시작해야 하고 숫자, 영문자, 밑줄 "_"을 포함할 수 있으며, 최대 길이는 50자입니다.
-
이벤트 속성은
TDJSONObject타입이며, 각 요소가 하나의 속성을 나타냅니다.- 이벤트 속성
Key는 속성 이름으로 문자열 타입입니다. 영문자로 시작해야 하며 숫자, 영문자, 밑줄 "_"을 포함할 수 있고, 최대 길이는 50자이며 대소문자를 구분하지 않습니다. - 속성 값은 문자열, 숫자, 불리언, 배열, 시간 타입을 지원합니다.
- 이벤트 속성
유저 속성의 요구 사항은 이벤트 속성과 같습니다
3.3 유저 속성 설정
일반적인 유저 속성은 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 event_properties;
event_properties.SetString("name1", "name1");//문자열
event_properties.SetNumber("test_number_int", 3);//숫자
event_properties.SetBool("test_bool", true);//bool
event_properties.SetDateTime("test_time1", time(NULL), 0);//시간
std::vector<std::string> test_list;
test_list.push_back("item11");
test_list.push_back("item21");
event_properties.SetList("test_list1", test_list);//배열
ThinkingAnalyticsAPI::Track("CPP_event", event_properties);
//유저 속성 설정
TDJSONObject userProperties;
userProperties.SetString("user_name", "TA");
ThinkingAnalyticsAPI::UserSet(userProperties);

