36장. Provider Adapter를 내부 계약으로 감싼다
Google·Kakao·Apple SDK type을 domain 전체로 퍼뜨리지 않는다. IdentityProvider, MessageProvider, PaymentProvider의 내부 command/result/error를 정의하고 adapter가 외부 status와 field를 변환한다. provider 교체가 쉬워진다는 구호보다 timeout, retry, idempotency와 관측을 한곳에 강제하는 효과가 크다.
type ProviderResult<T> =
| { ok: true; receiptId: string; value: T }
| { ok: false; kind: 'INVALID'|'RATE_LIMIT'|'TEMPORARY'|'UNKNOWN'; retryAfterMs?: number };
contract test는 recorded fixture의 개인정보를 합성 값으로 바꾸고 schema drift를 탐지한다. adapter 밖에서는 raw token·provider response를 log하지 않는다.