[FIFAPulse] 개발기록 - API 병렬 요청으로 발생한 403에러 해결하기

조민호·2023년 8월 3일
0

문제 상황

피파온라인4 OPEN API가 제공하는 API 중에서 선수 ID값을 입력하면

실제 피파온라인4에서 사용된 선수의 사진을 제공 해주는 것이 있다

해당 프로젝트에서는 각 매치에 뛴 모든 선수들을 나열해서 각 선수에 대한 평점과 다른 세부

정보들을 보여주려고 했다.

그러기 위해선 주전 11명 + 후보 8명으로 19개의 이미지가 필요했으므로 , 선수의 이미지 정보를 반환해주는 API를 호출해야 했었다.

즉, 이미지 API를 19번 동시에 호출해서 사용해야 하는 것이다


최초 구현은 아래와 같이 진행했다

  • 클래스로 작성 된 이미지 API 메소드


  • 이미지 메소드 사용 부분




위처럼 메소드를 작성을 하고

19명의 선수 정보를 가지고 있는, 길이가 19인 myPlayerData 배열을 따로 만들어 둔다

myPlayerData = [ {spId: 300192119, spPosition: 0, spGrade: 5, status: {…}} , {...}]

그리고 이 배열을 순회하면서 , spId를 가져온 다음

이 값에 대해 이미지 API를 각각 호출하고 이것들을 병렬처리 하기 위해 Promise.all을 사용했다.

근데 아래와 같은 문제가 발생했다

403 에러였다.

403 에러는 접속하려는 웹 브라우저에 접근 권한이 없을 때 일어나는데

보통 API를 제공하는 서버측에서 특정 조건에서 접근하지 못 하게 의도적으로 세팅한 것이다.

( 이전에 유튜브 클론코딩을 진행할때도 유튜브에서 하루 API 횟수 제한을 둔 적이 있는데 이를 초과 했더니 403에러가 떴었던 기억이 있다. )

아마 피파온라인4 OPEN API 측에서 이미지 관련한 API는 특정 횟수 이상으로는 동시 호출을 막아 놓은 것 같다

(19명이 아닌 3~4명 정도로 했을때는 제대로 돌아가는 것을 보니 더욱 확실하다)


어떻게 해결할까?

  1. 위에서 언급한 각 선수 정보를 담고 있는 myPlayerData 배열을 내가 따로 생성을 해 놓았고 , 이 배열 대해 map 메소드로 순회하면서 병렬로 API를 호출하고 있었고

  2. 피파온라인4 OPEN API 측은 특정 횟수 이상으로는 동시 호출 할 수 없도록 막아놓았다

그렇다면 만약에 동시에 하는 것이 아니라 , 차례대로 한번씩 호출을 하는 것은 어떨까?

그래서 생각해 낸 것이 myPlayerData 배열의 각 값에 따른 연산을 진행하는 부분을 컴포넌트 단위로 분리한 것이다

  • 이처럼 myPlayerData를 순회하면서 각 spId에 대해 getActionImg와 getHeadImg를 진행하는 로직을 PlayerImg 컴포넌트로 분리하고
  • PlayerImg 컴포넌트에서 한번씩 API를 호출하는 것이다

이렇게 해보니 해결이 됐다!




왜 해결이 된 것일까?

React에서 컴포넌트는 각각 독립적으로 렌더링 된다

이처럼 PlayerImg 컴포넌트를 별도로 분리하면 각 컴포넌트는 독립적인 자신만의 라이프사이클을 가지게 되므로

병렬적으로 한번에 여러 API를 호출하는 것이 아니라,

각 컴포넌트가 렌더링되면서 순차적으로 API를 호출하게 되며

추가로 각 PlayerImg 컴포넌트의 useEffect에 있는 API 호출로 인해서 여러 PlayerImg 컴포넌트 렌더링 간에 약간의 지연이 생기게 되는데 이 지연이 API의 동시 호출 제한을 회피한 것 같다

profile
웰시코기발바닥

1개의 댓글

comment-user-thumbnail
2023년 8월 3일

유익한 자료 감사합니다.

답글 달기