>백엔드 개발 >Golang >페이지 매김을 한 단계 더 발전시키다: Go API의 정렬 및 필터링

페이지 매김을 한 단계 더 발전시키다: Go API의 정렬 및 필터링

Susan Sarandon
Susan Sarandon원래의
2025-01-23 00:38:11852검색

지난 게시물에서는 페이지 매김을 다루면서 대규모 API 응답을 관리 가능한 덩어리로 나누었습니다. 하지만 사용자가 데이터 정렬 방법을 제어하거나 특정 결과를 필터링할 수 있도록 하고 싶다면 다음 단계인 정렬을 수행할 준비가 된 것입니다. 필터링.
이러한 기능을 추가하여 API를 더욱 강력하게 만들어 보겠습니다.

이전 튜토리얼을 진행하지 않으셨다면 여기 링크를 확인하세요.

정렬 및 필터링이 중요한 이유

Image description
페이지 매김만으로는 항상 충분하지 않습니다. 사용자가 최신 항목을 검색하거나 특정 기간에 생성된 항목만 검색한다고 상상해 보세요. 정렬 및 필터링을 통해 사용자는 다음을 수행할 수 있습니다.

- 정렬: 결과 순서 선택(예: 최신 항목에서 오래된 항목 순)
- 필터: 필요한 항목으로 결과 범위를 좁힙니다(예: 오늘 생성된 항목)

페이지 매김과 정렬 및 필터링을 결합하여 보다 사용자 친화적인 API를 만듭니다.

데이터베이스 쿼리 확장

이전 블로그의 항목 테이블을 기반으로 작성하겠습니다. 요약하면 다음과 같습니다.

CREATE TABLE items (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    created_at TIMESTAMP DEFAULT NOW()
);

정렬 추가

정렬은 결과를 정렬하는 것입니다. 사용자는 이름 또는 Create_at 열을 기준으로 오름차순 또는 내림차순으로 정렬할 수 있습니다.

1단계: 정렬 매개변수 수락

사용자는 다음 두 가지 쿼리 매개변수를 전달합니다.

  • sort : 정렬 기준이 되는 열( name 또는 Created_at ).
  • order : 정렬 방향(asc 또는 desc).

예제 URL:

/items?page=1&limit=10&sort=created_at&order=desc

2단계: SQL 쿼리 조정

정렬을 포함하도록 SQL 쿼리를 동적으로 수정합니다.

// Extract sort and order query parameters
sort := r.URL.Query().Get("sort")
order := r.URL.Query().Get("order")

// Validate the sort column
validSortColumns := map[string]bool{"name": true, "created_at": true}
if !validSortColumns[sort] {
    sort = "created_at" // Default sort column
}

// Validate the sort order
if order != "asc" && order != "desc" {
    order = "asc" // Default sort order
}

// Modify the SQL query
query := fmt.Sprintf("SELECT id, name, created_at FROM items ORDER BY %s %s LIMIT  OFFSET ", sort, order)
rows, err := db.Query(query, limit, offset)
if err != nil {
    http.Error(w, "Failed to fetch items", http.StatusInternalServerError)
    return
}

필터링 추가

필터링을 통해 사용자는 검색 범위를 좁힐 수 있습니다. 예를 들어 날짜 범위를 기준으로 항목을 필터링하거나 이름에 특정 키워드가 포함된 항목을 필터링할 수 있습니다.

1단계: 필터 매개변수 수락

두 가지 필터를 지원합니다:

  • name : 특정 하위 문자열이 포함된 항목을 검색합니다.
  • created_after : 특정 날짜 이후에 생성된 항목을 가져옵니다.

예제 URL :

/items?page=1&limit=10&name=Item&created_after=2025-01-10 20:38:57.832777

2단계: SQL 쿼리 조정

이러한 필터를 처리하기 위해 WHERE 조건을 추가합니다.

CREATE TABLE items (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    created_at TIMESTAMP DEFAULT NOW()
);

향상된 API 테스트

  • 이름을 기준으로 오름차순 정렬:
/items?page=1&limit=10&sort=created_at&order=desc
  • 특정 날짜 이후에 생성된 항목 필터링:
// Extract sort and order query parameters
sort := r.URL.Query().Get("sort")
order := r.URL.Query().Get("order")

// Validate the sort column
validSortColumns := map[string]bool{"name": true, "created_at": true}
if !validSortColumns[sort] {
    sort = "created_at" // Default sort column
}

// Validate the sort order
if order != "asc" && order != "desc" {
    order = "asc" // Default sort order
}

// Modify the SQL query
query := fmt.Sprintf("SELECT id, name, created_at FROM items ORDER BY %s %s LIMIT  OFFSET ", sort, order)
rows, err := db.Query(query, limit, offset)
if err != nil {
    http.Error(w, "Failed to fetch items", http.StatusInternalServerError)
    return
}
  • 필터 결합 및 정렬:
/items?page=1&limit=10&name=Item&created_after=2025-01-10 20:38:57.832777

피해야 할 일반적인 실수

사용자 입력의 유효성을 검사하지 않음: 임의의 열이나 잘못된 정렬 순서를 허용하면 데이터베이스가 SQL 주입에 노출될 수 있습니다. 항상 입력을 검증하세요.

결론 / 다음 단계

여기에서 이 튜토리얼의 전체 코드 저장소를 찾을 수 있습니다

페이지 매김, 정렬, 필터링 기능이 탑재되어 이제 API가 더욱 사용자 친화적이고 유연해졌습니다. 더욱 고급 기능을 사용하려면 다음을 추가해 보세요.

  • 대규모 데이터세트를 위한 커서 기반 페이지 매김
  • 복잡한 검색을 위한 패싯 필터링

이러한 고급 기술을 살펴볼 다음 게시물을 계속 지켜봐 주시기 바랍니다!

Golang 개념, 프로젝트 등에 대한 자세한 정보를 얻고 튜토리얼에 대한 최신 정보를 얻으려면 Twitter 및 GitHub에서 Siddhesh를 팔로우하세요.

그때까지 계속 학습, 계속 구축 ??

위 내용은 페이지 매김을 한 단계 더 발전시키다: Go API의 정렬 및 필터링의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:Go의 흐름 제어 문다음 기사:Go의 흐름 제어 문