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: 데이터 손실이 발생할 수 있는 변경(예: 컬럼 삭제)도 허용합니다.
⚠️ 주의: 실제 운영 환경에서는
AutomaticMigrationDataLossAllowed를true로 설정하는 것은 위험하므로, 개발용 환경에서만 사용하세요.
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설정으로 인해 컬럼 삭제가 성공적으로 수행됩니다.
✅ 결과: 데이터베이스 스키마가 코드 변경에 따라 자동으로 동기화됩니다.
결론
코드 중심 개발 시 데이터베이스 스키마 관리는 중요한 과제입니다. 마이그레이션 기능을 통해 이러한 작업을 자동화함으로써 개발 생산성과 유지보수 용이성을 크게 향상시킬 수 있습니다. 특히 복잡한 모델 변경 시, 수작업 스키마 조정 없이도 안정적인 데이터베이스 상태를 유지할 수 있습니다.