개발 slecs

구독 API 안정성을 높인 폴백·교차검증 래퍼 설계

목차

구독 관련 외부 API 호출을 더 안정적으로 처리하기 위해 Codex CLI 래퍼를 만들었다. 단순한 인터페이스 개발이 아니라, 팀이 운영하며 마주할 수 있는 여러 장애 시나리오를 고민해서 설계한 작업이다.

왜 CLI 래퍼가 필요했나

외부 서비스와의 통신은 항상 불확실성을 안고 있다. 네트워크 지연, 타임아웃, API 응답 오류 등은 어느 시스템에나 일어날 수 있는데, 그걸 얼마나 우아하게 처리하느냐가 사용자 경험과 운영 안정성을 좌우한다. 특히 구독 관련 로직은 결제나 권한 관리와 얽혀 있어서 신뢰도가 매우 중요하다.

처음엔 애플리케이션 코드에서 직접 Codex API를 호출했다. 하지만 이렇게 하면:
- 각 호출지에서 중복된 에러 핸들링을 작성하게 되고
- 운영 중 빠르게 테스트하거나 응급 처치하기 어렵고
- API 변경이나 마이그레이션 시 여러 곳을 수정해야 한다

CLI 래퍼를 별도 모듈로 분리하면 이런 문제들이 한곳으로 수렴된다.

구독 OAuth: 신원 확인과 권한 관리

구독 시스템에서 OAuth 흐름은 두 가지 목적으로 작동한다. 첫째는 사용자 신원 확인이다. Codex 시스템이 "정말 우리 서비스에 등록된 사용자인가"를 검증하는 단계. 둘째는 구독 권한 확인인데, 단순히 로그인 여부뿐 아니라 "이 사용자가 현재 구독 상태인가", "어떤 플랜에 가입했는가" 같은 상세 정보를 가져온다.

이걸 CLI 래퍼로 감싸면:
- 인증 토큰 관리를 한곳에서 처리
- 권한 검증 로직이 표준화됨
- 다른 팀이나 스크립트에서도 쉽게 재사용 가능

예를 들어, 운영팀이 특정 사용자의 구독 상태를 급하게 확인해야 할 때, CLI 하나면 된다는 뜻이다.

교차검증과 폴백: 안정성의 다중 방어선

여기서 핵심은 "교차검증/폴백용"이라는 부분이다.

실제로는 구독 정보가 여러 곳에 분산되어 있을 수 있다. 자체 데이터베이스, 결제 플랫폼, 그리고 외부 Codex 시스템. 이들이 항상 동기화되어 있지 않을 수 있고, 한곳이 일시적으로 다운될 수도 있다.

교차검증은 여러 소스에서 동시에 정보를 조회해서 비교하는 방식이다:

요청 → [ DB 조회 / Codex API 조회 / 캐시 조회 ]
        → 결과 비교 → 불일치 감지 → 알림
        → 가장 최신 정보 반환

폴백은 우선순위 체인이다:

1순위: 캐시된 최신 데이터 (가장 빠름)
2순위: 자체 DB (신뢰도 높음)
3순위: Codex API (권위 있지만 느릴  있음)
4순위: 기본값 (제일 마지막 수단)

한 소스가 타임아웃되면 다음 소스를 시도한다. 이렇게 하면 Codex API가 일시적으로 느려도, 대부분의 요청이 빠르게 처리된다. 의존성도 줄어든다.

팀 관점에서의 의사결정

이 작업을 계획할 때 몇 가지를 고민했다:

  • 복잡도 vs 안정성: 교차검증과 폴백을 구현하면 코드가 복잡해진다. 하지만 운영 중 장애를 얼마나 줄일 수 있는가를 비교했을 때, 투자할 가치가 있다고 판단했다.
  • 팀원의 학습곡선: CLI 래퍼를 문서화 잘해두면, 새로운 팀원도 구독 로직에 빠르게 진입할 수 있다.
  • 테스트 용이성: CLI 형태면 유닛 테스트, 통합 테스트, 수동 테스트 모두 쉽다. 각 소스의 폴백 동작도 시뮬레이션할 수 있다.

특히 구독 시스템처럼 비즈니스 크리티컬한 부분은, 단순함보다는 견고함을 우선시하는 게 맞다. 장애가 5분 길어지면 그게 고객 이탈로 이어질 수 있기 때문이다.

회고

이 작업을 통해 느낀 것:

API 래퍼를 설계할 때는 "행복한 경로"만 생각하면 안 된다는 걸 다시 확인했다. 네트워크가 끊길 때, API가 느릴 때, 데이터가 불일치할 때, 인증이 만료됐을 때... 각 시나리오에서 시스템이 어떻게 동작할지 미리 그려둬야 한다.

또한 CLI 형태로 분리한 것도 좋은 결정이었다. 같은 로직을 애플리케이션 코드, 배치 스크립트, 운영 스크립트 등 여러 곳에서 재사용할 수 있고, 변경 시 한곳만 수정하면 된다. 이런 느슨한 결합이 결국 팀의 유지보수 비용을 줄인다.


🛒 이 글과 어울리는 추천 상품

*위 링크는 쿠팡파트너스 활동의 일환이며, 일정액의 수수료를 제공받을 수 있습니다.

댓글 0

첫 댓글 달아줘.