중복 요청 어떻게 방지할까?

Lee Jae Yong·2025년 9월 16일
0

UMC

목록 보기
2/2

배경

사용자가 만약 버튼을 여러번 눌렀을 때 데이터베이스에서 트랜잭션을 처리하다가 완료되기 전에 두 번째 요청이 들어가게 되면 ?
데이터 일관성 문제와 자원 낭비를 일으킬 수 있다.
그러면 중복 요청 이슈를 막기 위하여 어떠한 방법이 있는지 알아보자.


프론트엔드에서 중복 방지를 해보자

Debounce와 Throttle 적용

단기간에 여러번 클릭해서 서버에 여러번 요청이 들어가는 거면 debounce를 걸어 지정해놓은 시간이 끝나면 요청이 들어가게 하면 되지않을까?
단순하게 함수 실행을 지연해서 해결하는 방식.
또는 일정 시간 간격으로만 실행하여(Throttle) API 요청이 중복으로 나가는 것을 방지.

하지만 이렇게 단순할까..?

그렇다면 API 요청이 성공하지 못한다면?
debounce가 적용된 함수에서 api 요청에 대한 응답이 돌아오지 않으면, 돌아올 때까지 버튼을 사용할 수 없게 된다.

다른 해결책들...

  • isLoading
  • useRef
  • flushSync

다음과 같은 방법들이 있으나 프론트 쪽 지식이 부족해 공부가 더 필요할 것 같습니다...

참고 링크

https://chunho.tistory.com/109
https://happysisyphe.tistory.com/72
https://velog.io/@mini_suyo/React%EC%97%90%EC%84%9C-%EC%A4%91%EB%B3%B5%ED%98%B8%EC%B6%9C%EB%B0%A9%EC%A7%80
https://velog.io/@funco247/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C%EC%97%90%EC%84%9C-%EC%A4%91%EB%B3%B5-%EC%9A%94%EC%B2%AD-%EB%B0%A9%EC%A7%80%ED%95%98%EA%B8%B0


백엔드에서 중복 방지를 해보자

아이디포턴시(Idempotency) API 설계

개념: 동일한 요청이 여러 번 들어와도 결과가 변하지 않도록 하는 설계 기법

방법: 클라이언트에서 요청마다 고유한 요청 ID를 넘기고, 서버는 이 ID를 저장해 중복 요청인지 판단

이미 처리된 요청 ID가 들어오면, 처리하지 않고 이전 결과를 재사용

전자상거래 결제 등 중요한 상태 변경에 필수적

DB 트랜잭션과 락(Lock)

트랜잭션: 데이터 무결성과 일관성을 보장하기 위해 작업을 원자적으로 실행

락: 중복 데이터 변경이나 병행성 문제를 막기 위해 레코드나 테이블 단위 락 적용

단, 락이 과도하면 성능 저하 및 교착 상태 이슈 발생 가능하므로 적절한 수준 유지 필요

요청 제한(Rate Limiting) 및 제한 정책

특정 시간당 같은 사용자 또는 IP에서 반복되는 요청 제한

DDOS 공격 대응에도 효과적

Redis Set을 사용한 중복 방지

https://ksh-coding.tistory.com/149
블로그 참조

참고 링크

https://upcurvewave.tistory.com/646
https://hyeri-dev.tistory.com/55
https://f-lab.kr/insight/understanding-idempotency-in-api-design
https://wookjongbackend.tistory.com/39
https://hogwart-scholars.tistory.com/entry/Spring-Boot-%EC%9E%90%EB%B0%94-%EC%8A%A4%ED%94%84%EB%A7%81%EC%97%90%EC%84%9C-%EC%B2%98%EB%A6%AC%EC%9C%A8-%EC%A0%9C%ED%95%9C-%EA%B8%B0%EB%8A%A5%EC%9D%84-%EA%B5%AC%ED%98%84%ED%95%98%EB%8A%94-4%EA%B0%80%EC%A7%80-%EB%B0%A9%EB%B2%95
https://k-sky.tistory.com/714
https://ksh-coding.tistory.com/149

profile
기록하는 습관

0개의 댓글