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

Configuration

monstro 2025. 8. 18. 11:17
728x90
반응형

- 개요

Configuration Entity 클래스간의 관계나 속성등을 DB에 매핑하는 방법을 정의하는 것을 의미합니다.

Configuration을 수행하는 방법은 총 3가지가 존재합니다.

  • Convention : 데이터에 대한 형식을 미리 정의하여 EF-Core에서 형식에 맞춰 알아서 처리
  • Data Annotation : Entity 클래스의 클래스 이름이나 Property어트리뷰트를 수식
  • Fluent API :  OnModelCreating 함수에서 직접 설정을 정의

 

각각의 사용예시는 다음과 같습니다.

public class Item
{
    public int ItemId { get; set; }
}

 

위의 예시는 Convention 방식입니다.

 

[Table("Player")]
public class Player
{
    public int PlayerId { get; set; }

    [Required]
    [MaxLength(20)]
    public string Name { get; set; }
    public Item Item { get; set; }
    public Guild? Guild { get; set; }
}

 

위의 예시는 Data Annotation 방식입니다.

 

...

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Item>().HasQueryFilter(i => i.SoftDeleted == false);
    modelBuilder.Entity<Player>()
        .HasIndex(p => p.Name)
        .HasName("Index_Person_Name")
        .IsUnique();
}

 

위의 예시는 Fluent API 방식입니다.

 

- Convention 방식을 통한 Configuration 작성시의 주의사항

Configuration 방식에서 우선순위는 다음과 같습니다.

  • 3) Configuration
  • 2) Data Annotation
  • 1) Fluent API

위에서 아래로 갈수록 우선순위가 높아지게 됩니다.

따라서 Configuration 방식을 사용하면 가장 간단한 방식으로만 Configuration을 작성할 수 있습니다.

 

1) Entity 클래스 관련

  • 클래스는 반드시 public 접근 제어자 + non-static으로 정의
  • EF-Core는 property 중에서 public getter를 찾으면서 분석
  • property 이름 = 테이블의 열 이름

 

2) 이름, 형식, 크기 관련

  • .Net 형식의 데이터SQL 형식의 데이터에 대응함
  • .NET 형식으로 작성된 Nullable 여부를 따라감

 

3) 기본키 관련

  • id 혹은 클래스이름+id로 작성하고 이렇게 정의된 property는 기본키로 인정, 후자의 방식이 권장
  • 단, 복합키는 Convention 방식에서 처리가 불가능

 

- 3가지 Configuration 방식의 사용

1) Nullable을 3가지 Configuration 방식으로 처리

  • Convention 방식 : Nullable
  • Data Annotation 방식 : [Reguired]
  • Fluent API 방식 : .IsRequired()

 

2) 문자열 길이를 3가지 Configuration 방식으로 처리

  • Convention 방식 : 없음
  • Data Annotation 방식 : [MaxLength(20)]
  • Fluent API 방식 : .HasMaxLength(20)

 

3) 문자 형식을 3가지 Configuration 방식으로 처리

  • Convention 방식 : 없음
  • Data Annotation 방식 : 없음
  • Fluent API 방식 : .IsUnicode(true)

 

4) 기본키를 3가지 Configuration 방식으로 정의

  • Convention 방식 : id 또는 Entity클래스이름 + id
  • Data Annotation 방식 : [Key][Column(Order=0)] [Key][Column(Order=1)]
  • Fluent API 방식 : .HasKey(x => new {x.Prop1, x.Prop2})

 

5) Fluent API 방식으로 Index를 추가(Fluent API에서만 가능)

  • Index를 추가 : .HasIndex(p => p.Prop1)
  • 복합 Index를 추가 : .HasIndex(p => new {p.Prop1, p.Prop2})
  • Index 이름을 정해서 추가 : .HasIndex(p => p.Prop1).HasName("Index_MyProp")
  • 고유 Index를 추가 :  .HasIndex(p => p.Prop1).IsUnique()

 

6) 테이블 이름을 3가지 Configuration 방식으로 설정

  • Convention 방식 : DbSet<T> 프로퍼티이름 또는 클래스이름
  • Data Annotation 방식 : [Table("MyTable")]
  • Fluent API 방식 : .ToTable("MyTable")

 

7) 열 이름을 3가지 Configuration 방식으로 설정

  • Convention 방식 : property 이름
  • Data Annotation 방식 : [Column("MyCol")]
  • Fluent API 방식 : .HasColumnName("MyCol")

 

8) 코드 모델링에서는 사용하되, DB 모델링에서는 제외하고 싶은 경우

  • Convention 방식 : 없음
  • Data Annotation 방식 : [NotMapped]
  • Fluent API 방식 : .Ignore()

 

9) Soft Delete의 구현(Fluent-API에서만 가능)

  • Fluent API 방식 : .HasQueryFilter()

 

- 결론

3가지 Configuration 방식을 사용하는 시점은 다음과 같이 정리할 수 있습니다.

  • Convention 방식 : 일반적인 상황에서 가장 무난하게 사용가능
  • Data Annotation 방식 : Validation과 관련한 요소들은 Data Annotation이 유리함
  • Fluent API 방식 : 그 외의 경우는 Fluent API 사용
728x90
반응형

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

Shadow Property & Backing Field  (0) 2025.08.19
Relationship Configuration  (0) 2025.08.18
Delete  (0) 2025.08.12
Relationship Update  (0) 2025.08.12
외래키와 Nullable  (0) 2025.08.11