레포지토리는 정적 타입을 가지는 데 이는 엔티티가 증가할 때마다 레포지토리를 추가로 생성해야 하는 불편함을 줍니다. 지네릭은 동적으로 타입을 지정하는 기능으로 지네릭 레포지토리를 사용하여 하나의 레포지토리를 여러 엔티티가 공유하는 방법을 보겠습니다.
프로젝트 구성하기
프로젝트 생성 및 기본구조 구성
서버 아키텍처 - 프로젝트 분산하기
서버 구조 인터페이스는 서버에 대한 요청과 응답처리하며 데이터베이스에 전송할 쿼리를 작성하고 데이터를 받는 역할을 수행하는 인프라스트럭처 프로젝트에 의존합니다. 인프라스트럭처
jin-co.tistory.com
MVC 패턴구현하기
서버 아키텍처 - 엠브이씨
비즈니스 로직과 데이터를 처리하는 코드는 분산하는 것이 좋습니다. 엔티티프레임워크는 MVC 패턴을 제공하는데요. 사용법을 살펴보겠습니다. 프로젝트 구성하기 프로젝트 생성 및 기본구조
jin-co.tistory.com
레포지토리 구성
서버 아키텍처 - 레포지토리
비즈니스 로직과 데이터를 처리하는 코드는 분산하는 것이 좋습니다. 엔티티프레임워크의 디비 콘텍스트 사용으로 두 코드의 분산은 가능하지만 프로젝트의 규모가 커지면 컨트롤러에서 디비
jin-co.tistory.com
인터페이스 사용하기
서버 아키텍처 - 레포지토리 (인터페이스 사용)
인터페이스는 필요한 사항을 규정하는 일종의 계약서로 레포지토리 패턴에 인터페이스를 추가해 보겠습니다. 프로젝트 구성하기 프로젝트 생성 및 기본구조 구성 서버 아키텍처 - 프로젝트 분
jin-co.tistory.com
지네릭 인터페이스 생성
인터페이스 폴더에 지네릭 인터페이스를 추가합니다
인터페이스에 아래와 같이 동적 타입을 지정하고 타입제한을 설정하고 (타입제한을 설정하지 않으면 추후 레포지토리에서 타입을 지정할 때 오류가 발생합니다)
public interface IGenericRepo<T> where T : <className>
필요한 메서드를 추가합니다
지네릭 레포지토리 생성
인프라스트럭처 폴더에 지네릭 레포지토리를 추가합니다
타입을 추가한 뒤 지네릭 인터페이스로 부터 상속받고 메서드를 구현합니다.
public class GenericRepo<T> : IGenericRepo<T> where T:Item
{
public List<T> GetAll()
{
throw new NotImplementedException();
}
}
메서드를 구현할 때 동적타입을 지정하기 위해 Set<T>()를 사용합니다
서비스 추가하기
생성한 인터페이스를 사용하려면 서비스로 등록이 필요합니다. 아래 코드를 Program.cs 파일에 추가합니다
builder.Services.AddScoped(typeof(IGenericRepo<>), typeof(GenericRepo<>));
컨트롤러 클래스에서 지네릭 레포지토리 메서드 호출하기
지네릭을 사용하지 않은 레포지토리 패턴은 아래와 같은데요. 먼저, 레포지토리를 지우고 지네릭 레포지토리를 주입합니다.
private readonly IGenericRepo<Item> _itemRepo;
public StoreController(IGenericRepo<Item> itemRepo)
{
this._itemRepo = itemRepo;
}
레포지토리에서 생성한 메서드를 호출합니다.
[HttpGet]
public List<Item> GetItems()
{
return _itemRepo.GetAll();
}
이상으로 지네릭 레포지토리 패턴을 사용하는 방법을 보았습니다.
'백엔드 > 닷넷' 카테고리의 다른 글
관계형 데이터 불러오기 (참조 데이터 포함) - 지네릭 레포지토리 패턴 (1) | 2023.04.15 |
---|---|
관계형 데이터 불러오기 (참조 데이터 포함) - 레포지토리 패턴 (0) | 2023.04.10 |
서버 아키텍처 - 레포지토리 (인터페이스 사용) (0) | 2023.04.07 |
서버 아키텍처 - 레포지토리 (0) | 2023.03.29 |
서버 아키텍처 - 엠브이씨 (2) | 2023.03.29 |