- 마지막 업데이트
구 C++ API에서 신규 C API로 옮기기
3.4.x 이전의 C++ API(Stove::PCSDK 네임스페이스, Base_* · IAP_* · View_* 계열)로 이미 연동을 마친 게임이 3.5.0 신규 C API(Stove_* 계열)로 코드를 옮길 때 참고하는 문서예요.
신규 API로 반드시 옮겨야 하는 것은 아니에요. 3.4.x API는 계속 제공되므로, 기존 연동 코드를 그대로 두고 배포 파일만 3.5.0으로 교체해도 돼요. 이 문서는 신규 API로 코드를 변경하기로 결정한 경우에만 필요해요.
다음 순서로 읽으시면 돼요.
- 신규 API의 기본 구조를 먼저 확인해요. (1장)
- 현재 사용 중인 함수와 구조체가 무엇으로 바뀌는지 확인해요. (2장 · 3장)
- 신규 API에 없는 기능을 사용하고 있는지 확인해요. (4장)
- 코드를 변경할 때 호출 형태가 달라지는 부분을 확인해요. (5장)
1. 신규 API 기본 구조
신규 인터페이스의 규칙은 레퍼런스가이드 맨 앞의 기본 연동 안내에 정리되어 있어요. 이 장에서는 코드를 옮길 때 알아야 하는 내용만 간략하게 정리해요.
배포 파일이 하나로 줄어들어요
신규 API를 사용하면 게임과 함께 배포해야 하는 파일은 BaseSDK.dll 하나예요. 모듈마다 배포하던 IAPSDK.dll · ViewSDK.dll · PCBangSDK.dll 같은 파일은 더 이상 포함하지 않아도 돼요. 모든 기능이 하나의 바이너리에 통합되었기 때문이에요.
기존 3.4.x API로 연동한 게임은 배포 구성을 그대로 유지하세요. 바이너리가 통합된 것과 관계없이 지금까지 배포하던 모듈별 파일을 계속 포함해야 해요. 배포 파일이 하나로 줄어드는 것은 신규 API로 옮긴 경우에만 해당해요.
모듈 구분이 없어졌어요
모듈마다 초기화하던 절차가 사라졌어요. Stove_Initialize 를 한 번 호출하면 결제 · 팝업 · PC방 · 로그 기능을 모두 사용할 수 있고, 종료할 때도 Stove_Uninitialize 하나만 호출해요.
함수 이름에서도 모듈 이름이 제거되었어요. 접두사는 Stove_ 하나로 통일되었어요.
Base_GetUser -> Stove_GetUser
IAP_StartPurchase -> Stove_StartPurchase
View_AutoPopup -> Stove_AutoPopup
구조체 대신 인터페이스 포인터를 사용해요
구 API는 값 구조체(StovePCUser 등)를 직접 선언해서 주고받았어요. 신규 API는 모든 객체를 IStove* 포인터로 다루고, 값은 접근자로 조회해요.
// 구 C++
StovePCUser user;
Base_GetUser(&user);
const wchar_t* nickname = user.GetNickname();
신규 API의 접근자는 C 함수와 C++ 메서드 두 가지 형태로 제공되며, 두 형태의 동작은 완전히 같아요. 프로젝트 환경에 맞는 형태를 선택하시면 돼요.
IStoveUser* user = nullptr;
Stove_GetUser(&user);
const wchar_t* nickName = Stove_IStoveUser_GetNickName(user);
C 함수의 이름은 Stove_<인터페이스>_<멤버> 형태로 규칙이 일정해요. SDK 함수(Stove_GetUser 등)는 자유 함수이므로 두 형태에서 호출 방법이 같아요.
파라미터도 객체로 생성해요
호출에 전달하는 파라미터도 구조체를 선언하는 방식이 아니라 팩토리 패턴으로 생성해요. 어떤 파라미터를 생성할지는 EStove<모듈>TypeKind 값으로 지정해요.
IStoveInitializeParam* initParam =
(IStoveInitializeParam*)Stove_CreateParam(k_EStoveBaseTypeKind_InitializeParam);
Stove_IStoveInitializeParam_SetShopKey(initParam, L"YOUR_SHOP_KEY");
전달받은 객체는 해제해야 해요
SDK가 생성한 객체는 사용을 마친 뒤에 해제해요. 해제해야 하는 객체인지는 ShouldDestroy 로 판단해요.
if (Stove_IStoveTypeBase_ShouldDestroy(obj))
Stove_IStoveTypeBase_Destroy(obj);
구 API에는 없던 규칙이므로 코드를 옮길 때 가장 자주 누락되는 부분이에요. 자세한 내용은 5장에서 설명해요.
C와 C++ 두 형태로 제공해요
헤더는 모듈마다 네 가지로 나뉘며, 전체를 한 줄로 포함할 수 있는 stove_api.h 도 함께 제공돼요. 단일 바이너리라서 모든 모듈의 헤더가 BaseSDK/Public/C/ 한 폴더에 함께 들어 있어요.
배포 패키지에는 파트너스 게임에서 쓸 수 없는 모듈의 헤더도 함께 들어 있어요. 소유권(
ownership_*)과 통계·업적(game_support_*)은 스토어인디 게임 전용이에요.stove_api.h로 한 번에 포함하면 이 헤더들도 따라 들어오지만, 파트너스 게임에서는 제공되지 않는 기능이니 호출하지 마세요. 헤더가 있다고 해서 쓸 수 있는 기능은 아니에요.
| 헤더 | 역할 |
|---|---|
<module>_api.h | SDK 함수 선언 (Stove_Initialize 등) |
<module>_types.h | 인터페이스 정의. C++ 환경에서는 순수 가상 함수, C 환경에서는 불투명 타입이에요 |
<module>_flat_api.h | 인터페이스 멤버에 접근하는 C 함수 (Stove_<인터페이스>_<멤버>) |
<module>_misc.h | 열거형 정의 |
2. 함수 대응
초기화와 종료
모듈별 초기화 · 종료 · 버전 조회 함수는 신규 API에 없어요. 세 개의 함수로 통합되었어요.
| 구 C++ | 신규 C | 변경된 내용 |
|---|---|---|
Base_Initialize · Base_InitializeEx | Stove_Initialize | 모듈별 초기화가 사라졌어요 |
IAP_Initialize · IAP_InitializeWithWndInfo | Stove_Initialize | 창 핸들은 IStoveInitializeParam 에 설정해요 |
View_Initialize · View_InitializeWithWndInfo | Stove_Initialize | |
PCBang_Initialize · Log_Initialize · GamingServices_Initialize | Stove_Initialize | |
Base_UnInitialize 와 모듈별 *_UnInitialize | Stove_Uninitialize | 대문자 표기가 Uninitialize 로 바뀌었어요 |
Base_GetVersion 과 모듈별 *_GetVersion | Stove_GetVersion | |
Base_RestartAppIfNecessary · Base_RestartAppIfNecessaryAsync · ~AsyncEx · ~AsyncEx2 | Stove_RestartAppIfNecessary | 네 개의 함수가 하나로 통합되었어요 |
Base_RunCallback | Stove_RunCallback | |
Base_RunCallbackWithTimeout | Stove_RunCallbackWithTimeout |
사용자 정보와 환경
| 구 C++ | 신규 C |
|---|---|
Base_GetUser | Stove_GetUser |
Base_GetSignin | Stove_GetSignin |
Base_GetGds | Stove_GetGds |
Base_GetAccessToken | Stove_GetAccessToken |
Base_AccessTokenRenewed | Stove_AccessTokenRenewed |
Base_SetGameProfile | Stove_SetGameProfile |
Base_SetLanguage · Base_SetLanguageEx | Stove_SetLanguage |
Base_OpenExternalUrl | Stove_OpenExternalUrl |
규제 대응 알림
| 구 C++ | 신규 C |
|---|---|
Base_ShutdownNotification | Stove_ShutdownNotification |
Base_OverImmersionNotification | Stove_OverImmersionNotification |
Base_VietnamAgeRatingNotification | Stove_VietnamAgeRatingNotification |
Base_VietnamOverimmersionNotification | Stove_VietnamOverimmersionNotification |
결제
| 구 C++ | 신규 C | 변경된 내용 |
|---|---|---|
IAP_FetchProducts · IAP_FetchProductsEx | Stove_FetchProducts | Ex 함수가 제공하던 구매 가능 여부 코드가 기본 결과에 포함되어 있어요 |
IAP_FetchShopCategories | Stove_FetchShopCategories | |
IAP_FetchInventory | Stove_FetchInventory | |
IAP_StartPurchase · IAP_StartPurchaseEx | Stove_StartPurchase | 팝업이 닫힐 때 호출되는 콜백이 기본 인자에 포함되어 있어요 |
IAP_ConfirmPurchase | Stove_ConfirmPurchase | |
IAP_FetchTermsAgreement · IAP_FetchTermsAgreementEx | Stove_FetchTermsAgreement | |
IAP_WithdrawGame | Stove_WithdrawGame | |
IAP_CloseAllPopups | Stove_CloseAllPopups | 팝업 기능과 하나로 통합되었어요 |
팝업
| 구 C++ | 신규 C | 변경된 내용 |
|---|---|---|
View_AutoPopup · View_AutoPopupEx | Stove_AutoPopup | 팝업이 닫힐 때 호출되는 콜백이 기본 인자에 포함되어 있어요 |
View_ManualPopup · View_ManualPopupEx | Stove_ManualPopup | |
View_NewsPopup · View_NewsPopupEx | Stove_NewsPopup | |
View_CouponPopup · View_CouponPopupEx | Stove_CouponPopup | |
View_VerifyIdentificationPopup | Stove_VerifyIdentificationPopup | |
View_SetPopupDisallowed | Stove_SetPopupDisallowed | |
View_CloseAllPopups | Stove_CloseAllPopups | 결제 기능과 하나로 통합되었어요 |
PC방
| 구 C++ | 신규 C |
|---|---|
PCBang_CheckPCBangStatus | Stove_PCBangCheckStatus |
PCBang_UserLogin | Stove_PCBangLogin |
PCBang_UserLogout | Stove_PCBangLogout |
로그
| 구 C++ | 신규 C |
|---|---|
Log_Send | Stove_SendLog |
3. 구조체와 열거형 대응
공통
| 구 C++ | 신규 C | 변경된 내용 |
|---|---|---|
Result | IStoveResult | 값이 아니라 포인터예요. 사용을 마치면 해제해요 |
CallbackResult | IStoveCallbackResult | |
SDKResultCode (모듈마다 별도로 존재했어요) | EStoveCommonResultCode · EStoveResultCode | 5.6절에서 설명해요 |
SDKMethod (모듈마다 별도로 존재했어요) | EStove<모듈>MethodCode | |
| 없음 | EStove<모듈>TypeKind | 새로 추가되었어요. 객체의 구체적인 타입을 식별해요 |
| 없음 | IStoveTypeBase | 새로 추가되었어요. 모든 객체의 최상위 인터페이스이며 해제를 담당해요 |
사용자 정보와 환경
| 구 C++ | 신규 C |
|---|---|
StovePCUser | IStoveUser |
StovePCSignin | IStoveSignin |
StovePCGds | IStoveGds |
StovePCToken | IStoveAccessToken |
StovePCInitializeParam · StovePCInitializeParamEx2 | IStoveInitializeParam · IStoveRestartAppIfNecessaryParam |
StovePCGameProfile | IStoveSetGameProfileParam |
StoveLanguage | 열거형을 사용하지 않고 언어 코드 문자열을 전달해요 |
규제 대응 알림
| 구 C++ | 신규 C |
|---|---|
StovePCShutdown | IStoveShutdownInfo |
StovePCOverImmersion | IStoveOverImmersionInfo |
StovePCVietnamAgeRatingInfo | IStoveVietnamAgeRatingInfo |
StovePCVietnamOverimmersionInfo | IStoveVietnamOverimmersionInfo |
StoveOverlayState | EStoveOverlayMode |
결제
| 구 C++ | 신규 C | 변경된 내용 |
|---|---|---|
StovePCProduct · StovePCProductEx | IStoveProduct | 하나로 통합되었어요 |
| 상품 배열과 개수 | IStoveProductList | 목록을 담는 객체로 바뀌었어요 |
StovePCShopCategory | IStoveShopCategory · IStoveShopCategoryList | |
StovePCInventoryItem | IStoveInventoryItem · IStoveInventoryList | |
StovePCPurchasedProduct | IStovePurchasedProduct | |
StovePCChargeInfo | IStoveChargeInfo | |
StovePCOrderProduct | IStoveOrderProductParam | |
StovePCStartPurchaseParam | IStoveStartPurchaseParam | |
StovePCPurchaseOption | IStovePurchaseParam | |
StovePCPurchaseResult | IStoveStartPurchaseOutcome | |
StovePCFetchProductParam | IStoveFetchProductsParam | |
StovePCTermsOption | IStoveFetchTermsAgreementParam | |
| 약관 동의 결과 | IStoveTermsAgreementOutcome | 결과를 담는 객체가 새로 추가되었어요 |
| 구매 확정 요청과 결과 | IStoveConfirmPurchaseParam · IStoveConfirmPurchaseOutcome | |
StovePCWithdrawGameOption | IStoveWithdrawGameParam · IStoveWithdrawGameOutcome | |
DiscountType | EStoveDiscountType | |
ProductTypeCode | EStoveProductTypeCode | |
PurchaseLimitTypeCode | EStovePurchaseLimitTypeCode | |
PurchaseProgress | EStovePurchaseProgress | |
StovePCPurchaseOperation | EStovePurchaseOperation | |
StovePCTermsOperation | EStoveTermsOperation |
팝업
| 구 C++ | 신규 C | 변경된 내용 |
|---|---|---|
| 팝업 옵션 | IStovePopupParam | 자동 · 뉴스 · 쿠폰 팝업이 공통으로 사용해요 |
| 수동 팝업 옵션 | IStoveManualPopupParam | |
StovePCPopupDisallowed | IStoveSetPopupDisallowedParam | |
| 본인 인증 팝업 옵션 | IStoveVerifyIdentificationPopupParam · IStoveVerifyIdentificationPopupDestroyInfo | |
| 웹뷰 위치와 크기 필드 | IStoveWebViewLayoutParam | 웹뷰를 사용하는 파라미터가 공통으로 사용해요 |
WebViewMode | EStoveWebViewMode |
PC방과 로그
| 구 C++ | 신규 C |
|---|---|
StovePCBangStatus | IStovePCBangStatus |
StovePCBangUserLogin | IStovePCBangLoginOutcome |
StovePCRefreshUserBenefits | IStovePCBangBenefitInfo |
PCBangPremium | EStovePCBangPremium |
StovePCLogSendParam | IStoveSendLogParam |
4. 신규 API에 없는 기능
다음 항목은 신규 C API에 대응하는 함수와 구조체가 없어요. 해당 기능을 사용하고 있다면 코드를 옮기기 전에 대체 방법을 먼저 결정해야 해요.
함수
| 구 C++ | 안내 |
|---|---|
Base_GetShutdown | 값을 직접 조회하지 않고 Stove_ShutdownNotification 콜백으로 전달받아요 |
Base_GetOverImmersion | Stove_OverImmersionNotification 콜백으로 전달받아요 |
Base_GetRenewToken | Stove_AccessTokenRenewed 콜백으로 전달받아요 |
Base_GetTraceHint | 대응하는 함수가 없어요. 기존에도 폐기 예정이던 기능이에요 |
IAP_StartPayment · IAP_StartPaymentEx | 결제는 Stove_StartPurchase 로 통합하여 진행해요 |
IAP_FetchVoidedPurchases · IAP_FetchVoidedPurchasesEx | 대응하는 함수가 없어요. 기존에도 폐기 예정이던 기능이에요 |
View_FetchWebOpenKey | 대응하는 함수가 없어요. 기존에도 폐기 예정이던 기능이에요 |
GamingServices_FetchCharacter | 에픽세븐과 같은 특정 개발사 전용 인터페이스이며 앞으로 폐기될 예정이므로 신규 인터페이스에서 제공하지 않아요. 이 기능이 필요하다면 기존 C++ 인터페이스를 그대로 사용하시거나 플랫폼 API를 직접 호출하는 방식으로 변경하셔야 해요 |
구조체와 열거형
| 구 C++ | 안내 |
|---|---|
StovePCTraceHint | Base_GetTraceHint 와 함께 제거되었어요 |
StovePCVoidedPurchase · StovePCVoidedPurchasesEx · StovePCVoidedPurchasesMarketType | 환불 내역 조회 기능과 함께 제거되었어요 |
StovePCPaymentOption · StovePCPaymentOperation | IAP_StartPayment 와 함께 제거되었어요 |
CloseButtonType | 대응하는 열거형이 없어요. 기존에도 폐기 예정이던 기능이에요 |
배포에는 들어 있지만 파트너스 게임에서 쓸 수 없는 함수
아래 함수는 신규 API에 있고 헤더에도 선언되어 있지만 스토어인디 게임 전용이에요. 파트너스 게임에는 제공되지 않으니 코드를 옮길 때 그냥 넘어가세요. 구 API에서도 이 기능은 파트너스 게임에 제공되지 않았어요.
| 신규 API | 구 API | 기능 |
|---|---|---|
Stove_FetchOwnerships | Ownership_OwnershipList | 소유권 조회 |
Stove_FetchAchievement · Stove_FetchAchievements | GameSupport_Achievement · GameSupport_AllAchievement | 업적 조회 |
Stove_FetchStat · Stove_SetStat | GameSupport_Stat · GameSupport_ModifyStat | 통계 조회와 수정 |
Stove_FetchRanking | GameSupport_Rank | 리더보드 조회 |
Stove_GetCloudSavingPath | Base_GetCloudSavingPath | 클라우드 세이브 경로 조회 |
stove_api.h 로 헤더를 한 번에 포함하면 위 함수의 선언도 따라 들어와요. 편집기 자동 완성 목록에 보이더라도 호출하지 마세요.
없어진 방식
Ex·Ex2확장 함수: 신규 API는 확장 함수를 별도로 제공하지 않아요. 기존Ex계열이 담당하던 기능, 즉 팝업이 닫힐 때 호출되는 콜백과 추가된 응답 필드, 확장된 파라미터는 모두 기본 함수 하나에 포함되어 있어요.- 모듈별 초기화: 결제나 팝업 기능을 사용하기 위해 모듈을 개별적으로 초기화하던 절차가 없어졌어요.
- 모듈별 결과 코드: 모듈마다 존재하던
SDKResultCode가 공통 코드와 기능별 코드 두 가지로 정리되었어요.
5. 코드를 변경할 때 달라지는 부분
이름만 바꾸면 빌드되지 않아요. 호출 형태가 함께 바뀌기 때문이에요. 다음 여섯 가지가 실제로 코드를 수정해야 하는 부분이에요.
5.1 동기 함수는 결과를 포인터로 반환해요
구 API는 Result 값을 반환했고, 결과 구조체는 호출하는 쪽에서 선언하여 주소를 전달했어요. 신규 API는 IStoveResult* 를 반환하고, 결과 객체는 이중 포인터로 전달받아요.
// 구 C++
StovePCUser user;
Result result = Base_GetUser(&user);
if (result.IsSuccessful())
{
const wchar_t* nickname = user.GetNickname();
}
IStoveUser* user = nullptr;
IStoveResult* result = Stove_GetUser(&user);
if (Stove_IStoveResult_IsSuccessful(result))
{
const wchar_t* nickName = Stove_IStoveUser_GetNickName(user);
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)user);
}
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)result);
- 성공 여부는
IsSuccessful()로 확인해요.try-catch는 사용하지 않아요. - 결과 코드는
GetResultCode()로 확인하고, 어느 함수가 생성한 결과인지는GetMethodCode()로 확인해요.
5.2 전달받은 객체는 해제해요
구 API의 값 구조체는 범위를 벗어나면 자동으로 정리되었어요. 신규 API에서 SDK가 생성한 객체는 호출하는 쪽에서 해제해야 해요.
if (Stove_IStoveTypeBase_ShouldDestroy(obj))
Stove_IStoveTypeBase_Destroy(obj);
- 반환받은
IStoveResult*는 해제해요. Stove_CreateParam()으로 생성한 파라미터도 호출이 끝나면 해제해요.- 콜백으로 전달받은 객체는 각 문서의 메모리 관리 표를 확인하세요. SDK가 소유하고 있어서 해제하면 안 되는 객체도 있어요.
- 문서에서 확인하기 어렵다면 위와 같이
ShouldDestroy로 판단할 수 있어요.
5.3 파라미터는 팩토리 패턴으로 생성해요
// 구 C++
StovePCInitializeParam initParam;
initParam.SetShopKey(L"YOUR_SHOP_KEY");
Base_Initialize(&initParam, OnInitializeFinished);
IStoveInitializeParam* initParam =
(IStoveInitializeParam*)Stove_CreateParam(k_EStoveBaseTypeKind_InitializeParam);
Stove_IStoveInitializeParam_SetShopKey(initParam, L"YOUR_SHOP_KEY");
IStoveResult* result = Stove_Initialize(initParam);
// 결과를 확인합니다.
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)result);
Stove_IStoveTypeBase_Destroy((IStoveTypeBase*)initParam);
Stove_CreateParam() 에 전달하는 값은 생성하려는 파라미터의 TypeKind 이에요. 어떤 값을 전달해야 하는지는 각 파라미터 문서에 기재되어 있어요.
5.4 초기화 흐름이 짧아져요
구 C++ : Base_RestartAppIfNecessaryAsync -> Base_Initialize
-> IAP_Initialize -> View_Initialize -> PCBang_Initialize -> Log_Initialize
신규 C : Stove_RestartAppIfNecessary -> Stove_Initialize
- 모듈별 초기화 호출을 모두 제거해요. 남겨 두면 빌드되지 않아요.
- 종료할 때도
Stove_Uninitialize를 한 번만 호출해요. 표기가UnInitialize에서Uninitialize로 바뀐 점에 주의하세요. Stove_Initialize는 동기 함수예요. 완료 콜백을 기다리지 않고 반환값으로 성공 여부를 바로 확인해요.
5.5 콜백에 사용자 데이터 인자를 함께 넘겨요
비동기 함수는 콜백과 함께 void* userData 를 전달받아요. 콜백에서 게임 쪽 객체를 다시 찾아야 할 때 전역 변수 대신 이 값을 사용할 수 있어요.
구 C++ API(IAP_* · View_* 계열)에는 이 인자가 없어요. 다만 그보다 앞선 StoveAPI_* 벌에는 같은 방식이 있었으므로, StoveAPI_StartPurchaseEx 처럼 userData 를 넘기던 코드에서 옮겨 온다면 새로운 방식이 아니에요.
// 구 C++
void IAP_StartPurchase(const StovePCStartPurchaseParam* params,
OnStartPurchaseFinished onFinished);
// 신규 C
void Stove_StartPurchase(const IStoveStartPurchaseParam* params,
OnStartPurchaseCallback onFinished,
OnIAPPopupDestroyCallback onDestroy,
void* userData1, void* userData2);
- SDK 함수는 자유 함수이므로 C 환경과 C++ 환경에서 선언이 같아요.
- 팝업을 여는 함수는 완료 콜백과 팝업이 닫힐 때 호출되는 콜백을 함께 전달받아요. 구 API에서
Ex함수를 사용하던 부분이 여기에 해당해요. - 닫힘 콜백이 필요하지 않으면
nullptr을 전달해요. - 콜백이 실행되는 시점은 이전과 같아요.
Stove_RunCallback()을 호출한 스레드에서 실행되므로 게임 루프에서 계속 호출해야 해요.
5.6 결과 코드 체계가 바뀌었어요
구 API는 모듈마다 SDKResultCode 를 별도로 두었어요. 신규 API는 두 가지로 정리되었어요.
| 범위 | 열거형 | 포함하는 코드 |
|---|---|---|
| 0 ~ 299 | EStoveCommonResultCode | 모든 기능이 공통으로 사용하는 코드 |
| 300 이상 | EStoveResultCode | 기능별로 구분되는 코드 |
- 값을 숫자로 비교하는 코드가 있다면 새 열거형과 하나씩 대조하세요. 같은 숫자가 다른 의미일 수 있어요.
- 열거형 값의 이름은
k_E<열거형><값>형태예요. 성공은k_EStoveCommonResultCode_Success이에요. - 사용자에게 안내 화면을 표시해야 하는 코드인지는 각 결과 코드 문서의 표에서 확인할 수 있어요.
6. 옮기는 순서
한 번에 전부 변경하기보다 다음 순서로 나누어 진행하면 중간에 동작을 확인하기 쉽어요.
- 헤더와 링커 설정을 먼저 교체해요. 구 API 헤더를 제거하고 신규 API 헤더로 바꾸는 작업이며, 6.1절에서 자세히 설명해요.
- 초기화와 종료를 변경해요. 모듈별 초기화를 제거하고
Stove_Initialize·Stove_Uninitialize로 정리한 뒤에 게임이 실행되는지 확인해요. - 동기 조회 함수를 변경해요.
Stove_GetUser·Stove_GetGds처럼 값을 바로 반환받는 함수부터 옮기면서 객체를 해제하는 규칙에 익숙해져요. - 비동기 함수를 변경해요. 결제 · 팝업 · PC방처럼 콜백을 사용하는 기능을 옮겨요.
Ex함수를 사용하던 부분은 닫힘 콜백 인자로 정리해요. - 결과 코드 분기를 점검해요. 숫자로 비교하던 부분과 모듈별 코드를 사용하던 부분을 새 열거형으로 변경해요.
- 배포 구성을 정리해요. 모듈별 파일을 제외하고
BaseSDK.dll하나만 포함하도록 변경해요. - 4장을 다시 확인해요. 대체 방법이 필요한 기능이 남아 있는지 마지막으로 점검해요.
6.1 헤더 교체와 include 문 변경
구 API의 헤더는 배포 패키지의 Include 폴더에 모듈마다 하나씩 들어 있고, 열거형과 구조체, 콜백 선언은 Include/Misc 폴더에 들어 있어요. 신규 API의 헤더는 BaseSDK/Public/C 한 폴더에 모듈마다 네 종류씩 들어 있어요.
| 구분 | 구 API | 신규 API |
|---|---|---|
| 헤더 위치 | {SDK_Root}/Include/ 와 {SDK_Root}/Include/Misc/ | BaseSDK/Public/C/ 한 폴더 |
| 모듈 헤더 | BaseSDK.h · IAPSDK.h · ViewSDK.h · PCBangSDK.h · LogSDK.h | base_api.h · iap_api.h · view_api.h · pcbang_api.h · log_api.h (모듈마다 네 종류) |
| 통합 헤더 | 없어요 | stove_api.h |
프로젝트 설정에서 구 API의 헤더 경로를 제거하고 신규 API의 헤더 경로를 포함 디렉터리에 추가한 뒤에, 소스의 include 문을 바꿔요.
// 구 C++
#include "BaseSDK.h"
#include "IAPSDK.h"
#include "ViewSDK.h"
#include "PCBangSDK.h"
가장 간단한 방법은 통합 헤더 한 줄로 바꾸는 것이에요. 모든 모듈의 네 종류 헤더가 함께 포함되므로 C 접근자도 바로 사용할 수 있어요.
// 신규: 통합 헤더 한 줄로 모든 모듈을 포함합니다.
#include "stove_api.h"
필요한 모듈만 선택해서 포함할 수도 있어요. 이때 C 환경에서 인터페이스 멤버에 접근하려면 <module>_flat_api.h 를 함께 포함해야 해요.
// 신규: 모듈을 선택해서 포함하는 경우
#include "base_api.h"
#include "base_flat_api.h"
#include "iap_api.h"
#include "iap_flat_api.h"
#include "view_api.h"
#include "view_flat_api.h"
<module>_api.h는<module>_types.h를,<module>_types.h는<module>_misc.h를 포함해요. 따라서 열거형과 구조체 헤더를 따로 추가하지 않아도 돼요.- C++ 메서드 형태만 사용한다면
<module>_flat_api.h는 포함하지 않아도 돼요. - 구 API의
Include/Misc아래 헤더를 직접 포함하던 코드가 있다면 함께 제거해요. 신규 API에는 같은 이름의 헤더가 없어요. - 링커의 추가 종속성에 모듈별 lib 파일을 나열해 두었다면 배포 패키지의
Lib폴더 구성에 맞추어 정리해요. 게임과 함께 배포하는 바이너리는BaseSDK.dll하나예요.
부록. 결과 코드 대응표
구 API는 모듈마다 결과 코드를 따로 두어서 같은 번호가 모듈에 따라 다른 뜻이었어요. 예를 들어 80 은 공통 기능에서는 언어 미설정, 결제와 팝업에서는 UI 미초기화, 로그에서는 작업 디렉터리 생성 실패였어요. 신규 API는 번호 하나가 한 가지 뜻만 가지도록 정리했어요.
번호가 그대로인 코드
아래 코드는 번호가 바뀌지 않았어요. 이름 표기만 대문자 밑줄에서 파스칼 표기로 달라졌어요.
| 코드 | 구 이름 | 신규 이름 |
|---|---|---|
| 0 | SUCCESS | Success |
| 1 | FAIL | Fail |
| 2 | INVALID_CONFIG | InvalidConfig |
| 3 | INVALID_LOG_LEVEL | InvalidLogLevel |
| 4 | INVALID_LOG_PATH | InvalidLogPath |
| 5 | INVALID_PARAM | InvalidParam |
| 16 | BASE_NOT_INITIALIZED | BaseNotInitialized |
| 17 | NOT_INITIALIZED | NotInitialized |
| 18 | ALREADY_INITIALIZED | AlreadyInitialized |
| 19 | INVALID_ACCESS_TOKEN | InvalidAccessToken |
| 20 | NULL_TOKEN_ENTITY | NullTokenEntity |
| 21 | NULL_ENTITY | NullEntity |
| 22 | HTTP_ERROR | HttpError |
| 23 | RESPONSE_ERROR | ResponseError |
| 24 | RESPONSE_INVALID_CODE | ResponseInvalidCode |
| 25 | RESPONSE_VALUE_IS_NULL | ResponseValueIsNull |
| 26 | RESPONSE_INVALID_VALUE_FORMAT | ResponseInvalidValueFormat |
| 29 | ASYNC_OPERATION_IN_PROGRESS | AsyncOperationInProgress |
| 30 | BASE_UNINITIALIZED | BaseUninitialized |
| 31 | NOT_SUPPORTED_COUNTRY | NotSupportedCountry |
| 251 | PCSDK_DLL_NOT_FOUND | PcsdkDllNotFound |
| 252 | NOT_IMPLEMENTED | NotImplemented |
| 253 | UNMANAGED_EXCEPTION | UnmanagedException |
| 254 | MANAGED_EXCEPTION | ManagedException |
| 255 | UNKNOWN_ERROR | UnknownError |
번호가 바뀐 코드
공통 기능(Base)
| 구 코드 | 구 이름 | 신규 코드 | 신규 이름 |
|---|---|---|---|
| 80 | LANGUAGE_NOT_SET | 300 | LanguageNotSet |
| 81 | EMPTY_TRANSLATED_STRING | 301 | EmptyTranslatedString |
| 82 | NOT_FOUND_REQUIRED_INFORMATION | 302 | NotFoundRequiredInformation |
| 83 | INVALID_GDS_INFO | 303 | InvalidGdsInfo |
| 84 | NEED_STOVE_LAUNCHER | 304 | NeedStoveLauncher |
| 85 | LAUNCHER_FAILED_CREATE_REQUIRED | 305 | LauncherFailedCreateRequired |
| 86 | RENEW_TOKEN_MAX_RETRY_COUNT_EXCEEDED | 306 | RenewTokenMaxRetryCountExceeded |
| 87 | IPC_CONNECT_FAILED | 307 | IpcConnectFailed |
| 88 | IPC_AES_KEY_NOT_RECEIVED | 308 | IpcAesKeyNotReceived |
| 89 | IPC_TIMEOUT | 309 | IpcTimeout |
| 90 | CLOSE_ALL_POPUPS_FAILED | 68 | CloseAllPopupsFailed |
| 91 | LOCAL_DB_CREATE_WORKING_DIRECTORY_FAILED | 40 | LocalDbCreateWorkingDirectoryFailed |
| 92 | LOCAL_DB_CONNECT_FAILED | 41 | LocalDbConnectFailed |
| 93 | LOCAL_DB_CREATE_TABLE_FAILED | 42 | LocalDbCreateTableFailed |
결제(IAP)
| 구 코드 | 구 이름 | 신규 코드 | 신규 이름 |
|---|---|---|---|
| 80 | VIEWUI_NOT_INITIALIZED | 60 | ViewUiNotInitialized |
| 81 | VIEWUI_UNINIT_FAILED | 61 | ViewUiUninitFailed |
| 82 | WEBVIEW_CREATE_FAIL | 62 | WebviewCreateFail |
| 83 | WEBVIEW_LOAD_URL_FAIL | 63 | WebviewLoadUrlFail |
| 84 | WEBVIEW_CLOSED_BEFORE_PURCHASE | 34 | WebviewClosedBeforeComplete |
| 85 | PARAMETER_LENGTH_EXCEEDED | 80 | ParameterLengthExceeded |
| 86 | INVALID_JSON_STRING | 81 | InvalidJsonString |
| 87 | WEBVIEW_CREATE_COOKIE_FAIL | 64 | WebviewCreateCookieFail |
| 88 | INVALID_ORDER_PRODUCT_INFORMATION | 503 | InvalidOrderProductInformation |
| 89 | WEBVIEW_CLOSE_ALL_FAIL | 65 | WebviewCloseAllFail |
| 90 | WEBVIEW_CLOSE_FAIL | 66 | WebviewCloseFail |
팝업(View)
| 구 코드 | 구 이름 | 신규 코드 | 신규 이름 |
|---|---|---|---|
| 80 | VIEWUI_NOT_INITIALIZED | 60 | ViewUiNotInitialized |
| 81 | VIEWUI_UNINIT_FAILED | 61 | ViewUiUninitFailed |
| 82 | WEBVIEW_CREATE_FAIL | 62 | WebviewCreateFail |
| 83 | WEBVIEW_LOAD_URL_FAIL | 63 | WebviewLoadUrlFail |
| 84 | WEBVIEW_CLOSE_ALL_FAIL | 65 | WebviewCloseAllFail |
| 85 | WEBVIEW_CLOSE_FAIL | 66 | WebviewCloseFail |
| 86 | WEBVIEW_CREATE_COOKIE_FAIL | 64 | WebviewCreateCookieFail |
| 87 | NO_POPUP_DATA | 67 | NoPopupData |
로그(Log)
| 구 코드 | 구 이름 | 신규 코드 | 신규 이름 |
|---|---|---|---|
| 80 | LOCAL_DB_CREATE_WORKING_DIRECTORY_FAILED | 40 | LocalDbCreateWorkingDirectoryFailed |
| 81 | LOCAL_DB_CONNECT_FAILED | 41 | LocalDbConnectFailed |
| 82 | LOCAL_DB_CREATE_TABLE_FAILED | 42 | LocalDbCreateTableFailed |
| 83 | LOCAL_DB_DISCONNECT_FAILED | 43 | LocalDbDisconnectFailed |
| 86 | LOG_SIZE_EXCEEDED | 82 | PayloadSizeExceeded |
신규 API에는 반영되지 않은 구 API 코드
| 구 코드 | 구 이름 | 안내 |
|---|---|---|
| 27 | LOG_81PLUG_ERROR | 내부 지표 전송용 코드예요. 신규 API에서는 제공하지 않아요 |
| 28 | UPDATE_81PLUG_FEED_ERROR | 내부 지표 전송용 코드예요. 신규 API에서는 제공하지 않아요 |
| 32 | AMPLITUDE_ERROR | 내부 지표 전송용 코드예요. 신규 API에서는 제공하지 않아요 |
| 250 | JSON_EXCEPTION | 내부 처리용 코드예요. 신규 API에서는 제공하지 않아요 |
| 84 | LOCAL_DB_BACKUP_LOG_FAILED | 로그 백업 실패 코드예요. 신규 API에는 짝이 되는 코드가 없어요 |
| 85 | INVALID_LOG_PARAMETER | 로그 파라미터 검증 코드예요. 신규 API에서는 5 InvalidParam 으로 전달돼요 |
결과 코드는
IsSuccessful()로 성공 여부를 먼저 확인하고, 실패일 때만 코드를 확인하세요. 번호를 그대로 비교하던 코드가 있다면 위 표로 하나씩 대조해야 해요.