나만의 ASP.NET 프레임워크 시작 바로가기
🚀 [2단계] 핵심 목표: 데이터 계층(Data Layer) 추가
🧱 새로운 프로젝트 추가: HyochulLab.Data
📌 Visual Studio에서 새 Class Library 추가
- 프로젝트 이름: HyochulLab.Data
- 프레임워크: .NET 8
- 참조 추가:
- HyochulLab.Core
📦 NuGet 패키지 설치
dotnet add package Microsoft.EntityFrameworkCore
dotnet add package Microsoft.EntityFrameworkCore.SqlServer
dotnet add package Microsoft.EntityFrameworkCore.Abstractions
📂 기본 폴더 구조
HyochulLab.Data/
├── Context/
│ └── AppDbContext.cs
├── Entities/
│ └── User.cs
├── Interfaces/
│ └── IRepository.cs
├── Repositories/
│ └── Repository.cs
└── UnitOfWork/
└── UnitOfWork.cs
✅ 핵심 구성 예시
1. 📁 Entities/User.cs
namespace HyochulLab.Data.Entities;
public class User
{
public int Id { get; set; }
public string Name { get; set; } = string.Empty;
public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
}
2. 📁 Context/AppDbContext.cs
using Microsoft.EntityFrameworkCore;
using HyochulLab.Data.Entities;
namespace HyochulLab.Data.Context;
public class AppDbContext : DbContext
{
public AppDbContext(DbContextOptions<AppDbContext> options)
: base(options) { }
public DbSet<User> Users => Set<User>();
}
3. 📁 Interfaces/IRepository.cs
using System.Linq.Expressions;
namespace HyochulLab.Data.Interfaces;
public interface IRepository<T> where T : class
{
Task<T?> GetAsync(Expression<Func<T, bool>> predicate);
Task<IEnumerable<T>> GetAllAsync();
Task AddAsync(T entity);
void Remove(T entity);
}
4. 📁 Repositories/Repository.cs
using Microsoft.EntityFrameworkCore;
using System.Linq.Expressions;
using HyochulLab.Data.Interfaces;
using HyochulLab.Data.Context;
namespace HyochulLab.Data.Repositories;
public class Repository<T> : IRepository<T> where T : class
{
private readonly AppDbContext _context;
private readonly DbSet<T> _dbSet;
public Repository(AppDbContext context)
{
_context = context;
_dbSet = context.Set<T>();
}
public async Task<T?> GetAsync(Expression<Func<T, bool>> predicate) =>
await _dbSet.FirstOrDefaultAsync(predicate);
public async Task<IEnumerable<T>> GetAllAsync() =>
await _dbSet.ToListAsync();
public async Task AddAsync(T entity) => await _dbSet.AddAsync(entity);
public void Remove(T entity) => _dbSet.Remove(entity);
}
5. 📁 UnitOfWork/UnitOfWork.cs
using HyochulLab.Data.Context;
using HyochulLab.Data.Interfaces;
using HyochulLab.Data.Repositories;
namespace HyochulLab.Data.UnitOfWork;
public class UnitOfWork : IUnitOfWork
{
private readonly AppDbContext _context;
public IRepository<User> Users { get; }
public UnitOfWork(AppDbContext context)
{
_context = context;
Users = new Repository<User>(context);
}
public async Task<int> SaveChangesAsync() => await _context.SaveChangesAsync();
}
🧪 다음 단계 예고
다음엔 SampleApp에서:
- appsettings.json에 DB 연결 문자열 추가
- Program.cs에서 DbContext, UnitOfWork DI 등록
- UserController 만들어서 DB CRUD 테스트
.png)
댓글
댓글 쓰기