ID: key_26_22_05_25_P4_4_5 Created date: 5월 25 2026 월요일

연관 문서


개요

JQL(CIRA Query Language) 파서를 구현하여 고급 이슈 검색을 지원한다.
Jira JQL과 유사한 문법으로 복잡한 조건 조합을 가능하게 한다.


CQL 문법 정의 (CIRA Query Language)

project = "CIRA" AND status = "In Progress" AND assignee = currentUser()
priority in (HIGH, HIGHEST) AND due <= "2026-06-30"
text ~ "로그인" AND createdDate >= -7d
sprint in openSprints() ORDER BY priority DESC, updated DESC

Claude Code 작업 수행서

작업 지시

CIRA 서버 + UI에 CQL(CIRA Query Language) 고급 검색을 구현해줘.

[서버 수행 작업]

1. CQL 파서 구현
   파일: src/main/java/.../search/cql/
   ├── CqlLexer.java       — 토크나이저
   ├── CqlParser.java      — 파서 (재귀 하강 파싱)
   ├── CqlAst.java         — AST 노드 정의
   └── CqlQueryBuilder.java — AST → JPA Specification 변환

   지원 연산자:
   - 비교: =, !=, <, <=, >, >=
   - 텍스트: ~ (contains), !~ (not contains)
   - 컬렉션: in (...), not in (...)
   - 논리: AND, OR, NOT
   - 정렬: ORDER BY {field} ASC/DESC

   지원 필드:
   - project, status, assignee, reporter, priority
   - issueType, sprint, text, created, updated, due
   - storyPoints, labels

   지원 함수:
   - currentUser(): 현재 로그인 사용자
   - openSprints(): 현재 활성 스프린트
   - closedSprints(): 종료된 스프린트
   - now(): 현재 시각
   - startOfDay(), endOfDay()

2. CQL API
   POST /api/v1/search/cql
   Request: { "cql": "project = CIRA AND status = 'In Progress'", "page": 0, "size": 20 }
   Response: PageResponse<IssueSummaryResponse>
   - CQL 파싱 오류 시: 400 + 오류 위치 및 메시지

3. CQL 유효성 검증 API
   POST /api/v1/search/cql/validate
   Request: { "cql": "..." }
   Response: { "valid": true } 또는 { "valid": false, "error": "...", "position": 15 }
   → 에디터 실시간 검증에 활용

4. 자동완성 API 확장
   GET /api/v1/search/cql/autocomplete
   파라미터: cql(현재 입력 중 CQL), cursor(커서 위치)
   Response: { "suggestions": ["In Progress", "In Review", "Done"] }
   → 현재 커서 위치의 필드/값 자동완성

[UI 수행 작업]

5. CQL 에디터 컴포넌트
   파일: src/components/search/CqlEditor.tsx
   - CodeMirror 6 기반 에디터
   - 구문 하이라이팅 (키워드: 파란색, 문자열: 초록색, 연산자: 주황색)
   - 자동완성: 300ms 디바운스 후 서버 API 호출
   - 실시간 유효성 검증 (입력 중지 500ms 후)
   - 에러 언더라인 + 툴팁
   - 이전 CQL 히스토리 (localStorage, 최대 20건)

6. CQL 검색 페이지
   파일: src/app/(main)/search/advanced/page.tsx
   - 상단: CQL 에디터 (전체 너비)
   - "기본 검색으로 전환" 링크 (↔ [[3-2_검색-필터-API-UI]] 기본 검색)
   - 결과: 이슈 목록 테이블
   - 저장된 CQL 필터 사이드바

7. Basic ↔ Advanced 전환
   - 기본 검색 필터 → CQL 자동 변환
     예: status=In Progress, assignee=나 → "status = 'In Progress' AND assignee = currentUser()"
   - CQL → 기본 검색 변환 (단순 쿼리만 지원, 복잡한 경우 고급 모드 유지)

완료 기준

항목기준
CQL 파싱기본 5종 연산자 동작
함수 지원currentUser(), openSprints()
실시간 자동완성필드값 후보 300ms 내 반환
에러 표시오류 위치 언더라인 + 메시지
기본↔고급 전환단순 쿼리 양방향 변환
응답 속도CQL 실행 1초 이내 (10,000 이슈 기준)