ID: key_26_22_05_25_P3_3_2 Created date: 5월 25 2026 월요일
연관 문서
개요
이슈 전문 검색 및 고급 필터 API와 UI를 구현한다.
PostgreSQL Full-Text Search 또는 Elasticsearch를 활용한다.
- 예상 소요: 3~4일
- 선행 조건: Phase 2 완료, 검색 엔진 선택 결정
- 완료 기준: 키워드 검색 결과 500ms 이내 반환 확인
Claude Code 작업 수행서
작업 지시
CIRA 서버 + UI에 이슈 검색 기능을 구현해줘.
[검색 엔진 선택]
- Phase 1: PostgreSQL Full-Text Search (FTS)
- Phase 2 (선택): Elasticsearch 전환
[서버 수행 작업]
1. PostgreSQL FTS 설정
V140__add_search_vector.sql:
ALTER TABLE issues ADD COLUMN search_vector TSVECTOR;
CREATE INDEX idx_issues_search ON issues USING GIN(search_vector);
-- 트리거: issues INSERT/UPDATE 시 search_vector 자동 갱신
CREATE OR REPLACE FUNCTION update_issue_search_vector()
RETURNS TRIGGER AS $$
BEGIN
NEW.search_vector := to_tsvector('simple',
COALESCE(NEW.title, '') || ' ' || COALESCE(NEW.description, ''));
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER issue_search_vector_update
BEFORE INSERT OR UPDATE ON issues
FOR EACH ROW EXECUTE FUNCTION update_issue_search_vector();
2. 검색 API
GET /api/v1/search/issues
파라미터:
- q: 검색어 (FTS)
- projectId: 프로젝트 필터 (복수)
- status: 상태 필터 (복수)
- priority: 우선순위
- assigneeId: 담당자
- reporterId: 보고자
- issueType: 이슈 타입
- sprintId: 스프린트
- createdAfter / createdBefore: 날짜 범위
- page, size, sort
구현:
- JPA Specification 또는 QueryDSL로 동적 쿼리 빌드
- q가 있는 경우 FTS 적용 (ts_rank로 relevance 정렬)
- 없는 경우 일반 필터만 적용
- 검색 결과 하이라이팅 (ts_headline)
3. 저장된 필터 API
POST /api/v1/saved-filters — 현재 필터 저장
GET /api/v1/saved-filters — 내 저장 필터 목록
DELETE /api/v1/saved-filters/{id}
4. 자동완성 API
GET /api/v1/autocomplete
- type: ASSIGNEE / ISSUE_TYPE / SPRINT / STATUS
- keyword: 입력 중인 텍스트
- 디바운스 적용 (300ms)
[UI 수행 작업]
5. 글로벌 검색 바
파일: src/components/layout/GlobalSearch.tsx
- 헤더 중앙 검색 바 (단축키: Cmd+K)
- 검색어 입력 시 실시간 결과 팝업
- 결과: 이슈 목록 (최대 5건) + "전체 결과 보기" 링크
- 이슈 클릭 → 이슈 상세 이동
6. 고급 검색 페이지
파일: src/app/(main)/search/page.tsx
구성:
- 좌측: 필터 패널
* 프로젝트 (체크박스)
* 상태 (체크박스)
* 우선순위 (체크박스)
* 담당자 (멀티 셀렉트)
* 날짜 범위 (DateRangePicker)
- 우측: 검색 결과 목록
* 페이지네이션
* 정렬 (관련도 / 최신순 / 업데이트순)
- 상단: 현재 필터 요약 태그 + 초기화 버튼
- 필터 저장 버튼 → 이름 입력 → saved_filters 저장
7. URL 상태 동기화
- 모든 필터 파라미터를 URL 쿼리 스트링에 반영
- 공유 가능한 검색 URL
완료 기준
| 항목 | 기준 |
|---|---|
| FTS 검색 | 한국어 포함 키워드 검색 동작 |
| 다중 필터 조합 | 필터 5종 동시 적용 |
| 응답 속도 | 500ms 이내 |
| 필터 저장/불러오기 | 저장 후 재적용 동작 |
| 하이라이팅 | 검색어 매칭 부분 강조 |