얼마전 밥을 먹고나서 결제하던 중에 겪게 된 일이다.
- 명확하게 중복요청이다! 라고 단정지을 순 없지만, 개인적으로
금액이 같고, 6초 차이로 연달아 온 요청
정도는 막아줄만 하지 않았나? 생각도 들었다.- 딱
이중 결제
를 보자마자이거 혹시 중복요청 key값에 분 단위를 넣나?
라는 생각부터 했다는게 킬링포인트였다. (이정도면 뇌가 개발에 절여져가고 있나..)
- 개인적으로 ChatGPT가 거짓말 하는 것을 너무 많이봐서,
무조건적 신뢰
를 하지 않고 항상 의심하며 사용하고 있다.- 어느정도 배경지식이나 판단할 능력을 갖춘 상태에서 의심하는 자세로 사용하는 ChatGPT는 매우 좋은 학습수단이라고 생각한다.
(구글링 키워드 뽑기, 대략적으로 감 잡기 등)
특정할 수 있는 key
를 저장하도록 하고,해당 key
가 이미 저장되어있는지를 확인하도록 한다. 진짜로 한번 더 구매하는 경우
를 막지 않도록 설계한다. methodName
+ userId
를 기본으로 두고, 경우에 따라 조금 더 추가할 수 있도록 한다. 분산락
로직에 중복요청 방지
를 한스푼 끼얹은 느낌.line 25
에서 중복요청 방지메서드가 호출된다.dupulicateCheckKey
는methodName + userId + ProductIds
로 이루어져 있다.
line 38
에서redisDAO.setIfAbsent()
를 호출하는데 이 메서드는
- 이미 해당 키값이 존재한다면, set하지 않고 False를 리턴한다.
- 해당 키값이 존재하지 않는다면, set하고 True를 리턴한다.
유효시간 10초
로 설정되어 있는데, 이 부분은 정책적인 부분이므로 내부적으로 정한 값을 사용하면 된다.
line 39
에서 DuplicateRequestException
을 던져주게 된다. UserDetails에서 userId / HttpServletRequest에서 URI와 HTTP 메서드
를 가져와 dupulicateCheckKey
로 사용하면 될 것 같다. null
이 들어가게 된다.조회 -> 조회한 값 사용
이 안된다는 얘기.