EF Core 종합 가이드
EF Core 버전 요약
아래 표는 EF Core의 주요 버전과 그에 따른 변경 내용을 요약한 것입니다.
버전 | 출시 연도 | 주요 변경 내용 |
---|---|---|
EF Core 1 | 2016 | 초기 버전, 코드 기반 데이터베이스 마이그레이션(code-based database migration) 도입 |
EF Core 2 | 2017 | 성능 개선, LINQ에 'like' 연산자 지원 |
EF Core 3 | 2019 | LINQ에 'Intersect', 'Except' 연산자 및 Cosmos DB 지원 추가 |
EF Core 5 | 2020 | 성능 개선, LINQ 지원 강화, 새로운 데이터베이스 엔진 지원 |
EF Core 6 | 2021 | API 통합성 강화, 기능 개선, 성능 향상, JSON 열 지원, EF 6 호환 모드 추가 |
EF Core 7 | 2022 | 비동기 스트리밍 쿼리, 성능 및 진단 기능 강화, Azure Cosmos DB 지원 확대 |
EF Core 8 | 2023 | 성능 및 확장성 향상, LINQ 쿼리 기능 강화, 데이터베이스 프로바이더 통합 강화 |
각 버전은 EF Core의 발전과 함께 새로운 기능과 개선 사항을 제공합니다. 특히 EF Core 7 및 8에서는 사용자 경험과 통합 능력의 중요한 개선이 있었습니다.
Code First vs Database First
EF Core에서는 주로 Code First 접근 방식을 사용하지만, Database First 방식도 지원합니다. 자세한 내용은 Code First vs Database First 문서에서 확인할 수 있습니다.
ORM과 EF Core
ORM은 개체 지향 프로그래밍 언어와 관계형 데이터베이스 간의 데이터를 자동으로 매핑하는 프레임워크나 라이브러리를 의미합니다. EF Core는 .NET 환경에서 가장 널리 사용되는 ORM 중 하나로, 개체와 데이터베이스 사이의 복잡한 매핑을 단순화합니다. EF Core를 사용하면, 개발자는 SQL 쿼리를 작성하는 대신 개체지향적인 방식으로 데이터를 쉽게 관리할 수 있습니다.
EF Core는 CRUD(Create, Read, Update, Delete) 작업을 간소화하고, LINQ(Language Integrated Query)를 지원하여 개발자가 데이터를 보다 직관적으로 조회하고 조작할 수 있도록 합니다. 또한, 다양한 데이터베이스 시스템과 호환되며, 쿼리 최적화, 레이지 로딩, 캐싱 등의 기능을 통해 성능을 개선할 수 있습니다.
EF Core 설치 및 사용 가이드
EF Core를 설치하고 사용하는 과정은 간단하며 주로 NuGet 패키지 관리자를 통해 진행됩니다. 아래 단계를 따라 .NET 프로젝트에 EF Core를 쉽게 적용할 수 있습니다.
.NET Core 프로젝트 생성: EF Core를 사용하기 위해서는 먼저 .NET 프로젝트를 생성해야 합니다.
NuGet 패키지 관리자에서 EF Core 패키지 설치: Visual Studio의 패키지 관리자 콘솔에서
Install-Package
명령을 사용하거나, .NET CLI를 사용하여 EF Core 패키지를 설치할 수 있습니다.Visual Studio를 사용하는 경우:
Install-Package Microsoft.EntityFrameworkCore
.NET CLI를 사용하는 경우:
dotnet add package Microsoft.EntityFrameworkCore
패키지 사용: 설치가 완료되면 EF Core를 활용하여 데이터베이스 연결, 데이터 처리, 마
이그레이션 등 다양한 작업을 수행할 수 있습니다.
EF Core 도구 설치: 추가적으로, EF Core와 관련된 명령줄 도구를 설치할 수 있습니다. 이 도구는 데이터베이스 마이그레이션과 코드 생성 등에 유용합니다.
.NET CLI를 사용하여 EF Core 도구 설치:
dotnet tool install --global dotnet-ef --version 8.0.0
이러한 단계를 통해 EF Core를 .NET 프로젝트에 쉽게 설치하고 활용할 수 있으며, 효율적인 데이터베이스 관리 및 개발 작업을 진행할 수 있습니다.
Entity Framework Core의 핵심 명령어
Entity Framework Core (EF Core)에서 가장 자주 사용되는 명령어들은 개발자의 작업 흐름을 간소화하고 효율화합니다. 주요 명령어는 다음과 같습니다:
- Add-Migration: 모델 클래스와 DbContext를 기반으로 초기 데이터베이스 스키마를 생성합니다.
- Update-Database: Add-Migration을 통해 생성된 스키마를 데이터베이스에 적용합니다.
- Script-Migration: 모델을 기반으로 SQL 스크립트를 생성합니다. 이 스크립트는 직접 데이터베이스에 적용할 수 있으며, 특히 프로덕션 환경에서 유용합니다.
PM> Add-Migration "Initial Create"
PM> Update-Database
PM> Script-Migration
EF Core에서 Add-Migration
명령어 뒤에는 마이그레이션의 이름을 문자열로 지정합니다. 큰따옴표 없이 공백 없는 문자열을 사용할 수도 있습니다.
Entity Framework Core의 핵심 클래스
Entity Framework Core는 다음 세 가지 핵심 클래스를 중심으로 작동합니다:
DbContext
: 데이터베이스 연결과 모델을 관리합니다.DbContextOptions
: DbContext의 구성을 정의합니다.DbSet<T>
: 특정 타입의 엔터티 집합을 나타냅니다.
EF Core를 활용한 데이터베이스 생성 및 삭제
Entity Framework Core (EF Core)를 사용하여 Visual Studio 환경에서 콘솔 애플리케이션을 통해 데이터베이스를 생성하고 삭제하는 과정은 간단하며, 몇 가지 기본적인 단계를 통해 완료할 수 있습니다. 아래의 지침은 .NET 콘솔 애플리케이션에서 EF Core를 활용하여 데이터베이스를 관리하는 방법을 단계별로 설명합니다.
1. EF Core 프로젝트 설정
- 콘솔 애플리케이션 생성: Visual Studio에서 새 .NET 콘솔 애플리케이션 프로젝트를 생성합니다.
- EF Core 추가: '솔루션 탐색기'에서 프로젝트를 우클릭하여 'NuGet 패키지 관리...'를 선택합니다. 'Microsoft.EntityFrameworkCore', 'Microsoft.EntityFrameworkCore.SqlServer', 및 'Microsoft.EntityFrameworkCore.Design' 패키지를 검색하여 설치합니다.
2. 모델 및 DbContext 정의
모델 클래스 생성: 간단한
User
모델을 예로 들어 정의합니다.public class User { public int Id { get; set; } public string Name { get; set; } }
DbContext 클래스 생성: 데이터베이스 연결 및 구성을 위한
DbContext
클래스를 생성합니다.public class MyDbContext : DbContext { public DbSet<User> Users { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=VisualAcademy;Trusted_Connection=True;"); } }
3. 데이터베이스 생성 및 삭제
Visual Studio를 사용한 데이터베이스 관리: '패키지 관리자 콘솔'(PMC)을 열고, 다음 명령을 사용하여 데이터베이스를 생성하고 관리합니다.
데이터베이스 생성:
Update-Database
데이터베이스 삭제:
Drop-Database
콘솔 애플리케이션 코드:
Main
메서드에서 데이터베이스를 생성하고 삭제하는 코드를 추가합니다.class Program { static void Main(string[] args) { using (var context = new MyDbContext()) { // 데이터베이스 생성 context.Database.EnsureCreated(); // 데이터베이스 삭제 context.Database.EnsureDeleted(); } } }
이러한 절차를 통해 Visual Studio 환경에서 EF Core를 사용하여 데이터베이스를 쉽게 생성하고 관리할 수 있습니다.
EnsureCreated
와 EnsureDeleted
는 Entity Framework Core에서 제공하는 두 가지 중요한 메서드입니다. 이들은 데이터베이스의 생성 및 삭제를 간소화하는 데 사용됩니다.
EnsureCreated
EnsureCreated
메서드는 데이터베이스가 존재하지 않는 경우에 데이터베이스를 생성합니다.- 이미 데이터베이스가 존재하면, 이 메서드는 아무런 작업도 수행하지 않습니다.
- 주로 개발 초기 단계나 테스트 환경에서 사용되며, 마이그레이션을 적용하지 않기 때문에 코드 기반의 데이터베이스 스키마를 빠르게 생성할 수 있습니다.
- 마이그레이션을 사용하는 상황에서는 주의해서 사용해야 합니다. 이미 마이그레이션이 적용된 데이터베이스에
EnsureCreated
를 호출하면 문제가 발생할 수 있습니다.
EnsureDeleted
EnsureDeleted
메서드는 데이터베이스가 존재하는 경우에 데이터베이스를 삭제합니다.- 데이터베이스가 존재하지 않으면, 아무런 작업도 수행하지 않습니다.
- 이 메서드는 주로 테스트 환경에서 사용되며, 테스트가 완료된 후 데이터베이스를 깔끔하게 정리하는 데 유용합니다.
두 메서드 모두 개발 및 테스트 단계에서 매우 유용하지만, 실제 운영 환경에서는 신중하게 사용해야 합니다. EnsureCreated
는 운영 데이터베이스의 스키마를 예기치 않게 변경할 수 있고, EnsureDeleted
는 중요한 데이터를 실수로 삭제할 위험이 있기 때문입니다.
EF Core를 활용한 CRUD 기본 코드 예시
EF Core를 사용한 CRUD (Create, Read, Update, Delete) 작업의 기본 코드 예시를 아래와 같이 제공합니다. 이 예제에서는 DbContext
및 User
엔터터를 이미 정의했다고 가정합니다.
1. User
엔터터 및 DbContext
정의
public class User
{
public int Id { get; set; }
public string Name { get; set; }
}
public class MyDbContext : DbContext
{
public DbSet<User> Users { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=VisualAcademy;Trusted_Connection=True;");
}
}
2. 사용자 생성 (Create)
using (var context = new MyDbContext())
{
var user = new User { Name = "New User" };
context.Users.Add(user);
context.SaveChanges();
}
3. 사용자 조회 (Read)
using (var context = new MyDbContext())
{
var users = context.Users.ToList();
foreach (var user in users)
{
Console.WriteLine(user.Name);
}
}
4. 사용자 업데이트 (Update)
using (var context = new MyDbContext())
{
var user = context.Users.FirstOrDefault(u => u.Id == 1); // 예를 들어 ID가 1인 사용자
if (user != null)
{
user.Name = "Updated Name";
context.SaveChanges();
}
}
5. 사용자 삭제 (Delete)
using (var context = new MyDbContext())
{
var user = new User { Id = 1 }; // 삭제할 사용자의 ID 설정
context.Users.Remove(user);
context.SaveChanges();
}
이 코드는 EF Core를 사용한 CRUD 작업의 기본적인 예시를 보여줍니다. 실제 애플리케이션에서는 예외 처리, 비동기 작업, 더 복잡한 쿼리 및 데이터 처리 기술 등을 추가로 고려해야 할 수 있습니다.
DbContext 클래스의 활용
DbContext
클래스는 데이터베이스와의 연결을 관리하고, DbSet<T>
속성을 통해 모델 클래스를 데이터베이스 테이블에 매핑합니다. 아래는 DotNetNoteContext
라는 DbContext 클래스의 예시입니다:
using DotNetNote.Models.Notifications;
using Microsoft.EntityFrameworkCore;
namespace DotNetNote.Models
{
public class DotNetNoteContext : DbContext
{
public DotNetNoteContext(DbContextOptions<DotNetNoteContext> options) : base(options)
{
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
optionsBuilder.UseSqlServer(connectionString);
}
}
public DbSet<MyNotification> MyNotifications { get; set; }
}
}
이 코드는 DotNetNoteContext
라는 이름의 DbContext 클래스를 정의하고 있으며, MyNotifications
라는 DbSet 프로퍼티를 포함합니다. 이를 통해 데이터베이스와의 연결을 설정하고, 애플리케이션에서 사용할 데이터 모델을 관리할 수 있습니다.
.NET 환경에서 EF Core 활용
.NET 환경에서 EF Core를 활용하기 위해서는 다양한 DbContext 클래스를 정의하고 구성할 필요가 있습니다. 예를 들어, 아래는 DashboardContext
라는 DbContext 클래스의 구현 예시입니다:
using Microsoft.EntityFrameworkCore;
using TwelveManager.Models;
namespace TwelveManager.Data
{
public class DashboardContext : DbContext
{
public DbSet<Twelve> Twelves { get; set; }
public DashboardContext(DbContextOptions<DashboardContext> options) : base(options)
{
}
}
}
이 클래스는 Twelves
라는 DbSet를 정의하여 데이터 모델과 테이블 간의 매핑을 설정합니다. 이와 같이 EF Core를 사용하면, 데이터 모델을 효율적으로 관리하고, CRUD 작업을 간소화할 수 있습니다.
InMemoryDatabase를 활용한 빠른 CRUD 테스트
EF Core의 InMemoryDatabase는 실제 데이터베이스 환경을 모방하여 빠른 CRUD 테스트를 가능하게 합니다. 예를 들어, 아래의 코드는 InMemoryDatabase를 활용한 TodoContext
클래스를 보여줍니다:
using Microsoft.EntityFrameworkCore;
namespace DotNetNote.Components
{
public class TodoContext : DbContext
{
public TodoContext(DbContextOptions<TodoContext> options) : base(options)
{
}
public DbSet<Todo> Todos { get; set; }
}
}
이 클래스는 Todos
라는 DbSet를 정의하고, InMemoryDatabase를 사용하여 빠르게 데이터베이스 작업을 테스트할 수 있습니다.
다중 DbContext 활용
.NET 프로젝트에서 여러 DbContext를 사용하려면, 각각의 DbContext 클래스를 만들고 서비스에 등록해야 합니다. 예를 들어, DashboardContext
클래스를 ASP.NET Core 프로젝트에 등록하는 방법은 다음과 같습니다:
// /ProfitManager/Startup.cs
services.AddEntityFrameworkSqlServer().AddDbContext<DashboardContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
EF Core에서의 고급 사용 방법
EF Core에서는 다양한 고급 기능을 제공합니다. 예를 들어, ExecuteSqlCommand()
메서드를 사용하여 직접 SQL 쿼리를 실행하거나, EntityState.Modified
를 활용하여 엔터티의 상태를 변경하는 등의 작업을 할 수 있습니다.
_context.Database.ExecuteSqlCommand("Delete from ProjectsLoads Where ProjectId = " + project.Id.ToString());
_context.Entry(customer).State = EntityState.Modified;
_context.SaveChanges();
InMemoryDatabase를 이용한 테스트
InMemoryDatabase는 EF Core를 사용한 단위 테스트에 효과적입니다. 모델 및 컨텍스트 클래스를 생성하고, Startup.cs
파일에서 InMemoryDatabase를 등록하여 사용할 수 있습니다.
services.AddDbContext<TodoContext>(options => options.UseInMemoryDatabase("DotNetNote"));
이렇게 InMemoryDatabase를 활용하면 실제 데이터베이스 환경 없이도 EF Core의 기능을 테스트할 수 있습니다.
이러한 고급 기능과 테스트 방법을 활용함으로써, EF Core를 더욱 효과적으로 활용할 수 있습니다.