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

서정범님의 프로필 이미지

작성한 질문수

견고한 결제 시스템 구축

가상의 Checkout 기능 구현

주문 번호 생성 방식 관련 질문 있습니다

작성

·

79

0

현재 주문 번호를 생성하는 방식은 결제 페이지로부터 들어오는 데이터들을 이용해서 그것을 String 형태로 변형해줌으로써 모든 요청들이 같은 형태의 String Key값을 가지게 되고 그것을 주문 번호로 사용하는 것으로 이해했습니다!

주문 번호의 경우 쿠팡이나 다른 이커머스사들을 확인해보면 숫자 혹은 거기에 문자정도로 생성되어 있고 결제 완료시 주문 번호를 확인해볼 수 있습니다.

이와 같은 방식으로 주문 번호를 생성하려면 위와 같은 방식이 아닌 별도의 로직을 통해서 주문 번호를 생성해야되며, 요청이 1번만 처리되기 위해서 Unique한 값으로 생성되어야 됩니다.

현재 제가 진행하고 있는 프로젝트에서는 결제 페이지로 사용자가 진입했을 때 주문 번호를 특정 로직을 통해 Unique한 값으로 생성해주고 DB를 확인하고 Redis에 기록하는 절차를 진행하여 멱등성을 보장하고 있습니다.

 

이와 같이 진행하다 보니 주문 번호를 생성하기 위해서 DB에 쿼리를 1회 이상 날리는 상황이 발생하게 되는데 이와 같이 진행하는 것은 안좋은 형태일까요?

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.

서정범님, 주문 번호 생성 방식에 대한 질문을 해주셨군요. 주문 번호를 생성하기 위해서 데이터베이스에 쿼리를 날리는 방식은 결제 시스템의 특성과 요구사항에 따라 달라질 수 있습니다. 주문 번호가 유일한 값을 가져야 하고, 특히나 고가용성과 멱등성을 보장해야 하는 결제 시스템의 경우, DB 조회를 통해 유일성을 확보하는 것은 일반적인 접근 방식입니다.

하지만, 데이터베이스에 대한 의존도가 높아질수록 시스템의 병목 현상이 발생할 수 있으며, 트래픽이 급증하는 상황에서는 성능 이슈를 초래할 수 있습니다. 이를 개선하기 위해서는 다음과 같은 방법을 고려할 수 있습니다:

  • 분산 ID 생성기 사용: 예를 들어, Twitter의 Snowflake 알고리즘처럼 시간에 기반하여 유일성이 보장되는 ID 생성기를 사용할 수 있습니다. 이 방법은 DB에 대한 의존성을 줄이면서 고유한 ID를 신속하게 생성할 수 있습니다.
  • 캐시(e.g., Redis) 활용: 이미 생성된 주문 번호의 캐시를 활용하여 DB 접근을 최소화할 수 있습니다. 접근 패턴에 따라 캐시 레이어를 적절히 설계하면 성능 이슈를 다소 완화할 수 있습니다.
  • 비동기 처리 및 배치 처리: 주문 번호 생성 과정에서 DB 접근이 필요할 경우, 비동기 처리를 통해 사용자 응답 시간에 영향을 주지 않도록 할 수 있습니다. 또한, 배치 처리를 통해 DB 접근을 최적화할 수 있습니다.

프로젝트의 특성과 요구사항을 꼼꼼히 분석하여 가장 적합한 방안을 선택하는 것이 중요합니다. 이와 관련해서 추가적인 도움이 필요하다면, 기술 커뮤니티나 전문가의 도움을 받는 것도 좋은 방법입니다.