---
## **📌 어떤 경우에 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 |