Skip to content

getBalance() 메소드에서 GetBalanceResponse 객체 미생성으로 인한 TypeError 발생 #26

@jin123457

Description

@jin123457

문제 설명

SolapiMessageService::getBalance() 메소드 호출 시 fatal TypeError가 발생합니다.

메소드의 반환 타입이 ?GetBalanceResponse로 선언되어 있지만, 내부적으로 Fetcher::request()가 반환한 stdClass 인스턴스를 GetBalanceResponse 객체로 감싸지 않고 그대로 반환하고 있습니다.

이로 인해 PHP 7.1 이상 환경(반환 타입 선언이 강제되는 환경)에서 getBalance()를 호출하면 항상 fatal error가 발생합니다.

환경 정보

  • SDK 버전: 5.1.2 (최신)
  • PHP 버전: 8.2.20
  • 설치 방식: composer require solapi/sdk

재현 방법

<?php
require_once 'vendor/autoload.php';

use Nurigo\Solapi\Services\SolapiMessageService;

$service = new SolapiMessageService('YOUR_API_KEY', 'YOUR_API_SECRET');
$balance = $service->getBalance();  // 여기서 TypeError 발생

에러 스택 트레이스

Fatal error: Uncaught TypeError: Nurigo\Solapi\Services\SolapiMessageService::getBalance(): 
Return value must be of type ?Nurigo\Solapi\Models\Response\GetBalanceResponse, 
stdClass returned in /vendor/solapi/sdk/src/Services/SolapiMessageService.php:184
Stack trace:
#0 check.php(96): Nurigo\Solapi\Services\SolapiMessageService->getBalance()
#1 {main}
  thrown in /vendor/solapi/sdk/src/Services/SolapiMessageService.php on line 184

원인 분석

src/Services/SolapiMessageService.php 파일의 181~188줄을 보면, getBalance() 메소드가 Fetcher::request()의 원시 반환값을 GetBalanceResponse 객체로 감싸지 않고 그대로 반환하고 있습니다.

public function getBalance(): ?GetBalanceResponse
{
    try {
        return $this->fetcherInstance->request("GET", "/cash/v1/balance");
    } catch (Exception $exception) {
        return null;
    }
}

비교를 위해 같은 파일 내의 getMessages() 메소드(109~117줄)를 보면, 응답 모델 객체로 정상적으로 감싸서 반환하고 있는 것을 확인할 수 있습니다.

public function getMessages(?GetMessagesRequest $parameter = null): ?GetMessagesResponse
{
    try {
        $result = $this->fetcherInstance->request("GET", "/messages/v4/list", $parameter);
        return new GetMessagesResponse($result);  // ← 정상적으로 객체 생성
    } catch (Exception $exception) {
        return null;
    }
}

getMessages()를 비롯한 다른 조회 메소드들(getGroups(), getStatistics() 등)과 일관성 있게 처리하지 못한 것으로 보입니다.

수정 제안

public function getBalance(): ?GetBalanceResponse
{
    try {
        $result = $this->fetcherInstance->request("GET", "/cash/v1/balance");
        if ($result === null) {
            return null;
        }
        $response = new GetBalanceResponse();
        $response->balance = $result->balance ?? 0;
        $response->point = $result->point ?? 0;
        return $response;
    } catch (Exception $exception) {
        return null;
    }
}

만약 GetBalanceResponse 클래스가 다른 Response 모델들처럼 원시 응답을 받는 생성자를 갖는다면, 더 간단하게 다음과 같이 수정할 수도 있습니다.

return new GetBalanceResponse($result);

임시 우회 방법

이 이슈가 수정되기 전까지는 Fetcher를 직접 사용하는 방식으로 우회할 수 있습니다.

use Nurigo\Solapi\Libraries\Fetcher;
use Nurigo\Solapi\Libraries\HttpClient;

$httpClient = new HttpClient(['timeout' => 5.0]);
$fetcher = Fetcher::getInstance($apiKey, $apiSecret, $httpClient);
$result = $fetcher->request("GET", "/cash/v1/balance");
// $result->balance, $result->point 으로 접근

Metadata

Metadata

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions