대형 프로젝트 - C# + 유니티로 만드는 MMORPG 게임 개발/(5) EF Core

Shadow Property & Backing Field

monstro 2025. 8. 19. 11:00
728x90
반응형

- 개요

EF-Core에서 사용할 수 있는 Shadow PropertyBacking Field에 대해서 알아보겠습니다.

두 개의 요소에 대해 다음과 같이 정리할 수 있습니다.

  • Shadow Property : DB에는 존재하지만, Class에는 존재하지 않도록 설정하는 방식
  • Backing Field : private field를 DB에 매핑하고, public getter로 가공하여 사용하는 방식

 

1) Shadow Property 사용예시

1 - 1) AppDBContext 클래스

...

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    ...

    // Shadow Property
    modelBuilder.Entity<Item>().Property<DateTime>("RecoveredDate");
}

 

Shadow Property는 위와 같이 .Property<자료형>("열이름")의 구성으로 생성할 수 있습니다.

예시에서는 DateTime의 데이터RecoveredDate라는 이름으로 Shadow Property를 생성합니다.

 

1 - 2) DBCommands 클래스

...

public static void CreateTestData(AppDBContext db)
{
    ...

    // Shadow Property Test
    db.Entry(items[0]).Property("RecoveredDate").CurrentValue = DateTime.Now;

    ...

    db.SaveChanges();
}

 

Shadow Property에 Read / Write를 하기 위해서는 .Property("열이름").CurrentValue로 접근합니다.

예시에서는 Items 데이터 테이블첫 번째 데이터의 Shadow Property에 값을 작성합니다.

 

1 - 3) 최종 실행 결과

 

첫 번째 Item의 Shadow Property가 위와 같이 설정된 것을 확인할 수 있습니다.

 

2) Backing Field 사용예시

2 - 1) DataModel 클래스

public struct ItemOption
{
    public int str;
    public int dex;
    public int hp;
}

[Table("Item")]
public class Item
{
    private string? _jsonData;
    public string? JsonData 
    { 
        get { return _jsonData; }
    }

    public void SetOption(ItemOption opt)
    { 
        _jsonData = JsonConvert.SerializeObject(opt);
    }

    public ItemOption GetOption()
    {
        return JsonConvert.DeserializeObject<ItemOption>(_jsonData);
    }

    ...
}

 

Item 엔티티 클래스새로운 filed인 _jsonData를 추가하고 ItemOption 구조체의 데이터를 저장합니다.

이때 해당 filed의 데이터를 Read / Write하기 위해서는 public 함수를 사용하여 접근합니다.

예시는 다음과 같이 구성하였습니다.

DB에는 json 형태로 string을 가공하여 저장하고, getter는 저장된 json을 string으로 가공하여 사용합니다.

 

2 - 2) AppDBContext 클래스

...

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    ...

    // Fluent API 방식으로 누락된 Setter 완성
    modelBuilder.Entity<Item>()
        .Property(i => i.JsonData)
        .HasField("_jsonData");
}

 

누락된 Setter 프로퍼티 OnModelCreating 함수에서 정의합니다.

 

2 - 3) DBCommands 클래스

public static void CreateTestData(AppDBContext db)
{
    ...

    // Test Backing Field
    items[0].SetOption(new ItemOption { str = 100, dex = 100, hp = 100 });

    ...

    db.SaveChanges();
}

 

CreateTestData 함수에서 Backing Field를 통해 첫 번째 아이템새로운 ItemOption 데이터를 추가합니다.

 

2 - 4) 최종 실행 결과

 

위와 같이 데이터가 추가된 것을 확인할 수 있습니다.

728x90
반응형

'대형 프로젝트 - C# + 유니티로 만드는 MMORPG 게임 개발 > (5) EF Core' 카테고리의 다른 글

Backing Field + Relationship  (0) 2025.08.25
Entity Class와 Data Table 연동  (0) 2025.08.19
Relationship Configuration  (0) 2025.08.18
Configuration  (0) 2025.08.18
Delete  (0) 2025.08.12