내일배움캠프

내일배움캠프 Unity - TIL : 25.04.24

달시_Dalsi 2025. 4. 24. 21:08
728x90

오늘 학습한 내용

1) 저장&불러오기 시스템에서의 마이그레이션 기능 구현

저장 데이터 구조 변경 시 이전 버전의 데이터를 자동으로 변환해 최신 구조에 맞추는 마이그레이션 시스템을 도입했습니다. 이를 통해 유저 데이터의 호환성과 안정성을 확보했습니다.


문제 및 해결 과정

1) 문제 (게임 업데이트 후 이전 저장 데이터가 불러와지지 않음)

게임의 저장 데이터 구조가 변경되며, 구버전에서 저장된 데이터를 역직렬화할 때 오류가 발생하거나 필드가 누락되는 문제가 있었습니다.

 

시도한 해결 방법

  • SaveData 구조체에 version 필드 추가
  • 불러오기 시 version을 기준으로 데이터 구조를 점진적으로 변환하는 MigrateData() 함수 작성
  • 필드 삭제/추가에 대비하여 [JsonExtensionData]를 사용해 미지정 필드도 버리지 않고 보존

예시 – PlayerData 구조

[Serializable]
public struct PlayerData
{
    [JsonProperty("gold")]
    public int gold;

    [JsonExtensionData]
    public Dictionary<string, JToken> extraPlayerFields;
}

 

 

예시 – 마이그레이션 처리

 // 버전 1 -> 버전 2 (예시로 language 필드 추가)
 if (data.version == 1)
 {
     data.settings = new SettingsData
     {
         bgmVolume = Mathf.Clamp(data.settings.bgmVolume, 0f, 1f),
         sfxVolume = Mathf.Clamp(data.settings.sfxVolume, 0f, 1f),
         language = "en", // 기본 언어 설정
         extraSettingsFields = data.settings.extraSettingsFields ?? new Dictionary<string, JToken>()
     };
     data.version = 2;
 }

 // 버전 2 -> 버전 3 (PlayerData의 nickName 삭제)
 if (data.version == 2)
 {
     data.player = new PlayerData
     {
         gold = Mathf.Max(0, data.player.gold),
         extraPlayerFields = new Dictionary<string, JToken>()
     };
     data.version = 3;
 }

 

 

결과

  • 구조 변경이 발생해도 데이터 유실 없이 안정적으로 로드할 수 있게 되었습니다.
  • 역직렬화 예외 없이 하위 호환성을 유지할 수 있었으며 구조 변경 시에도 수월하게 마이그레이션 처리를 할 수 있게 되었습니다.
  • 개발 중 구조 변경에 유연하게 대응할 수 있어, 장기적인 유지보수 측면에서도 유리하다고 판단했습니다.

 

 


새롭게 알게 된 점

데이터 버전 관리의 중요성

구조가 자주 바뀌는 게임일수록 version 필드를 활용한 마이그레이션 설계가 필수적입니다.

 

JsonExtensionData의 유용성

예기치 못한 필드 변경에 대응할 수 있는 강력한 기능입니다. 유연한 구조 변경을 위해 이용할 가치가 있습니다.

 

클라우드 저장 구조 설계 시 고려 사항

기본값 설정, 유효성 검사, 예외 처리 등을 반드시 함께 고려해야 합니다. 데이터 구조만 짜는 것으로는 부족합니다.

728x90