Skip to main content
Sonamu의 검색 기능은 SearchFieldSelect (검색 대상 필드)와 Input (검색 키워드)를 조합하여 구현합니다. 이를 통해 사용자가 ID, 이름, 이메일 등 다양한 필드에서 검색할 수 있습니다.

핵심 기능

동적 검색

다양한 필드에서 검색사용자가 필드 선택

자동 생성

SearchField enum 기반레이블 자동 매핑

URL 동기화

useListParams 통합북마크 가능한 검색

타입 안전

백엔드와 자동 동기화컴파일 타임 검증

자동 생성 조건

SearchFieldSelect는 백엔드에 SearchField enum이 정의되면 자동으로 생성됩니다.

백엔드 정의

자동 생성되는 파일

컴포넌트: web/src/components/user/UserSearchFieldSelect.tsx 레이블: web/src/services/sonamu.generated.ts

기본 사용법

SearchFieldSelect + Input 조합

동작 흐름:
  1. 사용자가 SearchFieldSelect에서 “이메일” 선택
  2. Input에 “admin” 입력
  3. URL 업데이트: ?search=email&keyword=admin
  4. API 호출: UserService.useUsers("A", { search: "email", keyword: "admin" })
  5. 백엔드에서 이메일 필드를 “admin”으로 검색

SearchFieldSelect 상세

Props

기본 사용

textPrefix

각 옵션 앞에 텍스트를 추가합니다.

clearable

“전체” 옵션을 추가합니다.
clearable 사용 시나리오검색 필드를 선택하지 않고 전체 필드에서 검색하고 싶을 때 유용합니다. 단, 백엔드에서 전체 검색 로직을 별도로 구현해야 합니다.

검색 패턴

완전 일치 검색 (ID)

사용자 경험:
  • 검색 필드: ID
  • 키워드: “123”
  • 결과: ID가 정확히 123인 사용자

부분 일치 검색 (문자열)

사용자 경험:

대소문자 무시 검색

여러 필드 동시 검색

실전 예제

완전한 검색 UI

검색 히스토리

자동완성

고급 기능

빈 검색어 처리

이유: 빈 문자열로 검색하면 모든 결과가 나와 의도치 않은 동작이 발생할 수 있습니다.

최소 길이 제한

SQL 인젝션 방어

Puri 쿼리 빌더는 자동으로 파라미터 바인딩을 사용하므로 안전합니다.

특수문자 이스케이프

LIKE 검색 시 %, _ 같은 특수문자를 이스케이프해야 합니다.

커스터마이징

SearchFieldSelect 레이블 변경

검색 필드 그룹화

검색 필드별 placeholder 변경

백엔드 처리

exhaustive 패턴

모든 검색 필드를 처리했는지 컴파일 타임에 검증합니다.
장점: SearchField enum에 새 필드를 추가하면 컴파일 에러가 발생하여 누락을 방지합니다.

Fulltext 검색

대량의 텍스트 검색이 필요하면 Fulltext 인덱스를 사용합니다.

문제 해결

SearchFieldSelect가 생성되지 않음

원인: 백엔드에 SearchField enum이 없음 해결:

검색이 동작하지 않음

원인: 백엔드 Model에서 searchkeyword 처리 누락 해결: user.model.tsfindMany에서 검색 로직을 추가하세요.

한글 검색이 안됨

원인: 데이터베이스 charset/collation 설정 해결:

관련 문서