c#

ASP.NET Core EF Core 기초 사용법 — 마이그레이션과 CRUD 예제

개발에대해 2025. 9. 29. 11:25
반응형

 

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# 객체와 데이터베이스가 자연스럽게 연결되어 개발 속도가 훨씬 빨라져요.

처음에는 조금 복잡하게 느껴질 수 있지만, 예제를 하나씩 구현하다 보면 어느새 실무에서도 바로 적용할 수 있는 자신감을 얻게 됩니다.

반응형