ASP.NET MVC에서 Code First를 활용한 데이터베이스 마이그레이션

Code First 모델 변경 시 자동 마이그레이션 적용 방법

ASP.NET MVC에서 Entity Framework의 Code First 방식을 사용할 경우, 엔티티 클래스의 속성이 추가되거나 삭제되면 해당 변경 사항이 데이터베이스 스키마에 반영되어야 합니다. 단일 속성 변경은 수작업으로 처리할 수 있지만, 여러 클래스에 걸쳐 속성을 다수 수정해야 하는 경우 수동 작업은 비효율적입니다. 이를 해결하기 위해 EF의 마이그레이션 기능을 활용하면 스키마 변화를 자동으로 관리할 수 있습니다.

1. 컨텍스트 및 엔티티 정의

다음은 테스트용 TestEF 컨텍스트와 관련된 엔티티 클래스입니다. 이 예제에서는 선생님과 학급 정보를 관리합니다.

namespace WebApplication2
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.Data.Entity;

    public class TestEF : DbContext
    {
        public TestEF() : base("name=TestEF") { }

        public DbSet<Teacher> Teachers { get; set; }
        public DbSet<Grade> Grades { get; set; }
    }

    [Display(Name = "선생님")]
    public class Teacher
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }

        [Display(Name = "이름")]
        public string FullName { get; set; }

        // 잠시 주석 처리된 속성: 연령 정보
        // public int Age { get; set; }

        public virtual ICollection<Grade> AssignedGrades { get; set; }
    }

    [Display(Name = "학급")]
    public class Grade
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }

        [Display(Name = "학급명")]
        public string ClassName { get; set; }

        public virtual ICollection<Teacher> Instructors { get; set; }
    }
}

2. 마이그레이션 활성화

패키지 관리자 콘솔에서 다음 명령어를 실행하여 마이그레이션을 시작합니다.

Enable-Migrations -ContextTypeName WebApplication2.TestEF

이 명령어를 실행하면 프로젝트 루트에 Migrations 폴더가 생성되며, 내부에는 Configuration.cs 파일이 포함됩니다. 이 파일은 마이그레이션 설정을 제어합니다.

internal sealed class Configuration : DbMigration
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = true;
        AutomaticMigrationDataLossAllowed = true;
    }

    public override void Up()
    {
        // 초기 스키마 정의 (자동 생성됨)
    }

    public override void Down()
    {
        // 롤백 시 수행될 작업
    }
}
  • AutomaticMigrationsEnabled = true: 모델 변경 시 자동으로 마이그레이션을 생성합니다.
  • AutomaticMigrationDataLossAllowed = true: 데이터 손실이 발생할 수 있는 변경(예: 컬럼 삭제)도 허용합니다.

⚠️ 주의: 실제 운영 환경에서는 AutomaticMigrationDataLossAllowedtrue로 설정하는 것은 위험하므로, 개발용 환경에서만 사용하세요.

3. 애플리케이션 시작 시 마이그레이션 적용

Global.asax 또는 Startup.cs에서 데이터베이스 초기화 전략을 설정합니다.

Database.SetInitializer(new MigrateDatabaseToLatestVersion<TestEF, Migrations.Configuration>("TestEF"));

이 설정은 애플리케이션 실행 시 최신 마이그레이션을 자동으로 적용하도록 합니다.

4. 데이터 삽입 테스트

HomeController에서 간단한 테스트 데이터를 생성하여 데이터베이스가 올바르게 생성되었는지 확인합니다.

public class HomeController : Controller
{
    public ActionResult Index()
    {
        using (var context = new TestEF())
        {
            var teacher = new Teacher { FullName = "김민수" };
            var grade = new Grade { ClassName = "1학년 1반" };

            teacher.AssignedGrades = new List<Grade> { grade };
            grade.Instructors = new List<Teacher> { teacher };

            context.Teachers.Add(teacher);
            context.Grades.Add(grade);
            context.SaveChanges();
        }

        return View();
    }
}

5. 마이그레이션 동작 검증

  • 속성 추가: Teacher 클래스에 Age 속성을 다시 추가하면, 데이터베이스의 Teachers 테이블에 Age 컬럼이 자동으로 생성됩니다.
  • 속성 삭제: Age 속성을 제거하고 애플리케이션을 다시 실행하면, AutomaticMigrationDataLossAllowed = true 설정으로 인해 컬럼 삭제가 성공적으로 수행됩니다.

✅ 결과: 데이터베이스 스키마가 코드 변경에 따라 자동으로 동기화됩니다.

결론

코드 중심 개발 시 데이터베이스 스키마 관리는 중요한 과제입니다. 마이그레이션 기능을 통해 이러한 작업을 자동화함으로써 개발 생산성과 유지보수 용이성을 크게 향상시킬 수 있습니다. 특히 복잡한 모델 변경 시, 수작업 스키마 조정 없이도 안정적인 데이터베이스 상태를 유지할 수 있습니다.

태그: Entity Framework Code First database migration ASP.NET MVC C#

6월 6일 16:31에 게시됨