저도공부를하긴한답니다?

병행 방법

쟉트 2025. 3. 5. 14:52
728x90


---

## **📌 어떤 경우에 EF Core를 병행하면 좋을까?**  
1. **단순 CRUD 작업 (ex: 사용자 테이블 등록, 수정, 삭제 등)**  
   - 복잡한 조인 없이 한 개 테이블에 대한 Insert, Update, Delete만 수행하는 경우  
   - EF Core의 **자동 변경 추적(Tracking)** 기능을 활용할 수 있는 경우  

2. **읽기 요청이 많지만, 특정 조회는 단순한 경우**  
   - 단순한 `SELECT * FROM Users WHERE Id = @id` 같은 작업에는 EF Core 사용 가능  
   - 하지만 **다중 테이블 조인이나 성능이 중요한 경우는 Dapper 사용**  

---

## **📌 실전 예제 (Dapper + EF Core 병행)**
아래 예제에서 **CRUD 작업은 EF Core로** 처리하고, **복잡한 쿼리는 Dapper로 최적화**하는 방식을 보여줄게.

### **1️⃣ EF Core 사용 (단순한 CRUD 예제)**  
사용자 정보를 저장하는 `User` 엔티티와, 이를 다루는 `UserRepository`를 EF Core로 구현해보자.

#### **📌 엔티티 클래스 (`User.cs`)**
```csharp
public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
}
```

#### **📌 EF Core 기반 CRUD Repository (`UserRepository.cs`)**
```csharp
public class UserRepository
{
    private readonly AppDbContext _context;

    public UserRepository(AppDbContext context)
    {
        _context = context;
    }

    // 사용자 추가 (INSERT)
    public async Task AddUser(User user)
    {
        _context.Users.Add(user);
        await _context.SaveChangesAsync();
    }

    // 사용자 정보 수정 (UPDATE)
    public async Task UpdateUser(User user)
    {
        _context.Users.Update(user);
        await _context.SaveChangesAsync();
    }

    // 사용자 삭제 (DELETE)
    public async Task DeleteUser(int userId)
    {
        var user = await _context.Users.FindAsync(userId);
        if (user != null)
        {
            _context.Users.Remove(user);
            await _context.SaveChangesAsync();
        }
    }
}
```
✅ **EF Core 장점:**  
- `Add()`, `Update()`, `Remove()` 메서드로 간단한 CRUD 처리 가능  
- 변경 사항 자동 추적(Tracking) → `SaveChangesAsync()`만 호출하면 업데이트 적용됨  
- 유지보수하기 쉽고 코드가 직관적임  

---

### **2️⃣ Dapper 사용 (복잡한 쿼리 최적화)**
하지만, **다중 테이블 조인이나 복잡한 SELECT 문이 필요한 경우에는 Dapper 사용**이 더 유리해.

#### **📌 Dapper 기반 Read Repository (`UserQueryRepository.cs`)**
```csharp
using System.Data;
using Dapper;
using Microsoft.Data.SqlClient;

public class UserQueryRepository
{
    private readonly string _connectionString;

    public UserQueryRepository(IConfiguration configuration)
    {
        _connectionString = configuration.GetConnectionString("DefaultConnection");
    }

    // 특정 사용자 정보와 관련 데이터를 함께 조회 (복잡한 쿼리)
    public async Task<UserDetailDto> GetUserWithOrders(int userId)
    {
        using (var connection = new SqlConnection(_connectionString))
        {
            var sql = @"
                SELECT u.Id, u.Name, u.Email, o.OrderCount 
                FROM Users u
                LEFT JOIN (
                    SELECT UserId, COUNT(*) AS OrderCount 
                    FROM Orders 
                    GROUP BY UserId
                ) o ON u.Id = o.UserId
                WHERE u.Id = @userId";
                
            return await connection.QueryFirstOrDefaultAsync<UserDetailDto>(sql, new { userId });
        }
    }
}
```
✅ **Dapper 장점:**  
- SQL을 직접 작성하여 최적화 가능  
- 다중 테이블 조인 시 빠름  
- ORM의 오버헤드 없이 즉시 실행됨  

---

## **📌 결론: 언제 EF Core를 쓰고, 언제 Dapper를 쓸까?**
### ✅ **EF Core 추천 (편의성 위주)**
- 단순 CRUD (Insert, Update, Delete) 작업  
- 자동 변경 추적 기능을 활용하는 경우  
- 코드 유지보수와 개발 생산성이 중요한 경우  

### ✅ **Dapper 추천 (성능 최적화 위주)**
- 다중 테이블 조인이나 대량 데이터 조회  
- 특정 필드만 선택적으로 조회하는 경우  
- 성능이 중요한 쿼리 (특히 복잡한 필터링, 통계 등)  

---

## **📌 네 프로젝트에 맞춘 추천**
**✔ 단순 CRUD → EF Core 사용**  
**✔ 복잡한 조회 쿼리 → Dapper 사용**  
이렇게 병행하면 **개발 생산성과 성능을 동시에 확보할 수 있어.**  
더 궁금한 점 있으면 질문해 줘!

'저도공부를하긴한답니다?' 카테고리의 다른 글

ef - dapper 비교  (0) 2025.03.05
Dapper 방식  (0) 2025.03.05
변경 추적  (0) 2025.03.05
db io, orm, gitea  (0) 2025.03.04
[TIL] 체크리스트 혹은 질문리스트  (0) 2025.02.24