버튼 연타와 현대 게임의 백섭

1년 넘게 주중에는 샐러드로 식단을 좀 관리하고 주말에는 흥청망청 먹기를 반복하면서 점심 시간이 되면 우진님은 원래 따로 먹는 걸 알고 계신 다른 분들은 알아서 저를 버려 두고 점심을 드시러 떠납니다. 그러다가 지난번 시차 적응 이벤트로 두 주 정도 한국 표준시에서 -17시간 정도 차이 나는 시간대에 맞춰 일했더니 일정이 끝난 다음 주말에 푹 쉬며 생활 리듬을 다시 한국 표준시에 맞춘 다음에도 컨디션이 온전히 돌아오지 않아 난처해졌습니다. 한때 무슨 밤을 세워 가며 일하고 주말에도 나와 일해 간신히 일정을 맞췄다는 전설은 그 전설을 스스로 체험했음에도 그래 봤자 결국 남는 건 잘못된 판단으로 엉망이 된 게임과 실망한 고객들 뿐이라는 점을 알고 있습니다.

그래서 한 주 정도는 주중에도 샐러드 먹기를 그만 두고 한국인의 점심에 어울리는 멋있는 뭔가를 먹으러 나가시는 분들을 따라 나서기로 합니다. 평소에는 점심팟에 따라오지 않던 사람이 따라 나와 분위기를 망치고 있는 것이 아닐지 걱정 되긴 했지만 부디 이번 한 주만 양해 부탁 드린다고 마음 속으로 말했습니다.

주문 해 놓고 기다리는 동안 다른 분이 한창 플레이 중인 모바일 게임을 봤는데 이제 세상은 모바일 게임에 고객이 원하는 경험을 빈 곳 없이 계속해서 몰아붙일 때 나올 수 있는 잠깐 동안은 웃겼지만 나머지 시간 동안에는 대단하다는 눈초리로 지켜봤습니다. 비슷비슷한 수집형 게임이라고 생각할 수도 있지만 밥이 나올 때 까지 기다리는 몇 분 동안 플레이를 본 것 뿐인데도 게임을 만들며 내렸을 의사결정들이 상상 되어 재미있었습니다. 가령 무과금러들이 인게임에서 열심히 뽑기권을 한 장 한 장 모아 드디어 10연뽑을 돌리는 그 순간까지의 경험은 나쁘지 않지만 또 한편으로는 그 한 장 한 장을 모으는 동안 고객의 관심과 집중을 유지하고 또 고객의 기대를 유지하며 그 기대를 져버리지 않는 결과를 만들어내기 위해 게임을 세심하게 다듬어야만 합니다. 방금 이야기한 조건 중 어느 하나라도 어긋나면 고객은 바로 실망하고 게임을 떠날 수 있습니다.

그런데 이 게임은 그런 관점에서 고객이 굳이 관심과 집중과 기대를 유지하도록 갖은 노력을 기울이는 것 보다는 고객이 이 장르 모바일 게임에 원하는 것이 무엇인지 생각해 보고 오직 그 지점에만 집중하고 있었습니다. 무과금으로 산업혁명 시대에 런던의 노동자들처럼 진짜 처참하게 밤에는 줄에 매달려 자고 낮에는 18시간동안 노동한 끝에 얻는 결과가 고작 10연뽑? 이 게임은 째째하게 그런 시시한 뽑기는 제공하지도 않았고 최소 30연뽑부터 시작했습니다. 대표적인 사례를 들었지만 그 짧은 시간 동안 눈앞에 펼쳐진 게임 경험은 오직 고객이 이 장르의 모바일 게임으로부터 얻고 싶은 경험이 무엇인지에 집중해 그 경험을 말이 안 되지 않는 선을 아슬아슬하게 유지하며 고객에게 연속으로 체험 시키고 있었습니다. 어쩌면 좀 삐걱거리는 것처럼 보이고 또 경험 하나하나의 완성도는 높지 않아 보이며 이런 경험의 쓰나미를 고객이 언제까지 있는 그대로 받아들일 정신 상태를 유지할 수 있을지는 잘 모르겠지만 이 순간의 경험은 대단했습니다.

