Entity Framework Core의 목적을 간단히 설명하면 개체 관계 매핑(ORM:Object-Relational Mapping) 기술로서 MS-SQL이나 SQLite와 같은 데이터베이스에 데이터를 읽고 쓰는 데 사용되는 기술이라고 할 수 있습니다.
1. 데이터베이스
데이터를 저장하는데 가장 일반적으로 사용되는 데이터베이스종류로는 Microsoft SQL Server, PostgreSQL, MySQL, SQLite과 같은 RDBMS(Relational Database Management System)와 Microsoft Azure Cosmos DB, Redis, MongoDB, Apache Cassandra와 같은 NoSQL 이렇게 2가지로 나누어질 수 있습니다.
(1) Entity Framework
여기서 말하는 Entity Framework는 .NET Framework때의 것을 말하는 것으로 Entify Framework Core와는 다른 것을 표현합니다.
Entity Framework은 2008년 .NET Framework 3.5와 Service Pack 1이 발표될 때 이들의 일부로서 최초로 릴리스 되었습니다. 그 이후로 마이크로소프트는 개발자가 어떻게 ORM도구를 사용하는지를 관찰하고 이와 관련된 지속적인 업데이트를 통해 Entity Framework는 꾸분히 발전해 왔습니다.
ORM은 테이블 컬럼과 클래스의 속성을 매핑하는 데 사용되며 개발자는 테이블이나 NoSQL과 같은 다른 방식의 저장소에 전통적으로 값을 저장하는 대신 자신에게 친숙한 접근방식으로 개체와 상호작용할 수 있게 되었습니다.
.NET Framework에 포함된 Entity Framework의 마지막버전은 6이며 상당히 안정된 버전으로서 복잡한 상속 모델을 포함하여 대부분의 모델을 정의하는 방법인 EDMX(XML) 지원하고 기타 다수의 유용한 기능을 제공하고 있습니다.
6.3버전부터는 .NET Framework와 분리되어 패키지 형태로 제공되기 시작했는데 덕분에 .NET Core 3.0과 이후 버전도 같이 지원할 수 있게 되었고 기존에 존재하던 프로젝트를 cross-platform으로 이식이 가능하도록 하였습니다. 하지만 cross-platform을 온전히 지원하지 못하고 더 이상 새로운 기능 추가나 별개의 기능 향상이 더 이상 이루어지지 않고 있으므로 새로운 프로젝트에 .NET Framework를 사용하는 것은 권장하지 않습니다.
단지 Entity Framework를 사용중인 레거시 프로젝트를 마이그레이션 하는 등의 용도에서만 아래와 같이 Entifi Framework를 사용하도록 합니다.
<PackageReference Include="EntityFramework" Version="6.4.4" />
(2) Entity Framework Core
Entity Framework Core(줄여서 EF Core)는 사실상의 cross-platform버전으로서 레거시 Entity Framework와는 이름만 비슷할 뿐 근본적인 면에 있어서는 많은 차이가 있습니다. 이들 차이에 대해서는 실제 EF Core를 사용하면서 천천히 알아가면 될 것입니다.
EF Core의 현재 버전은 6이며 이 버전은 .NET버전와 매칭되므로 .NET 6만을 지원합니다. 따라서 EF Core 5는 .NET 5를 EF Core 3.0이라면 .NET Standard 2.1(사실상 NET Core 3.0을 뜻하는)을 지원하는 플랫폼에서만 동작할 수 있습니다. .NET Framework 4.8과 연결되어 있는 .NET Standard 2.0은 지원되지 않습니다.
전통적인 RDBMS와 더불어 EF Core는 클라우드 기반의 비 관계형이자 스키마 리스(schema-less) 데이터베이스인 Microsoft Azure Cosmos DB나 MongoDB와 같은 DB도 지원하고 있습니다.
EF Core는 통상 다음과 같은 2가지 방법을 통해 사용할 수 있습니다.
- Database First : 데이터베이스가 이미 존재하는 상태에서 해당 구조와 매핑되는 모델을 생성합니다.
- Code First : 데이터베이스가 없는 상태에서 모델을 먼저 생성한 뒤 해당 구조와 매핑되는 데이터베이스를 생성합니다.
2. EF Core 설정
EF Core를 설정하기 위해 우선 어떤 EF Core data provider를 선택할 수 있을지부터 파악해야 합니다. 즉, EF Core를 통해 데이터베이스의 데이터를 다루기 위해서 해당 데이터베이스와 효휼적으로 작동되어야 할 전용 클래스를 사용해야 하는 것입니다.
EF Core database provider는 각 데이터베이스에 최적화된 몇 가지 클래스를 제공하고 있는데 심지어는 외부 시스템의 부하를 최소화하고 고성능 단위 테스트를 위해 메모리에 데이터를 저장하는 provider도 존재합니다.
아래 표에서는 각 데이터베이스마다 사용 가능한 몇 가지 NuGet Package를 나열하고 있습니다.
NuGet Package | DB |
Microsoft.EntityFrameworkCore.SqlServer | Microsoft SQL Server 2012 or later |
Microsoft.EntityFrameworkCore.SQLite | SQLite 3.7 or later |
MySQL.Data.EntityFrameworkCore | MySQL |
Microsoft.EntityFrameworkCore.InMemory | In-memory |
Microsoft.EntityFrameworkCore.Cosmos | Azure Cosmos DB SQL API |
Oracle.EntityFrameworkCore | Oracle DB 11.2 |
하나의 프로젝트라 하더라도 다수의 DB를 사용하는 경우면 각각에 맞는 다수의 Package패키지를 설치해 사용할 수 있습니다.
(1) 데이터베이스 연결
DB 연결을 위해 SQLite의 경우에는 Filename이라는 매개변수를 통해 경로와 파일명만 전달하면 되지만 SQL Server와 같은 경우라면 아래 정보를 포함하는 일련의 '연결 문자열'을 제공해야 합니다.
- 서버와 인스턴스 이름
- 데이터베이스 이름
- 로그인에 필요한 아이디/패스워드 혹은 현재 로그인된 사용자의 인증정보 등
해당 정보는 아래 키워드를 통해 문자열로 구성됩니다.
- Data Source / server / addr : 서버명 혹은 서버의 인스턴스 이름입니다. 예외적으로 서버가 로컬 서버인 경우 .문자로만 설정할 수 있습니다.
- Initial Catalog / database : 사용할 데이터베이스(DB) 이름입니다.
- Integrated Security / trusted_connection : 이 설정은 스레드의 현재 사용자 인증을 전달하기 위해 true 혹은 SSPI로 설정될 수 있습니다.
- MultipleActiveResultSets(MARS) : 이 설정이 true면 여러 테이블을 동시에 다루기 위한 단일 연결을 허용하게 됩니다. 즉, 하나의 Connection에서 여러 SqlCommand를 사용해 각각 다른 ResultSet들을 동시에 사용하도록 한 것인데 이는 효휼성의 향상을 목표로 하며 관련된 다수의 테이블로부터 여러 행을 로드해야 하는 경우에 사용될 수 있습니다.
실제 DB 서버로의 연결을 수행하기 위해서는 당연히 로컬이나 원격지 서버에 SQL Server와 같은 데이터베이스 시스템이 설치되어 있어야 합니다. 이번 글에서는 MS-SQL Server를 사용할 예정이며 해당 서버의 설치에 관해서는 아래 글을 참고해 주시기 바랍니다.
[Server/SQL Server] - [MSSQL] MS SQL Server 다운로드 및 설치/설정
설치를 모두 완료하였으면 MS-SQL Server엔진에 연습으로 사용해볼 DB를 생성해야 합니다. 다만 이번 글에서는 DB를 직접 만들기보다 마이크로소프트에서 제공하는 아래의 샘플데이터베이스를 사용해볼 것입니다.
위 텍스트 파일을 내려받은 뒤 Microsoft SQL Server Management(이하 SSMS)를 실행하고
위에서 내려받은 파일을 불러들인 뒤 설치된 서버엔진에서 그대로 스크립트를 실행하면
'Northwind'라는 DB를 서버에 생성할 것입니다.
위의 과정까지 진행되었으면 이제 간단한 ConsoleApp프로젝트를 생성하고 프로젝트 파일(csproj)을 수정해 EF Core사용을 위한 Package를 아래와 같이 설정하도록 합니다.
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="6.0.6" />
</ItemGroup>
6.0.6은 6월 말 현재 EntifyFrameworkCore.SqlServer의 최신 버전입니다. 만약 SQL Server대신 Sqlite를 사용하기로 했다면 Microsoft.EntityFrameworkCore.SqlServer대신 Microsoft.EntityFrameworkCore.Sqlite을 사용할 수 있습니다.
Package가 설치되고 나면 프로젝트에 Northwind.cs라는 파일을 추가하고 다음과 같이 해당 파일을 작성합니다.
using Microsoft.EntityFrameworkCore;
namespace myapp;
public class Northwind : DbContext
{
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
string connection = "Data Source=.;Initial Catalog=Northwind;Integrated Security=true;MultipleActiveResultSets=true;";
optionsBuilder.UseSqlServer(connection);
optionsBuilder.EnableSensitiveDataLogging(true);
}
}
위 예제는 DbContext로부터 상속받은 Northwind라는 클래스를 생성하고 있으며 OnConfiguring() 메서드를 정의하고 있습니다. 참고로 EnableSensitiveDataLogging() Method에 true를 전달하면 Query Logging시에 실제값이 들어가게 됩니다.
OnConfiguring() 메서드는 MS-SQL Server를 위한 연결 문자열을 제공하여 서버와의 연결을 시도하고 있는데 만약 SQLite를 사용한다면 연결방법이 달라질 수 있습니다.
string path = Path.Combine(Environment.CurrentDirectory, "Northwind.db");
optionsBuilder.UseSqlite($"Filename={path}");
만약 Windows에서 Visual Studio를 사용하는 경우라면 SQLite사용을 설정한 경우 프로젝트를 빌드하고 실행할 때 실제 App의 실행 경로는 bin\Debug\net6.0 폴더가 되므로 Northwind.db파일도 해당 경로에 포함될 수 있도록 다음과 같이 설정하시기 바랍니다.
위 설정은 프로젝트 파일(csproj)을 아래와 같이 변경합니다.
<ItemGroup>
<Compile Include="Northwind.db">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Compile>
</ItemGroup>
'.NET > C#' 카테고리의 다른 글
[C#] Entity Framework Core - 3. 질의하기및 Pattern 로드 (0) | 2022.06.24 |
---|---|
[C#] Entity Framework Core - 2. 모델링(Modeling) (0) | 2022.06.24 |
[C#] 함수(메서드)의 실행과 디버깅및 테스팅 (0) | 2022.05.06 |
[C#] TCP/IP 통신 (0) | 2021.10.28 |
[C#] Thread(스레드)와 Task(태스크) (2) | 2021.10.24 |