서론(잡소리)

작혼(영문 명칭 Mahjong Soul)은 인터넷 마작 게임 중에서 인지도가 높은 게임 중 하나이다. 원래부터 마작을 좋아하던 한국 사람들도 애용하던 게임이었으며, 2020~21년 경 트위치에서 시작된 작혼 열풍으로 많은 게이머들이 작혼을 찍먹해보았으며, 이러한 성원에 힘입어 작혼 글로벌 서버에는 한국어 공식 번역을 제공했고 트위터에는 한국어 공식 계정 또한 만들어 한국 팬들과의 소통 창구를 늘렸다.(지금은 하는 사람이 많은지 모르겠다. 작혼 열풍은 다 식고 이 때 쯤에 작혼을 시작한 사람들 중에서는 마작의 묘미에 빠진 사람들만 남지 않았을까 조심스레 예측해본다.) 나는 2022년 4월, 1학기 중반 즈음에 작혼을 플레이하기 시작했고, 2학기 때 몰려오는 과제를 처리하기 위해 잠시 쉰 이후로 거의 하지 않고 있다. 군대에 있을 때 같이 마작 한 판 어떻냐며 나를 계속 영업하던 후임은 나를 마작에 입문하게 하는 것에 실패했지만 심심해서 본 옥냥이 님의 작혼 입문 영상을 보고 마작 플레이해볼 만 하겠다라는 생각이 들었다. 후임에게는 미안하지만 빈 종이에 그림 그려가면서 마작을 설명하는 것을 들으면 마작이 너무 어려워보이고 무슨 소리하는지 전혀 모르겠는 것을 어쩌겠나.

지금은 하지도 않는 게임에서 아이디어가 어디서 튀어나올까 싶기도 한데 기반 아이디어 자체는 한창 작혼을 열심히 플레이하던 시기에 나온 것이다. 9월에 아이디어가 떠올랐고, 이를 친구와 함께 이야기해보다가 ‘같이 해볼까’라는 의견에 도달하여 이를 언젠가 해결하겠노라는 다짐 하에 10월 중순에 깃허브 repo를 만들었다. 아이러니하게도 repo를 만들고 나서 얼마 있지 않아 수많은 과제로 인하여 작혼을 무기한 휴식하게 되었다. 그래도 이전에 작혼 패보 다시보기를 통해 받은 작혼 패보 데이터를 복기하겠다면서 서버와의 websocket 통신 내역을 분석한 것도 있고, 메시지 해독하겠다면서 이것저것 찾아보고 프로그램도 짜놓은 것이 몇 개 있기 때문에 아까워서라도 이 프로젝트는 해야겠다는 생각을 하게 되었다.

구구절절 작혼을 안하게 된 이야기, 프로젝트를 진행해야 되는 이유에 대한 이야기는 이쯤에서 그만두고, 그래서 하려는 것이 무엇이냐면…

기반 아이디어

작혼 등급전 정보를 웹 페이지에 이미지(또는 HTML element) 형태로 보여지게 할 수 있을까?

프로그램 구조 구상

사실 위 아이디어를 떠올리자마자 대충 어떻게 프로그램을 짜야하는지, 어떤 것을 고려해야하는지에 대해 대략적으로 구상이 됐다. 그 내용은 여기에도 나와있는 바와 같다.

프론트

  • 표시할 내용
    • 필수
      • 닉네임
      • 등급(4마/3마는 선택 가능 또는 모두 보이게)
    • 선택
      • 랭크 포인트(이거 애니메이션 있으면 좋을 것 같긴 함)
      • 대표 캐릭터
      • 칭호
      • 캐릭터 테두리
  • 형식
    • 이미지 동적 생성? SVG?
    • <img> 태그 또는 <picture> 태그 사용해서 불러올 수 있게끔 만드는 게 좋을 듯
    • 웹서버로 request를 보내면 이미지가 반환되는 형식
    • Project mazassumnida의 방식을 참고하는 것이 좋을 듯
  • 디자인 어케 하지
    • 옵션1: 작혼 느낌 살려서
    • 옵션2: 모던한 느낌으로

    • 작혼 서버로부터 데이터 request
      • request가 너무 잦으면 서버에서 밴을 때릴 수 있음
        • 일정 쿨타임(e.g. 10분) 이내에 request를 여러 번 보내지 않게 만듦
        • 갱신을 하지 않으면 새로 갱신이 올 때까지 request를 보내지 않음
      • 작혼 서버와는 WebSocket을 사용하여 통신해야 할 듯
      • 통신 시 Google의 protobuf를 사용하여 메시지 wrapping/unwrapping이 이뤄짐
      • protobuf에 의한 메시지 wrapping 구조는 가지고 있음
      • 작혼 전적 사이트 깃허브 참고할 것
    • 형식 정해지는 대로 해당 형식 렌더링하는 기능 필요
  • DB
    • request를 보내지 않고도 같은 데이터를 계속 반환하려면 DB에 관련 데이터 저장이 불가피
    • 사용자 식별 방법은 크게 3가지가 있음
      • 친추 코드
      • 닉네임
      • UID(작혼 서버 내부적으로만 사용함)
    • 최소한 닉네임, UID와 이미지에 렌더링할 내용을 DB에 담고있는 것이 좋을 듯(법적 이슈 확인 필요)

