게임 웹서버 만들기

유저 프로필 - 게임 웹서버 만들기 10

소수결게임 2025. 12. 23. 18:43

 

게임 내 유저 프로필 API를 설계해보겠습니다.

 

다음과 같은 프로필 항목을 가정하고 API를 설개합니다

① 프로필 캐릭터 액자  : 프로필 캐릭터를 감싸는 외적 요소

② 프로필 캐릭터

③ 닉네임

④ 유저의 uId

⑤ 자기소개글

⑥ 뱃지/트로피/랭킹 등  : 향후 기획 변경 및 추가를 고려하여 확장 가능한 구조를 전제로 설계

 

 


[DB 설계]

 

 

 


[Mysql 트랜젝션 추가]

유저가 최초 생성될 때는 User 테이블과 UserProfile 테이블함께 생성되어야 합니다.

두 테이블은 하나의 작업 단위이므로

중간에 에러가 발생할 경우 전체 작업이 롤백되어야 합니다.

 

이를 위해 MySql 트랜잭션을 적용하여 두 작업을 하나의 작업으로 처리하도록 하겠습니다.

 

 

제공 기능 : 

BeginTransaction

Commit

Rollback

 


[기존의 Auth 코드 리팩토링]

이제 유저 생성 시 UserProfile 테이블도 함께 생성되도록 구조가 변경될 예정입니다.

 

기존의 Auth클래스가 유저 조회, 생성, 프로필까지 생성하게되면 책임이 점점 커진다고 생각되어

책임을 분리하기 위해

유저 생성, 조회 기능을 UseCase로 빼내었습니다.

 

기존의 Auth의 경우,

각 플랫폼에서 플랫폼별 유저 코드를 획득하는 기능만 남겨둡니다.

 


[유저 조회 및 생성]

유저 조회, 생성, 유저 프로필 생성을 하나의 UseCase로 묶어 한번에 처리하겠습니다.

 

1. 유저를 조회한다.

2. 유저가 존재하지 않을경우

   - 유저 테이블에 유저를 생성한다.

   - 유저 프로필 테이블에 유저를 생성한다.

 

유저 프로필 생성시에는 미리 정의해둔 Default값을 사용합니다.

 

 

이제 로그인시 프로필도 함께 생성됩니다.


[프로필 조회]

프로필 조회의 경우

유저의 프로필 정보와 프로필에 연결된 뱃지 목록을 DB에서 조회하여 응답값으로 반환합니다.

 

프로필 화면에서 필요한 정보를 한번의 Api호출로 조회할 수 있도록 구성하여 불필요한 네트워크 통신을 줄입니다.

성공적으로 프로필 정보를 얻을 수 있습니다.

 


[프로필 변경]

프로필 변경 API에서는

각 프로필 항목에 대해 변경 여부를 나타내는 Bool 값을 함께 전달받아

실제로 변경된 항목만 DB에 Update하도록 구현하였습니다.

 

본 예시에서는 하나의 API에서 모든 프로필 항목을 변경할 수 있도록 설계하였습니다.

다만 기획에 따라 각각의 API로 분리하여 구현하는 것도 가능합니다.

 

 

var setClauses = new List<string>();
var parameters = new DynamicParameters();
if (isChangeNickName)
{
    setClauses.Add("Nickname = @nickname");
    parameters.Add("nickName", nickName);
}
if (isChangeLabel)
{
    setClauses.Add("LabelId = @label_id");
    parameters.Add("labelId", labelId);
}
if (isChangeMessage)
{
    setClauses.Add("Message = @message");
    parameters.Add("message", message);
}
if (setClauses.Count == 0)
{
    return false; 
}

 

 

각 항목에 대해 변경 여부를 확인한 뒤,

변경되는 항목만 추가합니다.

var setClause = string.Join(", ", setClauses);
var SQL = $@"
    UPDATE UserProfile
    SET {setClause}
    WHERE uId = @uId;";


var result = await _session.Connection.ExecuteAsync(SQL, parameters,
transaction: _session.Transaction);

변경된 컬럼만 UPDATE 쿼리를 실행합니다.

 

 

테스트로 닉네임을 방랑자로 변경하보겠습니다.

 

성공적으로 반영되었습니다.

 

 


[코드]

github

https://github.com/Minoritygames2/WebServerPortfolio