강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

열심히들어요님의 프로필 이미지
열심히들어요

작성한 질문수

제미니의 개발실무 - 커머스 백엔드 기본편

코드 느끼기

결제서비스 콜백 동시성문제 가능성

해결된 질문

작성

·

40

·

수정됨

1

안녕하세요 결제 코드느끼기 강의를 보며 궁금한점이 있어서 질문을 남깁니다.

여러 주문들을 동시에 넣었고

createPayment가 되고 PG사로부터 success가 콜백 호출 된다 했을때, 동시성 문제가 우려되는데요

 

각 주문마다 point 혹은 coupon을 쓴다고 했을때, 고객이 가진 point 이상으로 point가 차감된다든지, 쿠폰 재사용 문제를 직면했을때 예외처리가 없어보이며, 이 때문에 이를 복구하는 방안같은건 없어보입니다.(괜히 예외처리를 했다가 고객의 돈이 빠져나가고 결제상태가 안바뀔 염려때문)
그럼에도 각 Value Object에서 valid및 예외처리하는 로직이 success api에 추가할 수 있을까요? 아니면 주문 결제 전 단계에서 막으면 좋을까요?

아니면 그럴 가능성이 자주는 없으니, 결제 상태는 Ready인 부분을 찾아서 수동 수정하는것도 방법이라고 보시나요?

답변 2

0

제미니님의 프로필 이미지
제미니
지식공유자

안녕하세요 질문 감사드립니다!

이 부분은 상당히 애매하기 때문에 서비스 기획 담당하고도 소통이 필요합니다

주문 결제 전 단계에서 막는다 를 선택하더라도, 카드사 결제창을 동시에 띄워놨다가 결제한다면 이미 우리 서비스에선 알 수가 없습니다


즉 이것은 만약 고객이 의도해서 쿠폰이나, 포인트를 더 쓰려했다면(어뷰징으로 볼 수 있음)
오히려 어떤식이든 문제가 발생해서 확인이 가능한게 맞다고 생각합니다

이런 부분이 기획 쪽하고 소통이 되어야할 것 같습니다

 

그렇다고 아예 주문창에서결제 버튼을 눌렀을때 포인트나 쿠폰을 선 차감 하는 전략을 쓰기에도 서비스 이용 측면에서 상당히 모호합니다, 그럼 특정 시간이후 선 차감 한 부분을 다시 반환해줘야하고 이에 대해서 고객은 구매를 안하고 이탈 할 수도 있습니다
(ex] 카드 + 10,000포인트 사용 -> 결제 버튼 누름 -> 포인트 선차감 처리 -> 카드사결제 창까지 갔다가 -> 까먹은 상품이 있어서 다시 주문을 하려함 10,000포인트는 10분 뒤에 복구 됨 -> 고객은 기다리다가 짜증이나서 꺼버림, 또는 원하던 상품 품절되어 강성 민원 재기)

이와 유사한 방식으로 영화관 예매, 비행기 좌석 예매, 미용실 예약 등 선 차감 방식을 쓸 때 생기는 느낌의 문제들이 있습니다.


아무튼 success API의 PG사 승인 API를 호출하기 전에 validation을 추가하는 것은 가능 할 것 같습니다
다만 이 부분도 여전히 타이밍 이슈가 존재합니다

우선 현재의 경우는 쿠폰과 포인트 사용에 대하여 낙관적 락이 적용되어 있는 상태입니다
그래서 최종 충돌에 대하여 대비가 되어있는 상태라고 봐주시면 될 것 같습니다

이제 타이밍 이슈 상황을 다시 정의해보면 이렇습니다

  • 한명의 유저가

  • 여러개의 주문을 생성해서

  • 포인트와 쿠폰을 여러 주문에 중복 적용한다

    • 여기 부터 어뷰징의 의심이 생기기 시작합니다

      • 물론 가족과 아이디를 공유하는 환경일 수도 있습니다..!

  • 여러 주문에 적용하기 위해 완벽히 동일한 시간(ns)으로 결제를 한다

    • 네트워크 회선 등의 문제가 없어서 운좋게 콜백까지 동일한 시간에 온다

  • validation 및 예외처리하는 로직은 통과한다

    • 아직 여러 주문의 callback 중 쿠폰이나,포인트 처리를 하지 못 했기 때문에

  • 낙관적 락 충돌로 예외가 발생한다

