5. DTO와 AutoMapper 그리고 Repository

5-4. Plant 저장소 인터페이스 추가

이 섹션에서는 데이터 관리를 위한 Repository 패턴의 도입과 구현 방법에 대해 배웁니다.

Repository 패턴은 데이터 액세스 로직과 비즈니스 로직을 분리하여 애플리케이션의 유지 보수성을 향상시키는 데 도움이 됩니다.

  1. Repository 폴더 생성: 프로젝트에 ‘Repository’ 폴더를 추가하고, 이 폴더 안에 ‘IRepository’ 인터페이스와 구현체를 위한 폴더를 생성합니다.
  2. IRepository 인터페이스 정의: 데이터 액세스를 위한 기본적인 메서드를 정의하는 IPlantRepository 인터페이스를 생성합니다. 이 인터페이스에는 다음과 같은 메서드가 포함됩니다:
    • Task Create(Plant plant): 비동기적으로 Plant 객체를 생성합니다.Task Remove(Plant plant): 주어진 Plant 객체를 삭제합니다.Task Save(): 변경 사항을 데이터베이스에 저장합니다.Task<List<Plant>> GetAll(Expression<Func<Plant, bool>> filter = null): 모든 Plant 객체를 검색하거나, 주어진 조건에 따라 필터링합니다.Task<Plant> Get(Expression<Func<Plant, bool>> filter, bool tracked = true): 단일 Plant 객체를 조건에 따라 검색하며, 필요에 따라 추적 여부를 설정할 수 있습니다.
  3. 메서드 설명:
    • Create, Remove, Save 메서드는 데이터 생성, 삭제, 저장 등의 기본적인 데이터 액세스 작업을 정의합니다.GetAllGet 메서드는 LINQ 표현식을 사용하여 데이터를 검색하고 필터링하는 기능을 제공합니다. Get 메서드의 tracked 매개변수는 Entity Framework Core의 추적 기능을 활성화하거나 비활성화할 수 있게 해줍니다.
  4. Repository 패턴의 장점:
    • 데이터 액세스 로직을 한 곳에 집중시켜 코드의 재사용성과 유지 보수성을 향상시킵니다.
    • 비즈니스 로직과 데이터 액세스 로직을 분리하여 애플리케이션의 구조를 명확하게 합니다.
    • 단위 테스트와 통합 테스트를 용이하게 합니다.
// IPlantRepository.cs
public interface IPlantRepository
{
    Task<List<Plant>> GetAll(Expression<Func<Plant, bool>> filter = null);
    Task<Plant> Get(Expression<Func<Plant, bool>> filter = null, bool tracked = true);
    Task Create(Plant entity);
    Task Remove(Plant entity);
    Task Save();
}