.NET/Database

EF Core 테이블 상속 매핑(TPC)

atawlee 2025. 3. 10. 15:02

TPC (Table Per Concrete) 매핑 전략

TPC(Table Per Concrete) 매핑 방법은 부모 클래스의 테이블을 생성하지 않고, 자식 테이블에서 부모 타입의 속성을 공통적으로 포함하는 전략입니다.

 

 

 

1. Log 클래스 작성

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Database.Entity;

public abstract class Log
{
    [Key]
    public int Id { get; set; }
    public DateTime Timestamp { get; set; } = DateTime.UtcNow;
    [MaxLength(1000)]
    public string Message { get; set; } = string.Empty;
}

public class SystemLog : Log
{
    [MaxLength(50)]
    public string LogLevel { get; set; } = "Info";  // 예: "Info", "Warning", "Critical"
}

public class ErrorLog : Log
{
    [MaxLength(1000)]
    public string ExceptionMessage { get; set; } = string.Empty;
    [MaxLength(1000)]
    public string StackTrace { get; set; } = string.Empty;
}

 

2. DbContext 작업

//이전 작업내용은 생략합니다. 

public partial class ShopDbContext : DbContext
{
    public DbSet<SystemLog> SystemLogs { get; set; }
    public DbSet<ErrorLog> ErrorLogs { get; set; }
    
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Log>()
            .UseTpcMappingStrategy();
    }
}

 

3. TPC 매핑 전략 특징

  • Log 테이블은 생성되지 않음.
  • SystemLogs와 ErrorLogs 테이블이 각각 생성되며, Log 클래스의 공통 속성(Id, Timestamp, Message)을 포함.
  • DbSet<Log>이 없으므로 Log 타입만 단순히 공통 구조를 제공.

4. TPC 전략의 활용 포인트

📌 언제 TPC를 사용해야 할까?

1. 추상 클래스의 인스턴스를 직접 저장할 필요가 없을 때

  • Log 테이블을 따로 만들지 않고, 공통된 컬럼을 개별 테이블(SystemLogs, ErrorLogs)에서 유지할 때 유용합니다.
  • DbSet<Log>을 사용하지 않으므로, 부모 클래스의 인스턴스를 직접 저장할 필요가 없습니다.

2. 공통 테이블 없이 동일한 컬럼 구조를 가지도록 할 때

  • Log 테이블 없이도 Id, Timestamp, Message와 같은 공통 필드를 자동으로 포함하는 방식입니다.
  • 테이블 간 스키마 일관성을 유지하면서도 개별 테이블로 분리할 수 있습니다.

3. 자식 클래스가 독립적인 테이블로 존재해야 할 때

  • SystemLog와 ErrorLog가 개별 테이블로 저장되므로, 특정 로그 타입만 선택적으로 관리하기가 쉽습니다.
  • 필요에 따라 특정 로그 테이블(SystemLogs 또는 ErrorLogs)만 조회할 수 있어 운영이 간편합니다.

4. 테이블 조인을 최소화하고 성능을 향상하고 싶을 때

  • 부모 테이블이 없으므로 조인 부담이 사라지며, 직접적으로 테이블을 조회할 수 있습니다.
  • 예를 들어, SystemLogs 테이블만 빠르게 검색하고 싶을 때, 추가적인 조인 없이 바로 데이터를 가져올 수 있습니다.
  • 테이블이 독립적으로 존재하기 때문에, TPT(Table Per Type)보다 조회 성능이 개선될 수 있습니다.

5. 결론

TPC 전략은 독립적인 엔터티를 개별적으로 관리해야 하며, 성능 최적화가 필요한 경우 적합합니다.
로그 시스템처럼 서로 다른 성격의 데이터를 분리해서 저장해야 하는 경우에 효과적인 선택이 될 수 있습니다.