오늘의 목표

더보기

✔️ 팀프로젝트 진행


⏱️ 오늘의 일정

9:00 ~ 21:00 팀프로젝트 진행


📜 팀프로젝트 진행

9:00 ~ 21:00 팀프로젝트 진행

 

팀프로젝트를 진행했다.

저번주 주말에 랭킹 조회를 구현했다.

 

랭킹 전체 조회

rankingRouter.get('/Ranking/AllCheck', async (req, res, next) => {
    // rankingScore 컬럼을 기준으로 내림차순한 전체 데이터 값들을 가져옴
    const currentRankings = await prisma.ranking.findMany({
        orderBy: {
            rankingScore: 'desc'
        }
    });
    
    return res.status(200).json({ ... currentRankings });
});

 

ranking Table에 들어있는 값을 전부 읽어온다.

rankingScore 값을 기준으로 내림차순해서 클라이언트에게 전달한다.

 

 

특정 유저 랭킹 조회

rankingRouter.get('/Ranking/SingleCheck/:userId', async (req, res, next) => {
    const { userId } = req.params;

    const userRanking = await prisma.ranking.findFirst({
        where: {
            userId: +userId
        }
    })

    return res.status(200).json({ userRanking });
});

 

조회하고자 하는 유저의 id값을 받아서 ranking table에 읽어온 후 클라이언트에게 전달한다.

 

DBRankingChangeScore ( 순위 변동 계산 )

export async function DBRankingChangeScore() {    
    const currentRankings = await prisma.ranking.findMany({
        orderBy: {
            rankingScore: 'desc'
        }
    });

    // 순서대로 순회하며 랭킹 설정
    let rank = 1;
    currentRankings.map((currentRanking) => {
        currentRanking.rank = rank;
        rank++;
    });


    // 순위 변동 계산
    for (let pRankKey in previousRankings) {
        const pRankData = previousRankings[pRankKey];
        for (let cRankKey in currentRankings) {
            const cRankData = currentRankings[cRankKey];
            if (pRankData.userId == cRankData.userId) {
                const rankChangeScore = pRankData.rank - cRankData.rank;

                cRankData.rankChangeScore = rankChangeScore;
                break;
            }
        }
    }

    const rankingTableUpdateFinish = async (tx) => {
        // ranking Table에 순위와 순위 변동을 기록
        await Promise.all(
            currentRankings.map(async (currentRanking) => {
                await tx.ranking.update({
                    where: {
                        userId: currentRanking.userId
                    },
                    data: {
                        rank: currentRanking.rank,
                        rankChangeScore: currentRanking.rankChangeScore
                    }
                })
            })
        );
    };
    await executeTransaction(rankingTableUpdateFinish);

    // 현재 시점 순위 변동 저장
    previousRankings = currentRankings;
}

 

이전 ranking table의 값과 DBRankingChangeScore을 호출했을 때의 ranking table의 값을 비교해서 순위변동을 계산하고,

DB에 저장한다.

 

app.js

DBRankingChangeScore();

setInterval(() => {
  DBRankingChangeScore();
}, process.env.RANKING_RANK_CHANGE_TIME);

 

서버가 켜질때, 우선 DBRankingChangeScore()를 호출해서 랭킹 데이터를 최신화 시켜준다.

서버에서 정한 일정 시간마다 DBRankingChangeScore()를 호출해서 순위를 계산해준다.

 

 

프론트엔드는 아래와 같이 구성했다.

로그인 화면

 

회원가입 화면

 

게임 화면

+ Recent posts