핵심 기능
동적 검색
다양한 필드에서 검색사용자가 필드 선택
자동 생성
SearchField enum 기반레이블 자동 매핑
URL 동기화
useListParams 통합북마크 가능한 검색
타입 안전
백엔드와 자동 동기화컴파일 타임 검증
자동 생성 조건
SearchFieldSelect는 백엔드에SearchField enum이 정의되면 자동으로 생성됩니다.
백엔드 정의
자동 생성되는 파일
컴포넌트:web/src/components/user/UserSearchFieldSelect.tsx
레이블: web/src/services/sonamu.generated.ts
기본 사용법
SearchFieldSelect + Input 조합
- 사용자가 SearchFieldSelect에서 “이메일” 선택
- Input에 “admin” 입력
- URL 업데이트:
?search=email&keyword=admin - API 호출:
UserService.useUsers("A", { search: "email", keyword: "admin" }) - 백엔드에서 이메일 필드를 “admin”으로 검색
SearchFieldSelect 상세
Props
기본 사용
textPrefix
각 옵션 앞에 텍스트를 추가합니다.clearable
“전체” 옵션을 추가합니다.clearable 사용 시나리오검색 필드를 선택하지 않고 전체 필드에서 검색하고 싶을 때 유용합니다. 단, 백엔드에서 전체 검색 로직을 별도로 구현해야 합니다.
검색 패턴
완전 일치 검색 (ID)
- 검색 필드: ID
- 키워드: “123”
- 결과: ID가 정확히 123인 사용자
부분 일치 검색 (문자열)
- 검색 필드: 이메일
- 키워드: “admin”
- 결과: “admin@example.com”, “super.admin@test.com” 등
대소문자 무시 검색
여러 필드 동시 검색
실전 예제
완전한 검색 UI
검색 히스토리
자동완성
고급 기능
빈 검색어 처리
최소 길이 제한
SQL 인젝션 방어
Puri 쿼리 빌더는 자동으로 파라미터 바인딩을 사용하므로 안전합니다.특수문자 이스케이프
LIKE 검색 시%, _ 같은 특수문자를 이스케이프해야 합니다.
커스터마이징
SearchFieldSelect 레이블 변경
검색 필드 그룹화
검색 필드별 placeholder 변경
백엔드 처리
exhaustive 패턴
모든 검색 필드를 처리했는지 컴파일 타임에 검증합니다.Fulltext 검색
대량의 텍스트 검색이 필요하면 Fulltext 인덱스를 사용합니다.문제 해결
SearchFieldSelect가 생성되지 않음
원인: 백엔드에SearchField enum이 없음
해결:
검색이 동작하지 않음
원인: 백엔드 Model에서search와 keyword 처리 누락
해결: user.model.ts의 findMany에서 검색 로직을 추가하세요.
한글 검색이 안됨
원인: 데이터베이스 charset/collation 설정 해결:관련 문서
- OrderBySelect - 정렬 컴포넌트
- useListParams - 목록 필터링 훅
- auto-generated-overview - 자동 생성 컴포넌트