한편 그런 대단하지만 또 한편으로는 삐걱거리는 상태를 보며 그 게임에 일어난 사건 사고에 대한 이야기를 듣게 됐는데 아마도 우리가 살고 있는 세계에서는 너무나 당연한 클라이언트에서 처리할 작업과 서버에서 처리할 작업, 그리고 성장이나 결제 과정에 절대로 해서는 안되면서도 또 아주 단순한 실수들을 반복해서 운영에 큰 어려움을 겪고 있다고 합니다. 가령 이 게임은 모든 버튼이 버튼 연타에 취약한 상태였는데 팝업을 열거나 닫는 버튼 정도라면 이 버튼이 연타 되어 봤자 그냥 팝업이 여러 개 열리는 정도의 귀여운 오동작으로 끝날 수도 있습니다. 그런데 만약 연타에 취약한 버튼이 자원을 투입해 캐릭터를 성장 시키는 버튼이라면, 그리고 자원 보유를 검사하고 소모를 처리하는 기능이 클라이언트와 서버에 걸쳐 안전하게 작성되지 않았다면 버튼 연타는 아주 사소한 문제이면서도 정말로 치명적인 결과를 불러올 수 있습니다.

그리고 이 게임은 지금 그런 문제를 겪고 있는 것 같아 보였습니다. 별 생각 없이 성장 버튼을 연타한 고객 중 일부가 이전에 시도한 성장이 서버에 요청된 사이에 계속해서 버튼을 누를 수 있었는데 아마도 이 사이에 성장 요청이 계속해서 전송되었고 어떤 이유로든 자원 보유 확인과 자원 소모 처리가 이루어지지 않은 상태로 요청이 계속해서 성공한 모양입니다. 클라이언트는 응답을 받지 못한 상태로 멈췄지만 이 때 클라이언트를 종료했다가 다시 시작하자 이전에 연타했던 성장 요청이 모두 적용되어 자원에 비해 훨씬 빠른 성장이 일어났고 당연히 게임은 심각하게 망가집니다.

여기까지 설명을 들었을 때 우리들 중 가장 나중에 일을 시작하신 한 분이 그러면 백섭을 해야 하느냐는 질문을 하셨는데 그럴 수 없습니다. 부분유료화 모델을 채용한 현대의 게임은 이론적으로, 그리고 기술적으로는 백섭이 가능하지만 실질적으로는 백섭이 불가능합니다. 이유는 백섭을 하기로 결정하면 먼저 게임 서비스를 멈추고 문제가 최초로 일어난 시점을 확인한 다음 그 시점으로 데이터를 되돌린 다음 그 후에 일어난 모든 결제를 환불 해야 하는데 이 과정에 개입된 주체들이 많아 이 작업을 짧은 시간 안에 수행할 수 없기 때문입니다. 그래서 서비스 경험이 있는 곳에서는 문제가 일어난 사례를 조회해 이들을 문제가 일어나기 전 상태로 되돌리는 쿼리를 만들어 실행하고 동시에 같은 문제가 발생하지 않도록 패치 하면서 운영을 계속하곤 합니다.

그런데 서비스 경험이 충분하지 않거나 긴급 상황에 대응할 능력이 부족한 곳에서는 일단 문제가 일어난 계정을 일단 몽땅 차단 하면서 문제 해결을 시작하기도 하는데 보통 이런 결정은 심각한 결과로 돌아옵니다. 일단 표면적으로는 서비스를 중단하지는 않았으니 경영진으로부터 분노의 크리스털 재떨이를 당장 맞지는 않겠지만 방금 차단해 버린 고객들은 결제를 하고 게임을 이용하고 있었을 겁니다. 이들을 ‘고작’ 우연히 발견한 결함을 경험했다는 이유로 일단 차단해 버리면 이들은 고마우신 결제 고객에서 순식간에 게시판에 욕설을 하고 회사에 내용증명을 보내는 괴물로 돌변합니다.

이런 이유들로 어떤 온라인 게임을 만들든 부분유료화 모델을 채택할 작정이라면 너무 당연하고 단순하고 뻔하지만 놓쳤다가는 치명적인 결과로 돌아오는 주요 요소를 본능적으로 대비하지만 솔직히 대부분 회사에서 이런 내용이 예쁘게 정리되어 있지는 않은 것 같습니다. 그러니까 이런 치명적인 실수가 계속해서 일어나는 거라고 생각합니다.

결론. 부분유료화를 채택한 게임은 특히 성장과 결제 처리에 세심한 주의를 기울여야 하는데 이렇게 표현하면 어렵고 무시무시해 보이지만 실은 같은 버튼을 연타할 수 없게 만드는 등의 아주 작은 처리에서부터 시작하는데 경험이 있는 팀이라면 이런 실수를 잘 하지 않지만 이런 내용들은 잘 문서화 되지 않아 종종 실수하게 됩니다. 또한 현대에는 과거처럼 치명적인 문제가 일어났다고 해도 결코 백섭을 할 수 없으며 백섭 대신 문제가 일어난 상황을 조회해 문제 이전의 상태로 선택적으로 되돌리는 방식으로 문제를 해결하는데 여기에는 상당한 운영 경험이 필요합니다.