ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [TIL] 심화 주차 개인 과제 제출 (D-Day)
    TIL 2024. 6. 14. 21:19


     > Chrome Dino Web Socket Server 과제를 제출하고 미흡한 부분을 수정하면서, 과제 해설 영상을 기반으로 알게된 점 등을 정리해보았다.

     

    학습 키워드: Redis, Node.js, express, socket.io

     

    1. 완료한 과제 진행 사항

    1) 아이템 획득 어뷰징 검증 기능 구현:

     아이템 획득 어뷰징 여부를 검증하는 로직이 기존에는 유저의 스테이지에 해금된 아이템인지 여부만 검증했다. 제출 후 시간을 좀 더 들여서 아이템의 spawn interval을 검증하는 로직을 추가했다. 우선 서버에서 아이템을 해금 처리할 때 새로운 아이템의 정보를 같이 넘겨주도록 설정한 뒤, 클라이언트 부분에서 해당 정보를 담은 객체를 ItemController 객체의 unlockedItems 배열에 추가해줬다. 이후 random으로 아이템을 선택하는 과정에서 해당 아이템의 interval 정보에 기반하여 아이템이 생성되도록 하고, 아이템 획득 시간을 이전 획득 시간과 비교하여 min_interval보다 이르게 얻었는지 여부를 검사하는 방식으로 해당 아이템이 부당하게 spawn하여 얻은 것인지를 검증하도록 구현했다. 완벽한 방식은 아니라고 생각해서 어떤 식으로 바꾸면 좋을지 추가로 고민해보면 좋을 것 같다.

     

     

    2) 각 아이템의 점수를 클라이언트에서도 유지하도록 설정, 그 외 버그 수정:

     클라이언트가 아이템 획득 시 서버에서 아이템을 검증하고 소켓을 통해 점수를 보내주는 방식으로 구현되어 있었는데, 이런 방식은 아이템의 획득과 동시에 선인장에 충돌하는 케이스에서 최종 획득한 아이템의 점수가 반영되지 않는 것과 같은 문제가 있다. 이 문제를 해결하기 위해 최초에 아이템이 해금될 때 아이템의 정보를 같이 보내서(앞서 1번에서 언급한 내용) Score 클래스에서 점수를 직접 수정할 수 있도록 바꿔보았다. 아이템의 정보가 ItemController 클래스에서 유지되기 때문에 해당 class의 collideWith method에서 반환하는 객체에 아이템의 점수 정보를 추가하여 이후 Score의 getItem에 점수 정보가 함께 전달될 수 있도록 구성했다.

     

     그 외의 사항으로, 아무래도 BREAKING CHANGE 커밋이 두 개나 있다보니 변수 이름 변경 누락이나 import 누락 등의 문제로 버그가 조금 있었다. 이로 인해 스테이지가 안넘어가는 문제가 있었다 import 부분은 서버의 stage handler에서, 변수 이름은 front의 stage handler에서 발생했다보니 스테이지 이동에만 문제가 있었고, 발견 즉시 해결을 완료했다.

     

     

    2. 과제 진행 간 문제점

    1) Redis 사용 미숙:

     처음 사용하는 것이다보니 사용법을 잘 몰라서 유저의 스테이지 정보와 highscore 정보만 저장했는데, 해설 영상을 보니 key 이름에 prefix를 붙여서 폴더 같은 것을 생성하여 구획을 나누는 방법이 있다고 한다. 아래는 강의에서 확인한 몇 가지 redisClient method들이다.

    // 해설 강의에서 나온 내용
    
    const USER_KEY_PREFIX = "user:"; // user라는 이름의 폴더로 구분하게 된다.
    
    // prefix를 적용하여 저장
    await redisClient.set(`${USER_KEY_PREFIX}${user.uuid}`, JSON.stringify(user));
    
    // 같은 prefix를 가진 key를 모두 조회
    const keys = await redisClient.keys(`${USER_KEY_PREFIX}*`);
    
    for (const key of keys) {
        // 특정 key를 가진 key-value 페어 조회
        await redisClinet.get(key);
    }
    
    // sorted set 자료 구조 (정렬됨 / 중복 불가)
    await redisClient.zadd(HIGHSCORE_KEY, score, JSON.stringify(uuid));
    
    // 가장 높은 점수 반환, withscore는 '-' 포함 여부?
    await redisClient.zrevranve(HIGHSCORE_KEY, 0, -1, 'withscores');
    // zrevrange의 두 번째 인자는 start, 세 번째는 stop? limit?

     

     

     

    --


    REFERENCES:

     

     

    GitHub - donkim1212/nbc-websocket-game-server

    Contribute to donkim1212/nbc-websocket-game-server development by creating an account on GitHub.

    github.com

     > Chrome Dino Web Socket Server 개인 과제 repo

    728x90
Designed by Tistory.