C# Database에 연결하고 빠르게 값을 가져오는 방법 : with Dapper

C# 에서 데이터베이스에 연결하고 데이터를 가져오는 여러 가지 방법이 있습니다. 여기에서는 가장 빠르고 효율적인 방법을 설명합니다.
ADO.NET, EntityFramework, Dapper등을 활용한 방법이 대표적이며 그중 간단하게 사용할 수 있는 경량엔진 Dapper를 소개합니다.
Dapper 사용하여 값을 Select하고, Insert하는 간단한 방법을 실습해 보겠습니다.

Dapper 소개

Dapper는 SQL 쿼리를 실행하고 결과를 .NET 개체에 매핑할 수 있는 간단하고 가벼운 ORM(객체 관계 매핑) 프레임워크입니다. 이를 통해 데이터베이스와의 상호 작용을 간편하게 처리할 수 있습니다. Dapper는 특히 대규모 데이터 세트를 처리할 때 빠르고 효율적이며, 원시 SQL 쿼리를 사용하므로 SQL 실행을 완전히 제어할 수 있습니다. 또한 사용하기 쉽고 학습 곡선이 작아 인기를 끌고 있습니다.

다음은 Dapper를 사용하여 SQL Server 데이터베이스에서 고객 목록을 검색하는 방법의 예입니다:

using System;
using System.Data.SqlClient;
using Dapper;
using System.Linq;
using System.Collections.Generic;

public class Customer
{
    public int Id { get; set; }
    public string Name { get; set; }
    // 다른 속성들 추가
}

public class Program
{
    public static void Main()
    {
        string connectionString = "your_connection_string_here";

        using (var connection = new SqlConnection(connectionString))
        {
            connection.Open();
            var customers = connection.Query<Customer>("SELECT * FROM Customers");
            foreach (var customer in customers)
            {
                Console.WriteLine($"ID: {customer.Id}, Name: {customer.Name}");
            }
        }
    }
}

이 예제에서는 먼저 연결 문자열을 사용하여 SQL Server 데이터베이스에 대한 연결을 만듭니다. 그런 다음 Query 메서드를 사용하여 SQL 쿼리를 실행하고 결과를 Customer 개체 목록에 매핑합니다. 마지막으로 고객 목록을 반환하고 출력합니다.

예제 및 실습

우리는 여기에서 DB를 MSSQL 을 사용할 것이며 DATABASE는 MS 에서 제공하는 Sample Database를 사용 할 것입니다.

아래 링크에서 다운받을 수 있습니다.

https://learn.microsoft.com/ko-kr/dotnet/framework/data/adonet/sql/linq/downloading-sample-databases

C# .netframework 콘솔앱 으로 예제를 만들어 보도록 하겠습니다. 또한 Northwind 의 Categories 테이블을 이용해 보도록 하겠습니다.

C# Database에 연결하고 빠르게 값을 가져오는 방법 : with Dapper

예제 1 SELECT

  1. .netframework 콘솔앱 생성
  1. nuget 에서 Dapper 를 설치한다.
C# Database에 연결하고 빠르게 값을 가져오는 방법 : with Dapper
  1. App.config 에 연결문자열을 설정한다.
<connectionStrings>
    <add name="SqlServerConnString" providerName="System.Data.SqlClient" connectionString="Data Source=127.0.0.1;Initial Catalog=Northwind;User ID=*****;Password=*****;Encrypt=False" />
</connectionStrings>
  1. 테이블에 매핑된 클래스를 만들어준다.
    public class Categories
    {
        public int CategoryID { get; set; }
        public string CategoryName { get; set; }
        public string Description { get; set; }
    }
  1. Connect Database
static IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["SqlServerConnString"].ConnectionString);
  1. Query
String query = "select * from Categories";
var value = (List<Categories>)db.Query<Categories>(query);

이러면 value 변수에 모든 테이블 값들이 List 로 저장되게 됩니다.

전체 코드를 보면

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Data;
using System.Configuration;
using Dapper;

namespace ConsoleApp1
{
    internal class Program
    {
        static IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["SqlServerConnString"].ConnectionString);
        static void Main(string[] args)
        {
            String query = "select * from Categories";

            var value = (List<Categories>)db.Query<Categories>(query);

            foreach (var category in value) 
            {
                Console.WriteLine(category.CategoryID);
                Console.WriteLine(category.CategoryName);
                Console.WriteLine(category.Description);
                Console.WriteLine();
            }
        }
    }

    public class Categories
    {
        public int CategoryID { get; set; }
        public string CategoryName { get; set; }
        public string Description { get; set; }
    }
}

출력은 다음과 같습니다.

C# Database에 연결하고 빠르게 값을 가져오는 방법 : with Dapper

예제 2 Insert

  1. Insert 를 위해 다음 코드를 사용합니다.
Categories category = new Categories() { CategoryName="Dapper", Description ="Dapper Test"};
string query = @"Insert into Categories values (@CategoryName, @Description);
               SELECT CAST(SCOPE_IDENTITY() AS INT) ";
int CategoryID = db.Query<int>(query, category).Single();

DB 에 저장된 값을 보겠습니다.

C# Database에 연결하고 빠르게 값을 가져오는 방법 : with Dapper

다음 코드
SELECT CAST(SCOPE_IDENTITY() AS INT)
는 마지막으로 삽입된 테이블의 ID 를 반환합니다.
자동으로 추가되는 ID 값을 받아 올때 사용합니다.

다음은 Full Source 입니다.

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Data;
using System.Configuration;
using Dapper;
using System.Linq;

namespace ConsoleApp1
{
    internal class Program
    {
        static IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["SqlServerConnString"].ConnectionString);
        static void Main(string[] args)
        {
            Categories category = new Categories() { CategoryName="Dapper", Description ="Dapper Test"};
            string query = @"Insert into Categories values (@CategoryName, @Description);
                           SELECT CAST(SCOPE_IDENTITY() AS INT) ";
            int CategoryID = db.Query<int>(query, category).Single();

        }
    }

    public class Categories
    {
        public int CategoryID { get; set; }
        public string CategoryName { get; set; }
        public string Description { get; set; }
    }
}

Dapper의 장단점

Dapper의 장점

  1. 코드가 간결하고 이해하기 쉬움.
  2. ADO.NET과 거의 동일한 성능 제공.
  3. 객체 매핑 기능 지원.

Dapper의 단점

  1. 기본적인 자동화 기능 부족.
  2. 쿼리를 직접 작성해야 하므로 복잡한 SQL 관리가 어려울 수 있음.

결론

Dapper는 SQL 쿼리를 실행하고 결과를 .NET 개체에 매핑할 수 있는 간단하고 가벼운 ORM 프레임워크입니다.
빠르고 간단하게 프로그램을 개발할때 가장 적합한 프레임워크입니다.

Leave a Comment