Sieve를 사용하여 .NET에서 필터링, 정렬 및 페이지 매김을 간편하게 | 나이미쉬 마크와나


요약

.NET에서 Sieve 라이브러리를 사용하여 API의 필터링, 정렬, 페이지네이션 기능을 쉽게 구현하는 방법을 다룬 튜토리얼입니다.

배경 및 필요성 현대 API에서는 목록 엔드포인트에 대한 필터링, 정렬, 페이지네이션 기능이 필수적입니다. 하지만 모든 쿼리에 대해 수동으로 이러한 로직을 작성하는 것은 모델이 발전함에 따라 복잡해집니다. Sieve는 이러한 복잡성을 해결하는 경량화된 선언적이고 확장 가능한 NuGet 패키지입니다.

Sieve의 특징

  • Entity Framework, Dapper, 심지어 인메모리 데이터와도 호환
  • 쿼리 스트링 입력을 기반으로 동적 쿼리 로직 처리
  • SieveModel을 통한 동적 쿼리 처리 구동
  • 사용자 정의 필터 지원 (예: IsAdult==true)

구현 단계

1단계: 프로젝트 설정 새 .NET Web API 프로젝트를 생성하고 Sieve 패키지를 추가합니다. 프로젝트 구조는 Controllers, Models, Filters, Data 폴더로 체계적으로 구성하여 깔끔한 컨트롤러, EF Core 확장 용이성, 유연하고 테스트 가능한 컴포넌트를 보장합니다.

2단계: User 모델 생성 Sieve.Attributes를 사용하여 각 속성에 대해 필터링 및 정렬 가능 여부를 지정합니다. Id, Name, Age, CreatedAt 속성을 가진 User 클래스에서 각 속성에 [Sieve(CanFilter = true, CanSort = true)] 어트리뷰트를 적용합니다.

3단계: 인메모리 데이터 스토어 생성 DataStore 클래스를 만들어 샘플 사용자 데이터를 List 형태로 저장합니다. Alice, Bob, Charlie, Diana, Eve 등 5명의 사용자 데이터를 포함합니다.

4단계: 커스텀 필터 추가 (선택사항) ISieveCustomFilterMethods 인터페이스를 구현하여 사용자 정의 필터를 생성합니다. 예를 들어 IsAdult 필터는 18세 이상인지 여부를 판단하는 로직을 포함합니다.

5단계: UsersController 생성 ISieveProcessor와 DataStore를 의존성 주입으로 받아 SieveModel을 쿼리 파라미터로 사용하는 GetUsers 메서드를 구현합니다. _sieveProcessor.Apply() 메서드를 통해 필터링, 정렬, 페이지네이션을 적용합니다.

6단계: DI 구성 Program.cs에서 ISieveProcessor, ISieveCustomFilterMethods, DataStore를 의존성 주입 컨테이너에 등록합니다.

SieveModel 구조 내장된 클래스로 Filters, Sorts, Page, PageSize 속성을 포함하여 쿼리 스트링 매개변수를 컨트롤러에서 사용할 수 있는 모델로 매핑합니다.

지원되는 필터 연산자

  • ==: 같음

  • !=: 같지 않음

  • > , <: 크다/작다

  • > =, <=: 크거나 같다/작거나 같다

  • @=: 포함 (LIKE %x%)

  • !@=: 포함하지 않음

테스트 URL 예시

  • /api/users?filters=Age>25&sorts=-CreatedAt&page=1&pageSize=2
  • /api/users?filters=Name@=a
  • /api/users?filters=IsAdult==true
  • /api/users?sorts=Age

결론 Sieve는 반복적인 필터링, 정렬, 페이징 로직 작성의 부담을 덜어줍니다. SieveModel, 어트리뷰트 기반 구성, 선택적 커스텀 필터를 통해 최소한의 노력으로 사용자에게 강력한 쿼리 기능을 제공할 수 있습니다. 깔끔한 컨트롤러 기반 구조를 사용함으로써 테스트와 확장이 용이하고 프로덕션 준비가 된 코드를 만들 수 있습니다.