ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • EF Core 테이블 상속 매핑(TPC)
    .NET/Database 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 전략은 독립적인 엔터티를 개별적으로 관리해야 하며, 성능 최적화가 필요한 경우 적합합니다.
    로그 시스템처럼 서로 다른 성격의 데이터를 분리해서 저장해야 하는 경우에 효과적인 선택이 될 수 있습니다.

    '.NET > Database' 카테고리의 다른 글

    50 EF Core Interview Questions (1~25)  (0) 2025.03.11
    EF Core 테이블 상속 매핑 (TPH)  (0) 2025.03.10
    EF Core 테이블 상속 매핑 (TPT)  (0) 2025.02.17
    EF Core - (부록) Project Setup  (0) 2025.02.03
    EF Core - Code First  (0) 2025.01.11
Designed by Tistory.