강의

멘토링

커뮤니티

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

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

작성한 질문수

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

코드 느끼기

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

작성

·

7

·

수정됨

0

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

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

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

 

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

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

답변 1

0

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

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

동시성 문제 해결 방안:

  1. 트랜잭션 관리:

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

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

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

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

예외 처리:

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

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

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

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

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

작성한 질문수

질문하기