언리얼 엔진 - 게임 프로젝트/AWS GameLift를 활용한 데디케이트 FPS 프로젝트

Dynamo DB - 3) MatchPlayerState 데이터 처리

monstro 2026. 7. 25. 18:19
728x90
반응형

- 개요

MatchPlayerState 클래스의 일부

 

프로젝트에서 사용하는 PlayerState 클래스인 MatchPlayerState 클래스에는 

진행된 게임의 결과와 관련된 여러 변수를 포함하고 있다

따라서 하나의 게임이 종료된 후해당 변수들의 값을 Dynamo DB 데이터 테이블에 추가하는 람다 함수를 생성한다

 

- 절차

1) 람다 함수 생성 및 구성

 

MatchState의 변수의 값을 Dynamo DB의 테이블에 반영하는 RecordMatchStats 람다 함수를 생성한다

 

 

생성한 람다 함수에 대한 REGION 환경 변수를 추가하여 로직에서 리전에 접근할 수 있도록 구성하고

USER_POOL_ID 환경 변수를 추가하여 로직에서 User Pool에 접근할 수 있도록 구성한다

 

2) 정책 설정

2 - 1) 정책 설정 - AdminGetUser 리소스

RecordMatchStats 람다 함수에 부여할 정책 설정 (1)

 

생성할 람다 함수에 부여할 정책을 설정한다

우선, CognitoUserPoolsAdminGetUser 리소스를 사용할 수 있도록 설정한다

관리자 권한으로 특정 User Pool에 대한 사용자의 정보를 가져올 수 있도록 구성한다

이때 현재 사용중인 User Pool의 ARN을 추가해야 한다

 

 

생성한 정책의 이름을 위와 같이 설정한다

 

2 - 2) 정책 설정 - GetItem 리소스

RecordMatchStats 람다 함수에 부여할 정책 설정 (2)

 

2 - 1)에서 생성한 DS_RecordMatchStats 정책에 DynamoDBGetItem 리소스를 사용하도록 추가한다

GetItem은 Dynamo DB의 테이블에서 단일 아이템 조회하는 목적으로 사용한다

 

 

추가한 GetItem 리소스에 대해 현재 사용중인 Players 테이블과 User Pool의 ARN을 설정한다

 

2 - 3) 정책 설정 - PutItem 리소스

RecordMatchStats 람다 함수에 부여할 정책 설정 (3)

 

2 - 1)에서 생성한 DS_RecordMatchStats 정책에 DynamoDB의 PutItem 리소스를 사용하도록 추가한다

GetItem은 Dynamo DB의 테이블에서 단일 아이템 생성하거나 덮어쓰기하는 목적으로 사용한다

 

3) 람다 함수 정의

import { CognitoIdentityProviderClient, AdminGetUserCommand } from "@aws-sdk/client-cognito-identity-provider";
import { DynamoDBClient, GetItemCommand, PutItemCommand } from "@aws-sdk/client-dynamodb";
import { marshall, unmarshall } from "@aws-sdk/util-dynamodb";

export const handler = async (event) => {
  const cognitoIdentityProviderClient = new CognitoIdentityProviderClient( { region: process.env.REGION } );
  const dynamoDBClient = new DynamoDBClient( { region: process.env.REGION } );
  try {
    const adminGetUserInput = {
      Username: event.username,
      UserPoolId: process.env.USER_POOL_ID
    };
    const adminGetUserCommand = new AdminGetUserCommand(adminGetUserInput);
    const adminGetUserResponse = await cognitoIdentityProviderClient.send(adminGetUserCommand);

    const sub = adminGetUserResponse.UserAttributes.find(attribute => attribute.Name === "sub").Value;
    const email = adminGetUserResponse.UserAttributes.find(attribute => attribute.Name === "email").Value;
    
    const getItemInput = {
      TableName: "Players",
      Key: marshall( { databaseid: sub } ),
    };

    const getItemCommand = new GetItemCommand(getItemInput);
    const getItemResponse = await dynamoDBClient.send(getItemCommand);
    let statsFromDB = getItemResponse.Item ? unmarshall(getItemResponse.Item) : { databaseid: sub };

    const eventMatchStats = event.matchStats;

    for (const key in eventMatchStats) {
      if (statsFromDB[key] !== undefined) {
        statsFromDB[key] += eventMatchStats[key];
      } else {
        statsFromDB[key] = eventMatchStats[key];
      }
    }

    const putItemInput = {
      TableName: "Players",
      Item: marshall( { ...statsFromDB } )
    };
    const putItemCommand = new PutItemCommand(putItemInput);
    await dynamoDBClient.send(putItemCommand);

    return {
      statusCode: 200,
      body: `Updated match stats for ${event.username}`
    };
  } catch(error) {
    return error;
  }
};

 

RecordMatchStats 람다 함수의 코드를 위와 같이 구성한다

  • AdminGetUser 리소스를 사용하여 event.username을 통해 User Pool에서 해당 유저의 상세 정보를 반환
  • 상세 정보 중에서 sub 고유 식별자email 값을 추출
  • sub 값을 기본 키로 GetItem 리소스를 사용하여 Players 테이블에서 플레이어의 기존 정보를 조회
  • 기존 정보에 새로 들어온 event.matchStats 값을 합산
  • PutItem 리소스를 사용하여 갱신된 정보를 Players 테이블에 덮어씌움

 

- 최종 실행 결과

 

RecordMatchStats 람다 함수에 사용할 테스트 데이터를 위와 같이 구성한다

 

람다 함수 실행 후의 로그

 

테스트 실행 결과에서 위와 같이 statusCode : 200이 출력되어

성공적으로 테스트 데이터를 통한 람다 함수의 수행이 이뤄진 것을 확인할 수 있다

 

DynamoDB의 Players 테이블

 

Dynamo DB의 Players 테이블에서 hits와 misees 속성과 값이 추가된 것도 확인할 수 있다

728x90
반응형