개발노트

6. [ASP .NET Core] Dapper 본문

서버 개발/ASP .NET Core

6. [ASP .NET Core] Dapper

mroh1226 2025. 1. 27. 16:54
반응형

Dapper 는 .NET에서 사용되는 ORM 으로 이를 이용하면 좀 더 편하게 DB 작업이 가능하다.

  • Dapper는 DB에서 반환되는 테이블을 이용하여 객체와 맵핑이 가능하다.
  • TableValueParameter 사용으로 DB에 정의된 TVP를 매개변수로 이용가능하다.
  • 반환되는 테이블의 수가 여러개라면 QueryMultiple 로 처리가능하다.
  • ORM 이 외에도 저장 프로시저, 쿼리 다 사용가능하다. 
  • SplitOn 을 사용하여 Join 결과를 "Column1, Column2"와 같이 구분자를 지정, 이를 기준으로 여러개의 객체로 나누어 맵핑이 가능하다. (이를 통해 Json Depth 맵핑가능)

예시)

 

1. Dapper로 TVP 사용하기(AsTableValuedParameter)

using Dapper;
using System;
using System.Data.SqlClient;
using System.Data;

public class Example
{
    public void InsertMultipleData()
    {
        string connectionString = "your_connection_string_here";
        using (var connection = new SqlConnection(connectionString))
        {
            // TVP 데이터 생성
            var tableVal = new DataTable();
            tableVal.Columns.Add("Id", typeof(int));
            tableVal.Columns.Add("Name", typeof(string));

            tableVal.Rows.Add(1, "John");
            tableVal.Rows.Add(2, "Jane");

            // TVP 파라미터로 호출
            var param = new { MyTableType = tableVal.AsTableValuedParameter("dbo.MyTableType") };

            // TVP를 이용한 저장 프로시저 호출
            connection.Execute("dbo.InsertMyData", param, commandType: CommandType.StoredProcedure);
        }
    }
}

 

2.Dapper로 2개 이상의 반환 테이블 받아오기 (QueryMultiple)

public void GetMultipleResults()
{
    using (var connection = new SqlConnection("your_connection_string_here"))
    {
        var query = @"
            SELECT Id, Name FROM Users;
            SELECT OrderId, ProductName FROM Orders;
        ";

        var multi = connection.QueryMultiple(query);

        var users = multi.Read<User>().ToList();
        var orders = multi.Read<Order>().ToList();

        Console.WriteLine("Users:");
        foreach (var user in users)
        {
            Console.WriteLine($"{user.Id} - {user.Name}");
        }

        Console.WriteLine("Orders:");
        foreach (var order in orders)
        {
            Console.WriteLine($"{order.OrderId} - {order.ProductName}");
        }
    }
}

 

3. Join된 반환 결과를 객체를 나누어 객체에 맵핑 (Json Depth 고려 객체 안에 List 추가)

public void GetJoinedData()
{
    using (var connection = new SqlConnection("your_connection_string_here"))
    {
        var query = @"
            SELECT u.Id, u.Name, o.OrderId, o.ProductName 
            FROM Users u
            JOIN Orders o ON u.Id = o.UserId
        ";

        var result = connection.Query<User, Order, User>(
            query,
            (user, order) =>
            {
                user.Orders = user.Orders ?? new List<Order>();
                user.Orders.Add(order);
                return user;
            },
            splitOn: "OrderId"
        ).ToList();

        foreach (var user in result)
        {
            Console.WriteLine($"{user.Name}'s Orders:");
            foreach (var order in user.Orders)
            {
                Console.WriteLine($"Order: {order.ProductName}");
            }
        }
    }
}
반응형
Comments