today,weekly I learn

throttling

rhdaud2 2024. 8. 6. 23:13

 

결제 기능 제작중, 결제 버튼을 연타했을때에

문제는 발생하지 않지만 네트워크 창에서 호출이 여러 번 가는 것이 발견되어 쓰로틀링을 적용해보았다

 

 

결제 버튼에 쓰로틀링 사용 이유

1. 디바운싱은 호출 후 일정 시간이 지나야 실행되므로
   연속 클릭 시 언제 실제로 결제가 처리될 지 예측하기 어려울 수 있다

2. 디바운싱은 연속된 호출 후 한번의 요청만 보내지만
   여러 사용자가 동시에 이런 행동을 할 경우 서버에 부하가 걸릴 가능성
   
3. 쓰로틀링 사용시 "n초 후 다시 시도해주세요" 같은 명확한 피드백 제공 가능

4. 중복 트랜잭션 방지, 예를들어 30초 내에 한번만 결제 가능 과 같은 규칙을 쉽게 적용 가능

5. 특정 초 당 한번 요청을 제한하는 방식이 짧은 시간의 빠른 요청을 방지하는데에 더 효과적일 수 있다

 

결론적으로 결제와 같은 민감한 작업에 쓰로틀링이 더 적합할 수 있다고 판단 
(예측 가능성, 서버 부하 관리, 명확한 사용자 피드백 등의 측면)

 

 

 

코드

  const [lastCallTime, setLastCallTime] = useState(0);
  const DELAY = 3000;

  const throttledPayRequest = useCallback(async () => {
  
      const now = Date.now();
    if (now - lastCallTime >= DELAY) {
      setLastCallTime(now);
  
  //결제 및 이후 처리 로직
  
  
  } else{
     toast({
        description: '결제 창 요청중입니다'
      });
  } ,[변동이 일어날 수 있는 요소들, lastCallTime])
  
  
    return (
    <div>
      <button
        onClick={throttledPayRequest}
      >
        바로 구매하기
      </button>
    </div>
  );

 

lastCallTime을 현재 시간으로 지정 후, 차이가 3000ms 보다 커지기 전에는 재호출시 토스트 띄우기

'today,weekly I learn' 카테고리의 다른 글

포트원 api v2 웹훅  (0) 2024.08.08
클로저  (0) 2024.08.07
24.7.31  (0) 2024.07.31
24.7.30  (0) 2024.07.30
24.7.29  (0) 2024.07.30