경매장 기능

혹시 뒤끝으로 경매장 기능을 구현할 수 있을까요?

안녕하세요 개발자님

경매장 기능의 경우, 구현이 가능하지만 다소 제한적인 형태와 복잡한 로직으로 구성됩니다.
구현하자 하시는 경우에는 아래와 같은 제한이 발생하는점 참고하여 하단의 로직을 확인해주세요.

제한 사항

  • 경매장에서 아이템 구매시 자동으로 퍼블릭 테이블에 존재하는 숫자로 된 데이터 연산을 통해 수정
    (우편 등으로 아이템 제공 X, 선 DB 수정 후 쪽지를 통해 구매되었다고만 안내할 수 있습니다)

  • 경매장에 아이템 이름을 통한 검색 기능이 존재할 경우, 검색에 오랜 시간이 소요될 수 있으므로 숫자로 된 아이템 코드를 통해 검색하는 것을 추천


경매장 기능 구현

판매자의 행동 #1 (아이템 등록)

  1. 퍼블릭 테이블 Shop에 경매하고 싶은 아이템 데이터를 삽입합니다.
  2. 판매자의 인벤토리에서 해당 아이템을 제거합니다.
  3. 두개의 행동을 트랜잭션으로 묶어 전송합니다.

구매자의 행동 #2

  1. Shop 테이블을 검색합니다.
  2. 숫자로 된 아이템 코드(혹은 아이템 이름[이름으로 검색시 오래걸림])로 아이템을 검색합니다.
  3. 검색된 아이템 옆에 구매 버튼을 추가해놓습니다.
  4. 구매 버튼 클릭 시, 자신의 money를 마이너스 연산, 판매자의 money를 플러스 연산, 자신의 아이템에 해당 아이템을 추가하는 트랜잭션을 추가합니다.
  5. 트랜잭션이 성공하면 판매자에게 쪽지를 보내어 구매가 완료되었다는 메세지를 전송합니다.
  6. 실패할 경우, 에러 모달을 띄웁니다.
    (동시에 두명의 유저가 구매할 경우 한 유저에게는 데이터를 찾을 수 없다는 에러가 발생할 수 있으며 이에 맞게 아이템을 찾을 수 없다라는 모달을 띄우시는 것을 추천드립니다.)

판매자의 행동 #3 (경매 등록 취소 / 아이템 회수)

  1. 경매장의 물품이 판매자 자신의 것이라면 버튼을 구매가 아닌 취소로 변경
  2. 취소 버튼 클릭 시 퍼블릭 테이블 Shop에 추가된 아이템 데이터 컬럼 삭제
  3. 판매자의 인벤토리에 아이템 추가합니다.
  4. 두개의 행동을 트랜잭션으로 묶어 전송합니다.

저도 경매 기능이 궁금 했는데.

  1. 구매 버튼 클릭 시, 자신의 money를 마이너스 연산, 판매자의 money를 플러스 연산, 자신의 아이템에 해당 아이템을 추가하는 트랜잭션을 추가합니다.

이 부분에서 구매 유저가 판매 유저의 money를 건드릴 수 있는 건가요?
판매자가 접속중이지 않으면 어떻게 되나요?

구매자가 아이템을 구매 할 때 판매자 Shop 퍼블릭 테이블을 건들 수 있는건가여?

먼저 잘못된 정보 제공해드려 대단히 죄송합니다.
해당 로직을 검토해본 결과, 트랜잭션에는 연산기능을 지원하지 않아 연산기능을 사용하는 것은 어려울 것으로 확인 됩니다.
따라서 해당 방법은 뒤끝 펑션을 이용한 우편 발송과 데이터 수정을 통해 구현하는 것을 추천드립니다.
펑션을 사용하는 이유는 함수간 호출 사이에 유저가 의도적으로 네트워크를 중단하여 거래가 일어나지 않는 버그를 찾아 남용하는 것을 방지하기 위함입니다.
이 부분에 문제가 없으시다면 펑션이 아닌 일반 함수로도 구현하실 수 있습니다.

로직은 다음과 같습니다.

판매자의 행동 #1 (아이템 등록)

  1. 퍼블릭 테이블 Shop 에 경매하고 싶은 아이템 데이터 삽입
  2. 인벤토리에서 해당 아이템을 제거
  3. 두개의 행동을 트랜잭션으로 묶어 전송

구매자의 행동 #2

  1. 퍼블릭 테이블 Shop 검색
  2. 숫자로 된 아이템 코드를 이용하여 아이템 검색
  3. 원하는 아이템 구매 버튼 클릭
  4. 펑션 실행
  5. 구매할 아이템의 정보를 로그로 보내기 (예기치 못한 에러로 인한 해당 아이템의 CS를 위한 절차)
  6. 펑션에서 구매하려는 경매장의 아이템 데이터 삭제
  7. 삭제 성공 시 아이템의 가격을 동봉하여 판매자에게 구매 완료 우편 전송 (400, 502의 에러 발생 시 최대 3회까지 반복 실행)
  8. 우편이 정상 발송된 경우 인벤토리에 아이템 추가 (이 또한 에러 발생시 최대 3회까지 반복)
  9. 펑션에서 성공 메세지를 전송하여 클라이언트로 리턴되며 이에따라 성공/실패 메세지를 UI로 띄웁니다.

판매자의 행동 #3 (판매에 따른 재화 수급)

  1. 우편 조회
  2. 경매를 통해 전송된 우편 수령
  3. 수령 후 리턴되는 정보에 따라 자신의 데이터(재화)를 수정합

판매자의 행동 #4 (경매 등록 취소 / 아이템 회수)

  1. 경매장의 물품이 판매자 자신의 것이라면 버튼을 구매가 아닌 취소로 변경
  2. 취소버튼 클릭 시 퍼블릭 테이블 Shop 에 등록된 경매아이템 데이터 삭제
  3. 인벤토리에 아이템을 추가
  4. 두개의 행동을 트랜잭션으로 묶어 전송

위 로직에서 중요한 부분은 우편 발송 및 인벤토리에 아이템 추가 시
만약 예기치 못한 에러(400, 502 에러)가 발생한다면 3번까지 호출하여 최대한 에러 발생이 적도록 개발하는 것입니다.

퍼블릭 테이블에서 indate를 통하여 데이터를 수정/삭제할 경우 타인의 데이터 또한 수정/삭제가 가능합니다. where절을 통하여 데이터를 접근할 경우 검색만 가능하며 수정/삭제는 불가능합니다.
그러므로 유저의 money가 퍼블릭 테이블에 존재하고 해당 데이터의 indate를 알고 있다면 수정이 가능합니다.

하지만 위에 설명해드린 로직에 트랜잭션에는 연산 기능이 없다는 것이 확인되어, 타인의 데이터 money는 수정하지 않는 방식으로 로직을 변경하여 재안내드렸습니다.
감사합니다.

혹시 아직 위 방법으로 경매장 구현이 가능한가요???

네, 현재는 위 안내드린 내용을 통해 경매장 기능을 구현하여 이용하실 수 있습니다.