EF Core 살펴보기
EF Core(Entity Framework Core)는 ORM(개체 관계형 매퍼)입니다. ORM은 코드에서 구현하는 도메인 모델과 데이터베이스 간에 계층을 제공합니다. EF Core는 데이터 액세스 API로, .NET POCO(Plain old CLR Object) 및 강력한 형식의 LINQ(Language Integrated Query) 구문을 사용하여 데이터베이스와 상호 작용할 수 있도록 합니다.
EF Core에서 데이터베이스가 .NET POCO 뒤에 추상화됩니다. EF Core는 기본 데이터베이스와의 직접적인 상호작용을 처리합니다. 이 API를 사용하는 경우 데이터베이스와의 요청을 변환하고 SQL을 작성하는 데 소요되는 시간을 줄이고 중요한 비즈니스 논리에 더 많은 시간을 집중할 수 있습니다.
EF Core를 사용하여 다음을 수행할 수 있습니다.
- 데이터를 C# 개체(엔터티)로 로드합니다.
- 이런 엔터티에 대해 메서드를 호출하여 데이터를 추가, 수정, 삭제합니다.
- 여러 데이터베이스 테이블을 단일 C# 엔터티에 매핑합니다.
- 여러 사용자가 동시에 동일한 레코드를 업데이트하려고 할 때 발생하는 동시성 문제를 처리합니다.
- LINQ(System.Linq) 구문을 사용하여 데이터베이스를 쿼리합니다.
- SQL Server, SQLite, Azure Cosmos DB, PostgreSQL, MySQL 등 여러 데이터베이스에 액세스합니다.
- 기존 데이터베이스에서 도메인 모델을 빌드합니다.
- 도메인 모델을 기반으로 데이터베이스 스키마를 관리합니다.
- 단일 메서드 호출을 사용하여 관련 엔터티의 복잡하거나 깊거나 넓은 개체 그래프에 변경 내용을 커밋합니다.
EF Core 아키텍처 검토
다음 다이어그램에서는 EF Core의 아키텍처를 보여 줍니다.
DbContext는 작업 단위를 나타내는 특수 클래스입니다. DbContext
는, 옵션, 연결 문자열, 로깅, 그리고 도메인을 데이터베이스에 매핑하는 데 사용되는 모델을 구성하는 메서드를 제공합니다.
DbContext
에서 파생되는 클래스:
- 데이터베이스와 활성인 세션을 나타냅니다.
- 엔터티 인스턴스를 저장하고 쿼리합니다.
- 데이터베이스의 테이블을 나타내는
DbSet<T>
형식의 속성을 포함합니다.
EF Core 공급자는 개체 그래프 변경 사항을 SQL로 변환합니다.
데이터베이스 공급자란
- SQL Server, Azure Cosmos DB, PostgreSQL과 같은 특정 데이터베이스 엔진용으로 설계한 플러그 인 라이브러리입니다.
- 메서드 호출 및 LINQ 쿼리를 데이터베이스의 네이티브 SQL 언어로 변환합니다.
- 데이터베이스 엔진 고유의 기능을 사용할 수 있도록 EF Core를 확장합니다.
데이터베이스 스키마 관리
EF Core는 EF Core 모델과 데이터베이스 스키마를 동기 상태로 유지하는 두 가지 기본 방법을 제공합니다.
- 마이그레이션(데이터 소스로 기능하는 모델)
- 리버스 엔지니어링(데이터 소스로 기능하는 데이터베이스)
두 방법 중에 하나를 선택하려면 EF Core 모델과 데이터베이스 스키마 중 어느 것이 데이터 소스로 기능하는지 판단합니다.
마이그레이션
실제 프로젝트에서 앱 기능이 구현될 때 데이터 모델이 변경됩니다. 새 엔터티를 추가 및 제거할 때 데이터베이스 스키마를 적절하게 변경해야 합니다. EF Core 마이그레이션 기능은 데이터베이스 스키마를 증분 방식으로 업데이트하여 애플리케이션의 데이터 모델과 동기 상태를 유지하면서 데이터베이스에 기존 데이터를 보존하는 방법을 제공합니다.
데이터 모델이 변경되면 개발자는 EF Core 도구를 사용하여 해당 마이그레이션을 추가합니다. EF Core는 현재 모델을 이전 모델의 스냅샷과 비교하여 차이점을 확인합니다. 변경 내용을 구현하는 C# 코드가 생성됩니다. 사용자 지정 동작 또는 시드 데이터에 대한 C# 파일을 수정할 수 있습니다. 파일은 다른 원본 파일과 마찬가지로 프로젝트의 원본 제어에서 추적됩니다.
새 마이그레이션이 생성된 후에는 다양한 방법으로 데이터베이스에 적용할 수 있습니다. EF Core는 적용된 모든 마이그레이션을 특수 기록 테이블에 기록합니다. 해당 기록 테이블에는 마이그레이션이 적용되었던 레코드가 보관됩니다.
리버스 엔지니어링
리버스 엔지니어링은 데이터베이스 스키마에 따라 엔터티 모델 클래스 및 DbContext
클래스를 스캐폴드하는 프로세스입니다. 이 방법은 데이터베이스 관리자가 관리하는 기존 데이터베이스 또는 공유 데이터베이스에서 자주 사용됩니다.
다음 단원에서는 마이그레이션을 사용하여 EF Core를 시작합니다.