결국 이 상황은 의도 된 어뷰징 또는 정말 완벽한 우연의 일치라 보고 문제가 생길 수 있기 때문에 수동 처리 또는 빈도가 적지 않다면 우리 디비 결제 상태와 PG결제 상태를 비교해서자동 취소 처리 배치 등 운영 자동화으로 풀어낼 수 있다고 봅니다.


요약하면 success api 에 validation 과 예외 처리를 추가하는 것은 유의미하다고 생각합니다
주문 결제 전 단계에서 막는 것은 현실적으로 불가능한 부분이 많다고 봅니다

다만 결국 이 케이스는 동시성 경합이 일반적으로 일어나지 않아야 정상이라고 보기 때문에 정상적인 유저에게서 발생할 가능성이 적은 케이스라고 보는게 좋다는 생각입니다


모쪼록 답이 되었길 바랍니다! 완강 후 수강평도 기대하겠습니다! :D

0

안녕하세요, 인프런 AI 인턴입니다. 열심히들어요님.

결제 서비스의 동시성 문제는 실제 운영 환경에서 발생할 수 있는 중요한 이슈입니다. 동시에 여러 요청이 들어올 경우, 동시성 문제로 인해 포인트가 초과 차감되거나 쿠폰이 중복 사용되는 상황이 발생할 수 있습니다. 이러한 상황을 방지하기 위한 일반적인 전략을 몇 가지 소개드리겠습니다.

동시성 문제 해결 방안:

  1. 트랜잭션 관리:

    • 데이터베이스 레벨에서 트랜잭션을 걸어, 모든 작업이 원자적으로 수행되도록 합니다. @Transactional 을 사용하여 중요한 비즈니스 로직이 동시에 처리되지 않도록 보호할 수 있습니다.
  2. 낙관적 락:

    • 데이터를 업데이트할 때 버전 번호를 사용하여 데이터가 변경되었는지 검증합니다. 만약 다른 트랜잭션에서 동시에 데이터를 수정했다면, 이를 감지하여 적절한 로직을 수행할 수 있습니다.
  3. 비관적 락:

    • 특정 레코드에 대해 락을 걸어서 하나의 트랜잭션만 접근하도록 제한합니다. 이는 데이터베이스의 락 기능을 활용하는 방법입니다.
  4. 큐를 사용한 처리:

    • 결제 요청을 큐잉 시스템에 추가하여 한 번에 하나씩 순차적으로 처리하게 하는 방법도 고려해볼 수 있습니다. 이 방법은 시스템의 동시성 문제를 큐가 처리해주기 때문에 로직이 간단해질 수 있습니다.

예외 처리:

  • 복구 로직: 동시성 문제로 인한 예외가 발생한 경우, 이를 로그에 남기고 별도의 복구 로직을 통해 자동으로 수정하는 방안을 마련할 수 있습니다.
  • 유효성 검증: Value Object 레벨에서 유효성을 검증하여 비정상적인 상태가 발생하는 것을 방지합니다.

위의 방법들은 시스템의 크기와 태생적인 성격에 따라 다르게 적용할 수 있으며, 실무에서는 여러 방법을 조합하여 사용하는 것이 일반적입니다. 관련된 기존의 유사한 논의와 답변을 참고하여 좀 더 구체적인 해결책을 모색하실 수 있습니다:

제가 제공한 답변이 여러분께 도움이 되었기를 바랍니다. 추가로 궁금한 점이 있거나 다른 주제에 대해 논의하고 싶은 사항이 있으시면 언제든지 질문해 주세요.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

열심히들어요님의 프로필 이미지
열심히들어요

작성한 질문수

질문하기