상세 컨텐츠

본문 제목

Entity Framework

C#

by 메타 스토리 2023. 9. 5. 14:24

본문

Entity Framework는 Microsoft가 개발한 .NET 프레임워크 기반의 ORM(객체 관계 매핑) 도구입니다. ORM은 개체 지향 프로그래밍 언어(예: C#)의 개체와 관계형 데이터베이스 간의 데이터를 변환, 저장 및 관리하기 위한 기술입니다. Entity Framework는 개체와 데이터베이스 간의 상호 작용을 쉽게 만들어주고 .NET 언어로 데이터베이스 액세스를 추상화합니다.

Entity Framework의 주요 특징과 작동 방식을 설명해보겠습니다:

개체 모델링: Entity Framework를 사용하면 데이터베이스 테이블과 엔터티(개체) 클래스 간의 일대일 또는 일대다 관계를 정의할 수 있습니다. 이러한 클래스는 데이터베이스 테이블과 매핑되며 데이터의 구조와 관계를 개체로 표현할 수 있습니다.

LINQ 지원: Entity Framework는 LINQ(Language-Integrated Query)를 통해 데이터를 쿼리하는 강력한 기능을 제공합니다. LINQ를 사용하면 SQL 쿼리를 사용하지 않고도 데이터베이스로부터 데이터를 쿼리할 수 있습니다.

데이터베이스 독립성: Entity Framework를 사용하면 데이터베이스 종류에 관계없이 데이터 액세스 코드를 작성할 수 있습니다. Entity Framework가 백엔드 데이터베이스를 추상화하기 때문에 다양한 데이터베이스 시스템과 함께 작동할 수 있습니다.

Code First 및 Database First 접근 방식: Entity Framework는 Code First 및 Database First 두 가지 접근 방식을 지원합니다. Code First에서는 C# 클래스를 먼저 정의하고 데이터베이스가 이를 따라가게 됩니다. Database First에서는 데이터베이스를 먼저 정의하고 이를 기반으로 C# 클래스를 생성합니다.

Entity Framework를 사용하여 데이터베이스와 연동하는 단계는 다음과 같습니다:

Entity Framework 설치: 프로젝트에 Entity Framework NuGet 패키지를 설치합니다.

데이터 모델 정의: 데이터베이스 테이블과 매핑될 개체 클래스를 정의합니다. 이 클래스는 DbSet<TEntity> 속성을 사용하여 데이터베이스에서 검색, 삽입, 업데이트 및 삭제할 수 있습니다.

연결 문자열 구성: 데이터베이스 연결 문자열을 설정하여 어떤 데이터베이스와 연결할 것인지 지정합니다.

데이터베이스 초기화: 데이터베이스가 존재하지 않을 경우 데이터베이스를 생성하거나 데이터베이스 스키마를 업데이트하는 코드를 작성합니다.

LINQ 쿼리 및 데이터 액세스: LINQ를 사용하여 데이터베이스에서 데이터를 쿼리하고 변경 사항을 데이터베이스에 저장할 수 있습니다.

Entity Framework를 사용하면 데이터베이스와의 상호 작용을 단순화하고 .NET 언어를 사용하여 데이터 액세스를 효율적으로 수행할 수 있습니다.


Entity Framework의 사용법을 예제로 보여드리겠습니다. 이 예제에서는 Code First 접근 방식을 사용하여 간단한 데이터베이스와 개체 모델을 만들고 데이터를 추가, 조회, 업데이트, 삭제하는 방법을 보여줍니다.

프로젝트에 Entity Framework NuGet 패키지 설치:
먼저, Entity Framework NuGet 패키지를 프로젝트에 설치합니다. 이를 위해 NuGet 패키지 관리자를 사용하거나 Package Manager 콘솔에서 다음 명령을 실행합니다:

Install-Package EntityFramework


데이터 모델 클래스 정의:
Person 클래스를 정의하고 이를 데이터베이스 테이블과 매핑할 것입니다.

 

using System;
using System.ComponentModel.DataAnnotations;

public class Person
{
    [Key]
    public int PersonId { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
}

 


DbContext 클래스 작성:
DbContext 클래스를 작성하여 데이터베이스와의 연결을 관리합니다.

using System.Data.Entity;

public class MyDbContext : DbContext
{
    public MyDbContext() : base("MyDbConnection")
    {
    }

    public DbSet<Person> People { get; set; }
}

 


연결 문자열 설정:
App.config 파일에서 연결 문자열을 설정합니다.

<connectionStrings>
    <add name="MyDbConnection" connectionString="Data Source=(LocalDb)\MSSQLLocalDB;Initial Catalog=MyDatabase;Integrated Security=True" providerName="System.Data.SqlClient" />
</connectionStrings>


데이터 액세스 코드 작성:
데이터베이스와 상호 작용하는 코드를 작성합니다.

class Program
{
    static void Main()
    {
        using (var context = new MyDbContext())
        {
            // 데이터베이스 초기화 (최초 실행 시만 필요)
            Database.SetInitializer(new CreateDatabaseIfNotExists<MyDbContext>());

            // 데이터 추가
            var person = new Person { Name = "Alice", Age = 30 };
            context.People.Add(person);
            context.SaveChanges();

            // 데이터 조회
            var people = context.People.ToList();
            foreach (var p in people)
            {
                Console.WriteLine($"Name: {p.Name}, Age: {p.Age}");
            }

            // 데이터 업데이트
            var personToUpdate = context.People.FirstOrDefault(p => p.Name == "Alice");
            if (personToUpdate != null)
            {
                personToUpdate.Age = 31;
                context.SaveChanges();
            }

            // 데이터 삭제
            var personToDelete = context.People.FirstOrDefault(p => p.Name == "Alice");
            if (personToDelete != null)
            {
                context.People.Remove(personToDelete);
                context.SaveChanges();
            }
        }
    }
}


프로젝트 실행:
프로젝트를 실행하여 데이터베이스와 상호 작용하는 코드를 테스트합니다.

이것은 Entity Framework를 사용한 간단한 예제입니다. Entity Framework를 사용하면 데이터베이스와 상호 작용하는 코드를 더 쉽게 작성하고 관리할 수 있으며, LINQ를 활용하여 데이터를 쿼리할 수 있습니다.


Name: Alice, Age: 30
Name: Bob, Age: 25
Name: Carol, Age: 28

 

위 결과에서는 데이터베이스에 "Alice", "Bob", "Carol"라는 세 명의 사람이 추가되었고, 그들의 이름과 나이가 조회되었습니다. 이후에는 "Alice"의 나이가 31로 업데이트되고, "Alice" 항목이 삭제되었습니다.


<connectionStrings> <add name="MyDbConnection" connectionString="Data Source=(LocalDb)\MSSQLLocalDB;Initial Catalog=MyDatabase;Integrated Security=True" providerName="System.Data.SqlClient" /> </connectionStrings>

 

connectionStrings 섹션은 데이터베이스 연결 문자열을 저장하는 데 사용되는 구성 파일의 일부입니다. 이 섹션을 사용하여 데이터베이스와 연결하는 데 필요한 정보를 지정할 수 있습니다.

Data Source 속성은 데이터베이스 서버의 위치와 이름을 지정하는 데 사용됩니다. (LocalDb)\MSSQLLocalDB는 로컬 SQL Server 데이터베이스를 나타냅니다. Initial Catalog은 데이터베이스의 이름을 지정하며, Integrated Security=True는 Windows 인증을 사용하여 데이터베이스에 연결하겠다는 것을 나타냅니다.

즉, 이 연결 문자열은 MSSQL 서버(로컬 또는 원격)에 대한 연결을 설정하는 데 사용됩니다. MSSQL 서버가 설치되어 있어야 하며, 데이터베이스의 이름과 Windows 인증을 사용하여 연결합니다. 이렇게 설정된 연결 문자열을 사용하여 Entity Framework 또는 ADO.NET과 같은 데이터베이스 라이브러리를 통해 데이터베이스와 상호 작용할 수 있습니다.



ADO.NET와 Entity Framework은 데이터베이스와 상호 작용하는 두 가지 서로 다른 데이터 액세스 기술입니다. 각각의 기술에는 장단점이 있으며, 사용 사례에 따라 선택해야 합니다.

ADO.NET (ActiveX Data Objects .NET):

Low-Level Control: ADO.NET은 데이터베이스와의 연결, 명령 실행 및 결과 처리에 대한 높은 수준의 제어를 제공합니다. 이로 인해 개발자는 데이터 액세스 작업을 자세하게 제어할 수 있습니다.
성능: ADO.NET은 데이터베이스와 직접 통신하므로 데이터베이스에 대한 더 높은 성능을 제공할 수 있습니다. 특히 대량 데이터 작업에 적합합니다.
프로시저 및 쿼리: ADO.NET은 데이터베이스에서 저장 프로시저 및 직접 SQL 쿼리를 실행하기에 적합합니다.

 

Entity Framework:

Object-Relational Mapping (ORM): Entity Framework는 개체와 관계형 데이터베이스 간의 매핑을 처리하는 ORM 도구입니다. 이는 개발자가 데이터베이스 테이블을 .NET 개체로 매핑할 수 있게 해줍니다.
Productivity: Entity Framework는 개발자의 생산성을 향상시킬 수 있습니다. 개체 지향 프로그래밍 패턴을 사용하여 데이터를 처리하므로 복잡한 SQL 쿼리 작성이나 데이터베이스 연결 관리에 대한 부분적인 작업을 줄일 수 있습니다.
유연성: Entity Framework는 다양한 데이터베이스 시스템과 호환됩니다. 이는 데이터베이스의 변경이나 스위칭을 더 쉽게 처리할 수 있게 해줍니다.
LINQ: Entity Framework는 Language Integrated Query (LINQ)를 지원하여 .NET 언어로 SQL과 유사한 쿼리를 작성할 수 있게 해줍니다.


장단점 비교:

ADO.NET은 성능 면에서 뛰어나며, 세밀한 제어가 필요한 경우에 적합합니다.
Entity Framework는 개발 생산성을 향상시키고, 개체 지향 프로그래밍 패러다임을 사용하여 작업을 단순화합니다. 또한 다양한 데이터베이스 시스템과의 호환성을 제공하며, LINQ와 통합되어 더 간편한 쿼리 작성을 지원합니다.
따라서 선택은 프로젝트 요구 사항, 개발자의 선호도 및 팀의 우선 순위에 따라 달라질 수 있습니다. ADO.NET은 더 낮은 수준의 제어가 필요한 경우나 특정 데이터베이스와의 밀접한 통합이 필요한 경우에 적합할 수 있으며, Entity Framework는 개발 생산성과 유지 관리성이 더 중요한 경우에 유용합니다.


Entity Framework와 ADO.NET를 비교할 때 "개발 생산성과 유지 관리성이 더 중요한 경우에 유용하다"는 의미는 다음과 같습니다:

개발 생산성: Entity Framework는 개체 지향 프로그래밍(OOP)을 기반으로 합니다. 따라서 데이터베이스 테이블을 .NET 개체로 매핑할 수 있습니다. 이것은 개발자가 코드를 작성하면서 데이터 구조를 더 쉽게 이해하고 유지 관리할 수 있음을 의미합니다. ADO.NET에 비해 더 추상화되어 있으며 복잡한 SQL 쿼리 작성이나 데이터베이스 연결 관리를 덜 해도 됩니다.

유지 관리성: Entity Framework는 데이터베이스 스키마의 변경에 더 유연하게 대처할 수 있습니다. 데이터베이스의 스키마가 변경되면 Entity Framework를 사용하는 애플리케이션 코드를 크게 수정하지 않고도 변경된 스키마에 대한 매핑을 업데이트할 수 있습니다. 이것은 시간이 지남에 따라 데이터베이스 구조가 변경될 가능성이 있는 프로젝트에서 유용합니다.

간편한 쿼리 작성: Entity Framework는 Language Integrated Query (LINQ)를 지원하여 .NET 언어로 SQL과 유사한 쿼리를 작성할 수 있습니다. 이로써 쿼리 작성이 간편해지며, 가독성이 향상됩니다. ADO.NET에서는 SQL 쿼리를 문자열로 작성하는 것과 비교하면 LINQ를 사용하는 것이 훨씬 직관적입니다.

그러나 이러한 장점과 함께 Entity Framework는 일부 성능 오버헤드를 동반할 수 있으며, 복잡한 쿼리 및 대량 데이터 작업에는 ADO.NET이 더 적합할 수 있습니다. 따라서 프로젝트의 요구 사항과 성능 목표에 따라 Entity Framework 또는 ADO.NET을 선택하게 됩니다.


using System;
using System.ComponentModel.DataAnnotations;

public class Person
{
    [Key]
    public int PersonId { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
}  

 

Entity Framework의 Code First 접근 방식을 사용하면 C# 클래스를 정의하고 이를 데이터베이스 테이블에 매핑할 수 있습니다. 코드에서 C# 클래스를 정의하고 클래스의 속성을 사용하여 엔터티 속성 및 관계를 정의하면 Entity Framework가 자동으로 데이터베이스 스키마를 생성하거나 업데이트합니다. 이렇게 생성된 데이터베이스 테이블은 클래스의 속성과 일치하며 Code First Migrations를 사용하면 데이터베이스 스키마를 관리하면서 애플리케이션을 업데이트할 수 있습니다.

Code First 접근 방식을 사용하려면 Entity Framework의 DbContext 클래스를 확장하고 DbSet<T> 속성을 사용하여 엔터티 클래스를 정의해야 합니다. 그런 다음 데이터베이스 컨텍스트를 사용하여 데이터베이스와 상호 작용할 수 있습니다.

여기 예제 코드에서는 Person 클래스를 정의하고 [Key] 어트리뷰트로 PersonId 속성을 기본 키로 지정하고 있으며, 이를 Entity Framework에서 인식하고 이를 테이블의 기본 키로 매핑합니다. Entity Framework가 이 클래스를 인식하고 데이터베이스 테이블을 생성하는 작업은 Code First 접근 방식의 핵심입니다.


Entity Framework Code First 접근 방식은 데이터베이스 테이블을 코드를 통해 생성 및 관리하는 방식입니다. 코드에서 C# 클래스를 정의하면, Entity Framework는 이를 바탕으로 데이터베이스 테이블을 생성하거나 기존 테이블과 매핑합니다. 따라서 클래스를 먼저 정의하고 데이터베이스를 생성하거나 업데이트하면 됩니다. 이것은 기존의 데이터베이스가 필요 없는 경우나 처음부터 데이터베이스 스키마를 새로 만들어야 하는 경우에 유용합니다.

따라서 Entity Framework Code First 접근 방식은 클래스를 먼저 정의하고 이를 토대로 데이터베이스를 생성하거나 관리하는 방식으로, 데이터베이스 테이블을 코드로부터 생성합니다. 이것이 "Code First"라고 불리는 이유 중 하나입니다. ADO.NET과는 다르게 데이터베이스 테이블을 먼저 생성한 후 데이터를 가져오는 전통적인 접근 방식과는 다릅니다.

Entity Framework를 MySQL 데이터베이스와 연동하려면 다음과 같은 단계를 따르면 됩니다.

Entity Framework Core 설치: Entity Framework Core (EF Core)는 .NET Core 및 .NET 5 이상에서 동작하는 Entity Framework의 경량 버전입니다. MySQL과의 통합을 지원합니다. NuGet 패키지 관리자나 .NET CLI를 사용하여 EF Core를 프로젝트에 설치합니다.

dotnet add package Microsoft.EntityFrameworkCore
dotnet add package Pomelo.EntityFrameworkCore.MySql
DbContext 클래스 생성: 데이터베이스와의 상호 작용을 정의할 DbContext 클래스를 생성합니다.

 


using Microsoft.EntityFrameworkCore;

public class MyDbContext : DbContext
{
    public DbSet<Person> People { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseMySql("Server=your_mysql_server;Database=your_database;User=your_user;Password=your_password;");
    }
}
위 코드에서 UseMySql 메서드 내부의 연결 문자열을 MySQL 서버의 정보로 수정하세요.

모델 클래스 생성: 데이터베이스 테이블과 매핑할 모델 클래스를 생성합니다.


using System.ComponentModel.DataAnnotations;

public class Person
{
    [Key]
    public int PersonId { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
}


마이그레이션 생성: Entity Framework의 마이그레이션 기능을 사용하여 데이터베이스 스키마를 생성합니다. 터미널에서 다음 명령을 실행하세요.

dotnet ef migrations add InitialCreate
데이터베이스 생성: 마이그레이션을 사용하여 데이터베이스를 생성합니다.

dotnet ef database update


이제 MySQL 데이터베이스와 Entity Framework를 사용하여 데이터를 관리할 수 있게 됩니다. MySQL 연결 문자열과 필요에 따라 모델 클래스 및 DbContext 클래스를 수정하여 프로젝트에 맞게 구성하세요.

Entity Framework를 사용하여 MySQL 서버에 데이터를 추가, 삭제, 수정하는 예제를 보여드리겠습니다. 먼저, Entity Framework를 설치하고 설정하는 작업이 필요합니다.

1. Entity Framework 설치 및 설정
Entity Framework를 설치하고 프로젝트에 설정하는 단계입니다. NuGet 패키지 관리자를 사용하여 Entity Framework를 설치합니다.

프로젝트에서 NuGet 패키지 관리자를 엽니다.
EntityFramework 패키지를 검색하고 설치합니다.
이제 Entity Framework를 사용하여 MySQL 데이터베이스에 연결하고 작업할 수 있습니다.

2. MySQL 데이터베이스 연결 설정
Entity Framework를 사용하여 MySQL 데이터베이스에 연결하려면 연결 문자열과 DbContext 클래스를 설정해야 합니다. MySql.Data.Entity.EF6 NuGet 패키지도 설치해야 합니다.

 


using System.Data.Entity;

public class MyDbContext : DbContext
{
    public MyDbContext() : base("name=MyDbConnection")
    {
    }

    public DbSet<Person> People { get; set; }
}

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
}


위 코드에서 MyDbContext는 데이터베이스 컨텍스트를 나타내며 Person 클래스는 데이터베이스 테이블을 나타냅니다. 연결 문자열 "name=MyDbConnection"은 App.config 또는 Web.config 파일에서 설정합니다.

3. 데이터 추가, 삭제, 수정
이제 Entity Framework를 사용하여 데이터를 추가, 삭제, 수정할 수 있습니다.

데이터 추가:


using (var context = new MyDbContext())
{
    var person = new Person { Name = "Alice", Age = 30 };
    context.People.Add(person);
    context.SaveChanges();
}
데이터 삭제:

using (var context = new MyDbContext())
{
    var person = context.People.Find(1); // 예를 들어, ID가 1인 데이터 삭제
    if (person != null)
    {
        context.People.Remove(person);
        context.SaveChanges();
    }
}
데이터 수정:

using (var context = new MyDbContext())
{
    var person = context.People.Find(1); // 예를 들어, ID가 1인 데이터 수정
    if (person != null)
    {
        person.Age = 31; // 나이 수정
        context.SaveChanges();
    }
}
위의 코드는 Entity Framework를 사용하여 MySQL 데이터베이스에 데이터를 추가, 삭제, 수정하는 방법을 보여주는 간단한 예제입니다. 필요에 따라 연결 문자열 및 DbContext를 수정하여 실제 MySQL 데이터베이스에 연결하고 작업할 수 있습니다.
























 

'C#' 카테고리의 다른 글

이진 파일에 데이터 저장 및 로드  (0) 2023.09.05
텍스트 파일에 저장및 로드  (0) 2023.09.05
LINQ 쿼리  (0) 2023.09.05
foreach를 사용할 수 있는 일반화 클래스 -2  (0) 2023.09.05
LinkedList<T>  (0) 2023.09.05

관련글 더보기