ASP.NET Core EF Core 기초 사용법 — 마이그레이션과 CRUD 예제
1. EF Core란 무엇일까요?
여러분, EF Core(Entity Framework Core)는 C# 개발자가 데이터베이스와 쉽게 상호작용할 수 있도록 도와주는 강력한 ORM(Object-Relational Mapper)입니다. SQL 쿼리를 직접 작성하지 않아도, C# 객체로 데이터베이스를 다루고 CRUD(Create, Read, Update, Delete) 작업을 쉽게 수행할 수 있죠. 오늘은 EF Core를 처음 시작하는 분들도 따라할 수 있도록, 마이그레이션과 CRUD 기본 사용법을 단계별로 안내해드릴게요.
2. 개발 환경 준비하기
EF Core를 사용하기 위해 먼저 프로젝트를 준비해야 해요. Visual Studio나 VS Code에서 새 ASP.NET Core Web API 프로젝트를 만듭니다.
dotnet new webapi -o EfCoreDemo
cd EfCoreDemo
그 다음 EF Core 패키지를 설치합니다. SQL Server를 사용할 경우:
dotnet add package Microsoft.EntityFrameworkCore.SqlServer
dotnet add package Microsoft.EntityFrameworkCore.Tools
이제 데이터베이스와 연결하고 CRUD를 실습할 준비가 되었어요!
3. 데이터 모델 정의
먼저 데이터베이스와 매핑될 C# 클래스를 만들어볼게요. 예를 들어 간단한 도서 관리 시스템을 만든다고 가정해봅시다.
using System.ComponentModel.DataAnnotations;
namespace EfCoreDemo.Models
{
public class Book
{
[Key]
public int Id { get; set; }
[Required]
public string Title { get; set; }
public string Author { get; set; }
public DateTime PublishedDate { get; set; }
}
}
이렇게 모델을 만들면 EF Core가 이 클래스를 기준으로 데이터베이스 테이블을 생성할 수 있습니다.
4. DbContext 생성
DbContext는 EF Core에서 데이터베이스와 상호작용하는 핵심 클래스예요. 프로젝트에 Data
폴더를 만들고, 다음과 같이 작성합니다.
using Microsoft.EntityFrameworkCore;
using EfCoreDemo.Models;
namespace EfCoreDemo.Data
{
public class AppDbContext : DbContext
{
public AppDbContext(DbContextOptions options)
: base(options) { }
public DbSet Books { get; set; }
}
}
그리고 Program.cs에서 DbContext를 등록해야 합니다.
builder.Services.AddDbContext<AppDbContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));
appsettings.json
에는 연결 문자열(Connection String)을 추가합니다.
{
"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\MSSQLLocalDB;Database=EfCoreDemoDb;Trusted_Connection=True;"
}
}
5. 마이그레이션과 데이터베이스 생성
EF Core의 가장 큰 장점 중 하나는 마이그레이션(Migration) 기능이에요. 모델이 변경될 때마다 데이터베이스 스키마를 자동으로 업데이트할 수 있죠. 명령어는 간단합니다.
dotnet ef migrations add InitialCreate
dotnet ef database update
첫 번째 명령어는 마이그레이션 파일을 생성하고, 두 번째 명령어는 실제 데이터베이스를 만들어줍니다. 이제 SQL Server Management Studio나 Visual Studio의 서버 탐색기에서 테이블이 생성된 것을 확인할 수 있어요.
6. CRUD 구현 예제
이제 실제로 CRUD(Create, Read, Update, Delete)를 구현해볼게요. 컨트롤러를 만들어 API를 통해 데이터베이스와 상호작용합니다.
using Microsoft.AspNetCore.Mvc;
using EfCoreDemo.Data;
using EfCoreDemo.Models;
using Microsoft.EntityFrameworkCore;
namespace EfCoreDemo.Controllers
{
[ApiController]
[Route("api/[controller]")]
public class BooksController : ControllerBase
{
private readonly AppDbContext _context;
public BooksController(AppDbContext context)
{
_context = context;
}
// Create
[HttpPost]
public async Task<IActionResult> Create(Book book)
{
_context.Books.Add(book);
await _context.SaveChangesAsync();
return CreatedAtAction(nameof(GetById), new { id = book.Id }, book);
}
// Read all
[HttpGet]
public async Task<IEnumerable<Book>> GetAll()
{
return await _context.Books.ToListAsync();
}
// Read by Id
[HttpGet("{id}")]
public async Task<IActionResult> GetById(int id)
{
var book = await _context.Books.FindAsync(id);
if(book == null) return NotFound();
return Ok(book);
}
// Update
[HttpPut("{id}")]
public async Task<IActionResult> Update(int id, Book updatedBook)
{
if(id != updatedBook.Id) return BadRequest();
_context.Entry(updatedBook).State = EntityState.Modified;
await _context.SaveChangesAsync();
return NoContent();
}
// Delete
[HttpDelete("{id}")]
public async Task<IActionResult> Delete(int id)
{
var book = await _context.Books.FindAsync(id);
if(book == null) return NotFound();
_context.Books.Remove(book);
await _context.SaveChangesAsync();
return NoContent();
}
}
}
이렇게 하면 RESTful API를 통해 책 데이터를 추가, 조회, 수정, 삭제할 수 있습니다. Postman 또는 Swagger를 통해 직접 테스트하며, 모델과 데이터베이스가 연동되는 모습을 바로 확인할 수 있어요.
7. 실무 팁
- 마이그레이션 시 항상 최신 상태로 유지하고, 버전 관리(Git)와 함께 관리하세요.
- 복잡한 모델 변경 시에는 별도의 마이그레이션 브랜치를 만들어 테스트 후 병합하는 것을 추천합니다.
- Seed 데이터(초기 데이터)를 활용하면 개발 환경에서 빠르게 테스트할 수 있습니다.
- Async/Await 패턴을 적극 활용하면 데이터베이스 작업 시 서버 성능을 효율적으로 관리할 수 있어요.
- Swagger를 통해 API 문서를 자동으로 생성하면 팀 내 협업이 훨씬 편리합니다.
8. 마무리
오늘은 EF Core의 기초부터 시작해서 마이그레이션, CRUD 구현까지 자세히 살펴보았습니다.
따라 해보면서 느끼셨겠지만, EF Core를 활용하면 C# 객체와 데이터베이스가 자연스럽게 연결되어 개발 속도가 훨씬 빨라져요.
처음에는 조금 복잡하게 느껴질 수 있지만, 예제를 하나씩 구현하다 보면 어느새 실무에서도 바로 적용할 수 있는 자신감을 얻게 됩니다.