위 내용을 바탕으로 계획한 구조를 대략적으로 설명하면 아래와 같다.

각 모듈 별 계획
  • DB에는 유저 ID, 친추 ID, 닉네임, 현재 등급, 랭크 포인트를 필수로 저장한다.
    • 필요 시 캐릭터, 칭호 등 프로필을 꾸밀 수 있는 정보를 저장한다.
  • 웹 서버는 response로 이미지를 반환한다.
    • 이미지를 반환할 시 데이터 업데이트 시점이 오래 되었다면 작혼 서버로부터 데이터를 업데이트하여 DB에 저장한다.
  • 데이터 업데이트 주기를 정하여 특정 시간 간격 이내에 작혼 서버로부터 새로운 데이터를 또 요청하지 않는다.
모듈 간 상호작용
  • 웹 서버에서 response를 만들 때 DB에서 필요한 데이터를 가져와서 response를 구성한다.
  • 백엔드에서 WebSocket을 사용하여 작혼 서버에서 데이터를 가져오고 그 결과를 DB에 저장한다.
    • 위의 데이터 업데이트 주기는 DB에 마지막 업데이트 시간을 저장하여 작혼 서버에 요청을 보낼지 말지 결정한다.

유사한 프로젝트

Project mazassumnida

지금 하려는 것과 비슷한 목적으로 만들어진 프로젝트가 있다. PS 사이트인 백준 온라인 저지에 게임하는 것과 같은 경험을 제공하는 사이트인 solved.ac의 프로필을 카드 형태로 보여주는 프로젝트 맞았습니다가 있다. 이 서비스는 군대에서 solved.ac 플래티넘을 목표로 문제 풀이를 진행하면서 풀이 사이트를 정리하면서 사용했다. 이 사이트에 있는 것을 볼 수 있다(사이트를 건드린지 너무 오래돼서 이제는 해당 사이트가 일부 작동하지 않지만 solved.ac 프로필은 잘 보인다).

아이디어를 떠올리고 보니 프로젝트의 목적과 기능에 있어서 유사성이 있었다. 덕분에 어떻게 할지에 대하여 갈피를 잡는 데에 도움이 될 것이다.

amae-koromo

위와 같이 프로젝트의 목적과 기능이 비슷한 것이 있었다면, 작혼이라는 공통 소재를 기반으로 한 유명한 사이트도 있다. 바로 amae-koromo(깃허브, 사이트)로, 이 사이트는 작혼 전적을 정리해서 보여주는 사이트다. 이 사이트는 6월 말에 처음 알게되어 여러 통계값을 알아보기 위해 사용하던 사이트다. 전적과 함께 여러 통계값을 제공하는데, 사용자 풀에서의 평균값, 구간 별 값 등 여러 의미있는 수치를 제공하여 나의 마작 실력과 스타일을 판단하는 데에 도움이 되었다.

이 사이트의 특징으로는 30분 간격으로 사용자의 정보를 업데이트하는 것이 있다. 모듈 별 계획에서 데이터 업데이트 주기를 떠올리는 데에 영향을 준 기능이다. 또한 이 사이트는 작혼 서버와 직접 통신하지 않는 이상 알 수 없는 정보까지 모두 가지고 있어서 작혼 서버와 통신하는 코드가 있을 것이라 생각했고, 실제로 다른 깃허브 repo에 작혼 서버와 통신하는 코드를 정리해서 올려둔 것이 있었다. 이 repo의 코드를 참조하면 작혼 서버에서 원하는 데이터를 가져오는 방법을 찾아볼 수 있을 것이다.