저만의 fetch 라이브러리를 만든 이유와 그 과정 그리고 사용법에 대해서
공유하고자 합니다
기존에 axios는 몇 가지 단점이 있습니다. 첫째, Next.js의 서버사이드 렌더링(SSR) 환경에서는 axios가 Next.js의 최적화된 캐싱을 제공받지 못합니다. 둘째, axios의 모듈 크기가 상대적으로 크기 때문에 번들 크기를 줄이려는 프로젝트에서는 성능 저하를 초래할 수 있습니다.
이러한 이유로 fetch를 선택했지만, fetch는 보일러플레이트 코드가 많고, 전처리 및 후처리 기능이 기본적으로 제공되지 않는다는 문제가 있습니다.
라이브러리의 주요 기능
제 라이브러리는 여러 기능을 통합해 개발자 경험을 개선하려 했는데, 그 주요 기능은 다음과 같습니다
토큰 관리 및 자동 갱신
토큰 만료 시 자동으로 갱신하는 기능을 제공합니다. 또한, 여러 요청이 동시에 토큰 갱신을 기다릴 때, 대기열(queue)을 만들어 중복된 갱신 요청을 방지합니다.
재시도 및 지연 설정
요청이 실패할 경우 자동으로 재시도할 수 있는 기능을 구현했습니다. 예를 들어, 네트워크 문제가 발생했을 때 일정 시간 지연 후 다시 시도하도록 설정할 수 있습니다. retryCount와 retryDelay 옵션으로 이를 제어할 수 있습니다.
요청 전후 훅 (beforeRequest, afterResponse)
요청을 보내기 전과 응답을 받은 후에 사용자 정의 로직을 실행할 수 있습니다. 예를 들어, 요청 전에 헤더를 수정하거나 응답 후에 로깅 기능을 추가할 수 있습니다.
Timeout 설정
일정 시간 내에 응답이 없을 경우 요청을 자동으로 취소하는 timeout 설정을 지원하여 장시간 대기하는 문제를 방지할 수 있습니다.
Next.js에 특화된 옵션
Next.js의 캐싱 메커니즘을 활용할 수 있도록 revalidate와 tags 옵션을 추가로 제공합니다.
구현 과정 및 어려움
토큰 갱신 처리
토큰 갱신 과정에서의 어려움은 여러 요청이 동시에 토큰 갱신을 기다릴 때 발생하는 경쟁 상태를 관리하는 것이었습니다. 이를 해결하기 위해 Promise 기반의 대기열 시스템을 설계했습니다.
이 코드를 통해, 한 번에 하나의 토큰 갱신만 수행되며, 나머지 요청들은 대기열에서 대기하다가 갱신이 완료되면 처리됩니다.
재시도 로직 구현
재시도 로직에서는 단순히 요청을 반복하지 않고, 네트워크 상황과 응답 상태를 분석한 후 재시도할지를 결정하도록 설계했습니다.