경매 시스템 구현 #2

경매 시스템의 정수는 내가 사고 싶었던 물건을 누가 먼저 사가는것이다. 대체 이런 걸 시연으로 어떻게 만드나 고민이 많지만 우선은 적절히 만들어보자. 지금은 뻥카서버를 기반으로 동시성을 논하지만 후에는 실제 지연시간 기반으로 작동 될 수 있는 형태를 만들 것이다.. 꼭..


2025.10.19 - [구현하기/Unity] - 경매 시스템 구현 #1

 

경매 시스템 구현 #1

Arena Breakdown이나 로스트아크에서 다루는 경매장 시스템을 만들면 동시성 처리에 대한 역량도 만들고 또 특유의 복잡한 인터페이스 구현에서 역량을 낼 수 있을 것이라고 기대함. 바로 해보는거

hyeonistic.tistory.com

 

필드에 버튼 하나를 생성하고 이름은 뭐 알아서 지어주면 된다. 버튼을 누를 때 다른 사람이 물건을 사가는 단일 시뮬레이션을 만들 것이다.

버튼에 스크립트를 입혀야한다. 앞에서 만들었던 MockServer 는 Mono 상속 받아 만든게 아니라서 Inspector에 직접 던지기가 힘들 것이다. 새로운 스크립트를 아무거나 만들어서 버튼이 매핑 받을 수 있게 만들어주자. 어떻게 만들던간에, 내용은 한줄이면 된다.

MockServer.Instance.ForceBuyItem(0);

논외로, Inspector에 OnClick을 직접 배정해야하면 함수는 public 이어야한다. 만약, 스크립트 내에서 할 수 있다거나, 때려죽어도 public 은 안됩니다 라면 private 로 함수를 만들고, 그 스크립트의 Start 부분에서 버튼과 스크립트를 이어주어야한다. 이 부분은 스크립트가 Button을 사전에 파악하고 있어야한다.

 

그럼 MockServer는 이런 스크립트가 들어가있게 끔 해준다.

    public bool ForceBuyItem(long itemId)
    {
        ItemData itemToBuy = _auctionItems.FirstOrDefault(item => item.itemId == itemId);
        if (itemToBuy != null)
        {
            _auctionItems.Remove(itemToBuy);
            Debug.Log($"<color=orange>경쟁자 BOT: 아이템 #{itemId}를 먼저 구매했습니다!</color>");
            return true;
        }
        return false;
    }

 

우린 이전 글의 코드에서 OnRequestBuyItem 메서드에 Action 매핑으로 MockServer.Instance.TryBuyItemAsync(itemId);

을 만들어 놓았었다. 이렇게 함으로써 동시성 처리에 대한 시연을 즉시 시작 해 볼 수 있다.

이 스크립트는 0.2초의 고의 지연 뒤 구매를 시도 하는데 "시뮬레이터 버튼"을 누르고 나서 0번 아이템을 구매 시도하면 아이템을 리스트에서 찾을 수 없어 팔렸다는 메시지가 뜨게 될 것이다.

제일 기본적인 형태의 동시성 처리는 이렇게 완료했다. 하지만 싱겁다고 느낄 것이다.

지금 당장 해볼 수 있는 것은 구매를 랜덤으로 수행하게 구매 처리 할 아이템을 0번 대신 Random (0에서 아이템 갯수 - 1)까지로 하는 것 정도가 있겠다.

조금 앞서서 프로젝트를 진행하고 있는 입장에서, 구매된 아이템을 리스트에서 즉시 제거하던가 식의 고민을 해보는데, 상식적으로 내가 사려고 했던게 클릭 직전에 사라져서 엉뚱한거 사는게 좋은 경험일리가 없다. 내가 하고자 하는 것을 대충 정리하면 :

  1. 동시성 처리에 대한 실제 소요시간을 위해 전용 서버를 구축해야하는지?
  2. Page 단위의 처리를 해야한다면 Page를 넘어갈 때마다 Load를 해야할지?
  3. 실제 구매 처리가 나면 비활성화 하는게 말이 되긴하는데, 경매장을 열어둔 수천명한테 그걸 보낼건지? ← 대부분 게임이 이걸 일부러안만드는 느낌인데, 그럼 이게 리소스적으로 별로 도움이 안된다는 의미가 된다.

그니까 물건 구매 시도에서 오는 아 왜 팔림 아; 이거보다 서버 리소스 아끼는 트레이드 오프를 고려한거다. 그니까 우리가 게임하면서 왜 팔렸지 아 화난다 이건 서버값 아끼는 데 일조한 것이다.

다음 에피소드에서는 더 많은 기능을 구현하는 글을 써보겠다.