8.윌


8.윌 1

그 효과는 놀라웠습니다!

이것은 실제 프로젝트 제목과 팀 이름입니다.

이번 프로젝트의 분야는 커맨드 라인 텍스트 게임과 일종의 MUD 게임인데, 팀원들이 나름대로 제안한 콘텐츠가 마음에 들어서 다들 웃으면서 동의했다.

게임이라는 주제는 생각만 해도 재미있을 것 같고 배울 게 많다는 생각이 들었고, 현실에서 매우 복잡한 계산과 탄탄한 알고리즘을 지원해야 한다는 걸 깨달았을 때는 이미 늦었다.

하지만 Node.js를 활용하면서 백엔드 클래스의 목적에 맞는 데이터 처리를 다루는 이만한 주제가 없다고 생각했고, 다른 팀원들도 너무 열심히 해서 더 열심히 해야겠다는 생각이 들었습니다.

나는 뒤처지지 않고 귀찮은 존재가 된다.

.

게임의 전투 방식에서 몬스터를 만나면 해당 몬스터가 데이터베이스에 추가됩니다.

필드(던전)의 난이도에 따라 몬스터의 이름과 능력치를 다르게 만들기 위해 기본 몬스터의 기본값이 정해져 있습니다.

일반, 정예, 보스 몬스터를 구현하는 코드를 쓰면서 확률을 설정하는 코드를 써본 적이 없고 동점 요소 같은게 나오는데, 팀원과 Google의 도움을 받습니다.

  • 몬스터 생성 코드
 /***************************************************************
     * 확률에 따른 몬스터 등급 정하는 함수
     ***************************************************************/
    static isRere() {
        // 랜덤값 생성(1~100)
        const ranNum: number = Math.floor(Math.random() * 99 + 1);

        // 몬스터의 타입을 결정, 일반, 정예, 보스 순
        const type: number() = (2, 1, 0);
        // 각 희귀도에 따른 등장확률
        const isRere: number() = (2, 28, 70);

        let res: number;

        for (let i = 0; i < type.length; i++) {
            if (isRere(i) >= ranNum) {
                res = type(i);
                return res;
            } else if (isRere(isRere.length - 1) < ranNum) {
                res = type(type.length - 1);
                return res;
            }
        }
    }

    /***************************************************************
     * 해당 던전의 몬스터 생성
     ***************************************************************/
    static async createMonster(fieldId: number, characterId: number) {
        // 여기에 일반, 희귀, 보스 몬스터를 결정할 확률을 만드는 코드를 만들자.
        // 0이 나올 확률은 80, 1은 15, 2는 5
        // 기본적으로 monsterId 1, 2, 3 은 첫 던전의 일반 3가지 몬스터
        // 경험치 획득량은 캐릭터 필요 경험치랑 참고하자.
        // 확률적으로 1이 나오면 이름 앞에 '정예'를 넣어주고 각 능력치가 1.5배
        // 2가 나오면 이름앞에 '보스'를 넣어주고 각 능력치가 3배

        const first: string() = ('다람쥐', '고슴도치', '늑대');
        const second: string() = ('고슴도치', '고블린', '고블린 대장');
        const therd: string() = ('고블린', '오크', '오크 대장');
        const fourth: string() = ('오크', '도적', '도적 대장');
        const fifth: string() = ('도적', '좀비', '좀비 숙주');
        const sixth: string() = ('좀비', '구울', '리치');
        const seventh: string() = ('구울', '임프', '데몬 임프');
        const eighth: string() = ('임프', '머미', '디아블로');
        const ninth: string() = ('머미', '리퍼', '메피스토');
        const tenth: string() = ('리퍼', '뱀파이어', '바알');

        const names = (
            '뮤츠', // 원래는 null을 넣고싶었지만 에러가 나와 재미요소로 넣었다.

first, second, therd, fourth, fifth, sixth, seventh, eighth, ninth, tenth, ); let name: string; let ratio: number; let type = this.isRere(); if (type === 0) { name = names(fieldId)(0); ratio = fieldId * 1; } if (type === 1) { name = names(fieldId)(1); ratio = fieldId * 1.5; } if (type === 2) { name = names(fieldId)(2); ratio = fieldId * 3; } const defaultMonster = { hp: 50, attack: 5, defense: 5, exp: 10, }; if (!
type) type = 0; const dumyMonsters: MonsterInputForm = { characterId, fieldId, type, name: name!
, hp: Math.ceil(defaultMonster.hp * ratio!
), attack: Math.ceil(defaultMonster.attack * ratio!
), defense: Math.ceil(defaultMonster.defense * ratio!
), exp: Math.ceil(defaultMonster.exp * ratio!
), }; return await Monsters.create(dumyMonsters); }

스트레스 테스트 및 포병 및 socket.io

원래 게임은 Express와 REST API로 플레이했고, 채팅 기능은 socket.io로 구현했고, 배틀 기능을 구현하는 중간에 socket.io로 모든 진행을 했고, 로드 테스트는 내가 담당했다.

멘토님이 추천해주신 로커스트를 처음 해봤는데 처음부터 연결이 안되고 연결이 끊겼다는 에러만 뜨고 다음 시나리오로 넘어가지도 못했습니다.

(2022-11-13 21:43:39,719) JangKroed/ERROR/locust.user.task: Connection to remote host was lost.
Traceback (most recent call last):
    raise WebSocketConnectionClosedException(
websocket._exceptions.WebSocketConnectionClosedException: Connection to remote host was lost.

멘토님이 추천해 주셨고, 나중에 알게 된 것은 추가 기능으로 생각했던 MSA의 분산 로드 테스트가 가능해서 조금 알아보려고 했으나 결국 한참 후에 시간을 낭비하고 팀원들에게 골칫거리였습니다.

잘 되는 것 같았고, 그냥 locust 만이 정답이 아니라는 생각이 들어 node.js와 호환성이 매우 좋은 것으로 알려진 Artillery를 다시 시도했습니다.

지금까지 로커스트는 파이썬 코드로 시나리오를 진행했는데 포병의 경우 swagger나 깃허브 액션을 통해 경험했던 yml 파일로 시나리오를 작성하는 게 조금 익숙했습니다.

무의미한.

물론 시나리오 처리에서 진행이나 오류 발생 빈도에 차이가 있었고, 순서가 중요한 시나리오 처리에 필요한 코드에서 오류가 발생했다.

앞으로의 중요한 과제

  • 도커, 도커허브
  • 쿠버네티스
  • MSA
  • CI/CD
  • 부하 테스트