타사 호출을 외부 서비스로 래핑하는 것이 항상 좋은 생각인 이유

6783 단어 phpwrapper
외부 서비스를 호출(또는 API 요청)하는 타사 패키지를 사용하는 경우 타사 서비스를 얇은 래퍼(Facade)로 래핑하는 것이 좋습니다. 왜요?

래핑하면 공급업체 종속 및 긴밀한 결합을 방지할 수 있습니다. 타사에서 사용 중인 API가 작동을 멈춘다고 상상해 보십시오. 이제 전체 프로젝트에서 서비스 호출을 변경해야 합니다. 래핑된 경우 코드를 한 번만 수정하면 됩니다.

또 다른 이유는 요구 사항에 따라 타사 서비스(또는 클라이언트)를 빌드하고 설정할 수 있다는 것입니다.

예를 들어 보겠습니다.

...

use Kourses\Website;
use Mpociot\VatCalculator\VatCalculator;

...

class VatHelper
{
    protected $calculator;

    public function __construct(Website $website)
    {
        $calculator = new VatCalculator();
        $calculator->setBusinessCountryCode($website->user->country);

        $this->calculator = $calculator;
    }

    ...
}


내 프로젝트에서는 driesvints/vat-calculator 패키지를 사용하여 VAT(부가가치세) 요율을 계산하고 EU VAT 번호를 확인합니다. EU VAT 번호 확인은 외부 API를 호출하여 수행됩니다.

VAT 세율 계산은 귀하의 비즈니스 위치를 고려해야 하므로 계산기를 설정할 때 비즈니스 국가 코드를 제공해야 합니다. 내가 작업하고 있는 제품은 SaaS이므로 요청마다 이 매개변수를 지정해야 하며 구성 파일(이 패키지가 지원함)을 통해서는 지정할 수 없습니다. 그래서 내 요구 사항에 따라 VatCalculator를 "구축"하고 있습니다.

이 서비스를 래핑하지 않으면 호출할 때마다 구성해야 합니다. 큰 문제는 아니지만 간단한 예입니다.

간단한 "래핑"을 수행하는 것 외에도 타사 서비스 동작을 약간 수정하는 몇 가지 메서드를 추가했습니다.

...

use KoursesMember;
use KoursesErrorsVatValidationException;

use Exception;

class VatHelper
{
    ...

    public function isValidVatId(string $vatNumber): bool
    {
        try {
            return $this->calculator->isValidVATNumber($vatNumber);
        } catch (Exception $exception) {
            throw new VatValidationException("VAT validation failed.", 500);
        }
    }

    public function getTaxRate(string $countryCode, string $postalCode = null, string $vatNumber = null): float
    {
        $isCompany = $this->isValidVatId($vatNumber);

        return $this->calculator->getTaxRateForLocation($countryCode, $postalCode, $isCompany);
    }

    public function getTaxRateForMember(Member $member): float
    {
        return $this->getTaxRate($member->country, $member->zip, $member->vat_id);
    }
}


메서드isValidVatId에서 타사 서비스 예외를 포착하고 내 앱과 동기화된 메시지(및 코드)를 사용하여 다시 발생시킵니다. 이제 컨트롤러에서 타사 패키지 예외를 잡을 필요가 없습니다.

이 타사 패키지를 변경하기로 결정하면 내 코드를 살펴보고 이 패키지의 모든 언급을 변경할 필요가 없습니다.
getTaxRate 방법에서는 흐름에 더 잘 맞도록 동작을 약간 변경했습니다. 사용자 위치에 대한 세율을 확인하기 전에 VAT 번호를 확인하고 있습니다(비즈니스 위치와 고객 위치에 따라 다름).

메서드getTaxRateForMember는 필요한 매개변수를 "확산"할 필요 없이 내 $member 개체를 쉽게 전달하고 현재 VAT 요율을 얻을 수 있는 간단한 도우미입니다.

이 기술을 사용하면 필요한 경우 외부 서비스 호출 앞에 캐싱을 쉽게 구현할 수 있습니다. 여기서 VAT 번호는 체크할 때마다 달라야 하므로 그렇게 하지 않습니다.

이 래퍼는 Facade 디자인 패턴, Proxy, 심지어 Decorator에서 차용합니다. 디자인 패턴에 대해 자세히 알아보려면 기본 패턴과 실제 예제에 대한 멋진 개요를 제공하는 https://refactoring.guru/design-patterns을 확인하십시오.

좋은 웹페이지 즐겨찾기