모델과 데이터베이스 스키마 동기화 전략
Entity Framework Core는 애플리케이션의 도메인 모델과 실제 데이터베이스 스키마 간의 일관성을 유지하기 위해 두 가지 주요 접근 방식을 제공합니다.
- 코드 퍼스트(Code First): C# 클래스 기반 모델을 출발점으로 삼아, 이를 바탕으로 데이터베이스 스키마를 생성하거나 업데이트합니다. 이 방식은 개발자가 코드로 비즈니스 로직을 설계한 후 EF가 이를 반영하는 데이터베이스 구조를 자동 생성하는 데 적합합니다.
- 데이터베이스 퍼스트(Database First): 기존 데이터베이스를 기반으로 C# 엔티티 클래스와 컨텍스트를 역으로 생성합니다. 이는 기존 시스템 통합이나 레거시 DB 활용에 유리합니다.
마이그레이션 작업 관리 방법
코드 퍼스트 방식에서 변경 사항을 데이터베이스에 반영하려면 마이그레이션(Migration) 절차를 사용해야 합니다. 이를 위한 도구는 다음 두 가지입니다.
.NET CLI (권장: 크로스 플랫폼 지원)
Linux, macOS, Windows 어디서나 사용 가능하며 CI/CD 파이프라인과 잘 통합됩니다.
// dotnet-ef 글로벌 도구 설치
dotnet tool install --global dotnet-ef
// 업그레이드
dotnet tool update --global dotnet-ef
// 프로젝트에 디자인 패키지 추가 (필수)
dotnet add package Microsoft.EntityFrameworkCore.Design
// 마이그레이션 생성 예시
dotnet ef migrations add AddProductTable
// 데이터베이스에 적용
dotnet ef database update
Visual Studio 패키지 관리자 콘솔
Windows 기반 Visual Studio 환경에서 편리하게 사용할 수 있습니다.
// 필요한 도구 설치
Install-Package Microsoft.EntityFrameworkCore.Tools
// 마이그레이션 추가 및 적용
Add-Migration CreateOrderSchema
Update-Database
핵심 마이그레이션 명령어
마이그레이션 파일 경로 지정
dotnet ef migrations add --output-dir Migrations/Orders AddOrderDetails
특정 폴더에 마이그레이션 파일을 저장하여 프로젝트 구조를 정리할 수 있습니다.
마이그레이션 취소
dotnet ef migrations remove
가장 최근에 추가된 마이그레이션을 제거합니다. 데이터베이스에 아직 반영되지 않았을 경우에만 안전하게 실행 가능합니다.
등록된 마이그레이션 목록 확인
dotnet ef migrations list
현재 프로젝트에 존재하는 모든 마이그레이션 항목과 적용 상태를 표시합니다.
보류 중인 모델 변경 감지
CLI로 확인:
dotnet ef migrations has-pending-model-changes
코드 내에서 확인:
if (context.Database.HasPendingModelChanges())
{
Console.WriteLine("모델에 반영되지 않은 변경 사항이 있습니다.");
}
모든 마이그레이션 초기화
완전히 처음부터 시작하고자 할 때 아래 절차를 따릅니다.
Migrations폴더 전체 삭제- DB의
__EFMigrationsHistory테이블 내용 전체 제거 - 필요 시 데이터베이스 삭제 또는 재생성
SQL 스크립트 생성
실제 SQL 문을 추출하여 스크립트 형태로 배포할 수 있습니다.
// 최초 → 최신까지의 전체 스크립트 생성
dotnet ef migrations script
// 특정 마이그레이션 이후부터 적용되는 스크립트
dotnet ef migrations script AddCustomerEntity
// 두 마이그레이션 사이의 차이만 추출
dotnet ef migrations script AddUser LoginRefactor
//冪等성(idempotent) 스크립트 생성: 이미 적용된 환경에서도 안전하게 실행
dotnet ef migrations script --idempotent
이 옵션은 프로덕션 배포 시 매우 유용하며, 중복 실행을 방지하면서 누락된 마이그레이션만 적용합니다.
실행 가능한 마이그레이션 번들 생성
스크립트 기반 배포의 한계를 극복하기 위한 솔루션입니다. 별도의 .NET SDK 없이도 실행 가능한 독립형 바이너리를 생성합니다.
// 기본 번들 생성 (efbundle.exe)
dotnet ef migrations bundle
// 기존 번들 덮어쓰기
dotnet ef migrations bundle --force
// 자체 포함(self-contained) 리눅스용 번들 생성
dotnet ef migrations bundle --self-contained -r linux-x64
생성된 실행 파일은 다음과 같이 사용할 수 있습니다.
./efbundle --connection "Server=localhost;Database=AppDb;Trusted_Connection=true;"
이 방식은 DevOps 파이프라인에서 특히 유리합니다. 소스 코드 없이도 서버에서 직접 마이그레이션을 수행할 수 있으며, 트랜잭션 처리와 오류 복구 메커니즘이 더 신뢰할 수 있습니다.