Query Builder의 사용자 지정 설명 평가기 구현
- 주제:
- 개발
작성 대상:
- 관리자
- 개발자
이 문서에서는 사용자 지정 조건자 평가기를 구현하여 Query Builder을(를) 확장하는 방법을 설명합니다.
개요
쿼리 빌더를 사용하면 콘텐츠 리포지토리를 손쉽게 쿼리할 수 있습니다. AEM에는 데이터를 쿼리하는 데 도움이 되는 조건자 평가자 집합이 포함되어 있습니다.
그러나 일부 복잡성을 숨기고 더 나은 의미 체계를 보장하는 사용자 지정 술어 평가기를 구현하여 쿼리를 단순화할 수 있습니다.
사용자 지정 조건자는 XPath를 사용하여 직접 수행할 수 없는 다른 작업을 수행할 수도 있습니다. 예를 들면 다음과 같습니다.
- 다른 서비스에서 데이터 쿼리
- 계산을 기반으로 한 사용자 정의 필터링
- GitHub에서 aem-search-custom-predicate-evaluator 프로젝트 열기
- 프로젝트를 ZIP 파일(으)로 다운로드
술어 평가기 세부 정보
술어 평가기는 쿼리의 정의 제약 조건인 특정 술어의 평가를 처리합니다.
실제 콘텐츠 모델(예: metadata/@width > 200
)에 맞는 특정 JCR 쿼리에 더 높은 수준의 검색 제약 조건(예: width>200
)을 매핑합니다. 또는 수동으로 노드를 필터링하고 제약 조건을 확인할 수 있습니다.
복제 메타데이터에 대한 사용자 지정 설명 평가기 구현
이 섹션에서는 복제 메타데이터를 기반으로 데이터를 지원하는 사용자 정의 술어 평가기를 만드는 방법에 대해 설명합니다.
- 마지막 복제 작업의 날짜를 저장하는
cq:lastReplicated
- 마지막 복제 작업을 트리거한 사용자의 id를 저장하는
cq:lastReplicatedBy
- 마지막 복제 작업(예: 활성화, 비활성화)을 저장하는
cq:lastReplicationAction
기본 술어 평가자를 사용하여 복제 메타데이터 쿼리
다음 쿼리는 admin
이(가) 연도 시작 이후 활성화한 /content
분기의 노드 목록을 가져옵니다.
path=/content
1_property=cq:lastReplicatedBy
1_property.value=admin
2_property=cq:lastReplicationAction
2_property.value=Activate
daterange.property=cq:lastReplicated
daterange.lowerBound=2013-01-01T00:00:00.000+01:00
daterange.lowerOperation=>=
이 쿼리는 유효하지만 읽기가 어려우며 세 가지 복제 속성 간의 관계를 강조 표시하지 않습니다. 사용자 지정 술어 평가기를 구현하면 복잡성이 줄어들고 이 쿼리의 의미 체계가 향상됩니다.
목표
ReplicationPredicateEvaluator
의 목표는 다음 구문을 사용하여 위의 쿼리를 지원하는 것입니다.
path=/content
replic.by=admin
replic.since=2013-01-01T00:00:00.000+01:00
replic.action=Activate
복제 메타데이터 술어를 사용자 지정 술어 평가기와 그룹화하면 의미 있는 쿼리를 만드는 데 도움이 됩니다.
Maven 종속성 업데이트 중
먼저 프로젝트의 Maven 종속성을 업데이트해야 합니다. PredicateEvaluator
은(는) cq-search
아티팩트의 일부이므로 Maven pom 파일에 추가해야 합니다.
cq-search
이(가) OSGi
컨테이너에서 제공되므로 cq-search
종속성의 범위가 provided
(으)로 설정됩니다.다음 코드 조각은 pom.xml
파일의 차이점을 통합 차이점 형식으로 보여줍니다
@@ -120,6 +120,12 @@
<scope>provided</scope>
<dependency>
+ <groupid>com.day.cq</groupid>
+ <artifactid>cq-search</artifactid>
+ <version>5.6.4</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
<groupid>junit</groupid>
<artifactid>junit</artifactid>
<version>3.8.1</version></dependency>
ReplicationPredicateEvaluator 작성
cq-search
프로젝트에 AbstractPredicateEvaluator
추상 클래스가 포함되어 있습니다. 몇 가지 단계를 통해 사용자 지정 조건자 평가기 (PredicateEvaluator
을(를) 구현하면 이를 확장할 수 있습니다.
Xpath
식을 만드는 방법을 설명합니다. 행 단위로 데이터를 선택하는 includes
메서드를 구현하는 방법도 있습니다. 자세한 내용은 Java 설명서를 참조하세요.-
com.day.cq.search.eval.AbstractPredicateEvaluator
을(를) 확장하는 새 Java 클래스 만들기 -
통합 비교 형식으로 표시되는 코드 조각과 같은
@Component
(으)로 클래스에 주석을 답니다.@@ -19,8 +19,11 @@ */ package com.adobe.aem.docs.search; +import org.apache.felix.scr.annotations.Component; +import com.day.cq.search.eval.AbstractPredicateEvaluator; +@Component(metatype = false, factory = "com.day.cq.search.eval.PredicateEvaluator/repli") public class ReplicationPredicateEvaluator extends AbstractPredicateEvaluator { }
NOTE
factory
은(는)com.day.cq.search.eval.PredicateEvaluator/
(으)로 시작하고 사용자 지정PredicateEvaluator
이름으로 끝나는 고유한 문자열이어야 합니다.NOTE
PredicateEvaluator
의 이름은 쿼리를 작성할 때 사용되는 조건자 이름입니다. -
재정의:
public String getXPathExpression(Predicate predicate, EvaluationContext context)
재정의 메서드에서 인수에 지정된
Predicate
을(를) 기반으로Xpath
식을 만듭니다.
복제 메타데이터에 대한 사용자 지정 설명 평가기의 예
이 PredicateEvaluator
의 전체 구현은 다음 클래스와 유사할 수 있습니다.
/*
* #%L
* aem-docs-custom-predicate-evaluator
* %%
* Copyright (C) 2013 Adobe Research
* %%
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* #L%
*/
package com.adobe.aem.docs.search;
import org.apache.felix.scr.annotations.Component;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.day.cq.search.Predicate;
import com.day.cq.search.eval.AbstractPredicateEvaluator;
import com.day.cq.search.eval.EvaluationContext;
@Component(metatype = false, factory = "com.day.cq.search.eval.PredicateEvaluator/repli")
public class ReplicationPredicateEvaluator extends AbstractPredicateEvaluator {
static final String PE_NAME = "replic";
static final String PN_LAST_REPLICATED_BY = "cq:lastReplicatedBy";
static final String PN_LAST_REPLICATED = "cq:lastReplicated";
static final String PN_LAST_REPLICATED_ACTION = "cq:lastReplicationAction";
static final String PREDICATE_BY = "by";
static final String PREDICATE_SINCE = "since";
static final String PREDICATE_SINCE_OP = " >= ";
static final String PREDICATE_ACTION = "action";
Logger log = LoggerFactory.getLogger(getClass());
/**
* Returns a XPath expression filtering by replication metadata.
*
* @see com.day.cq.search.eval.AbstractPredicateEvaluator#getXPathExpression(com.day.cq.search.Predicate,
* com.day.cq.search.eval.EvaluationContext)
*/
@Override
public String getXPathExpression(Predicate predicate,
EvaluationContext context) {
log.debug("predicate {}", predicate);
String date = predicate.get(PREDICATE_SINCE);
String user = predicate.get(PREDICATE_BY);
String action = predicate.get(PREDICATE_ACTION);
StringBuilder sb = new StringBuilder();
if (date != null) {
sb.append(PN_LAST_REPLICATED).append(PREDICATE_SINCE_OP);
sb.append("xs:dateTime('").append(date).append("')");
}
if (user != null) {
addAndOperator(sb);
sb.append(PN_LAST_REPLICATED_BY);
sb.append("='").append(user).append("'");
}
if (action != null) {
addAndOperator(sb);
sb.append(PN_LAST_REPLICATED_ACTION);
sb.append("='").append(action).append("'");
}
String xpath = sb.toString();
log.debug("xpath **{}**", xpath);
return xpath;
}
/**
* Add an and operator if the builder is not empty.
*
* @param sb a {@link StringBuilder} containing the query under construction
*/
private void addAndOperator(StringBuilder sb) {
if (sb.length() != 0) {
sb.append(" and ");
}
}
}
Experience Manager
- 개요
- 릴리스 정보
- 릴리스 정보
- AEMaaCS 기능 릴리스 정보
- AEMaaCS 유지 관리 릴리스 정보
- Cloud Manager 릴리스 정보
- 마이그레이션 도구 릴리스 정보
- Experience Manager 강화 커넥터용 Workfront 릴리스 정보
- 베리에이션 생성 릴리스 정보
- 범용 편집기 릴리스 정보
- 새로운 기능
- AEM Cloud Service의 주요 변경 사항
- 사용 중단 및 제거된 기능과 API
- 프리릴리스 채널
- 보안
- AEM as a Cloud Service 보안 개요
- AEM as a Cloud Service에 대한 고급 네트워킹 구성
- AEM as a Cloud Service에 대한 IMS 지원
- AEM as a Cloud Service에 대한 Same Site 쿠키 지원
- 메일 서비스에 대한 OAuth2 지원
- WAF 규칙이 포함된 트래픽 필터 규칙
- Adobe Developer Console에서 JWT 자격 증명 사용 중단
- AEM as a Cloud Service에 대한 IMS 통합 설정
- Sling 서비스 사용자 매핑 및 서비스 사용자 정의의 모범 사례
- 온보딩
- AEM as a Cloud Service 마이그레이션 여정
- Sites
- AEM Cloud Service의 AEM Sites에 대한 주요 변경 사항
- Sites 및 Edge Delivery Services
- 작성
- 관리
- AEM as a Cloud Service와 통합
- AEM as a Cloud Service용 실제 사용 모니터링
- Assets
- 개요 및 새로운 기능
- Assets as a Cloud Service 주요 변경 사항
- Assets 아키텍처
- 지원되는 파일 형식
- 자산 마이크로서비스 개요
- Assets에서의 접근성
- Assets as a Cloud Service Ultimate
- Assets as a Cloud Service Ultimate 활성화
- Assets as a Cloud Service Prime
- Assets Collaborator 사용자
- AEM Assets를 통합하면서 Edge Delivery Services용 콘텐츠 작성
- 디지털 자산 관리
- 마이크로 프론트엔드 자산 선택기
- 마이크로 프론트엔드 대상 선택기
- 자산 공유
- 자산 재처리
- 자산 마이크로서비스 사용 시작하기
- 자산 추가 및 업로드
- 자산 검색
- 일반적인 자산 관리 작업
- 게시 관리
- 3D 자산 미리보기
- 이미지용 스마트 태그
- 비디오 자산에 스마트 태그 지정
- 자산 구성 방법
- Adobe Stock 자산 사용
- 컬렉션 관리
- 메타데이터 개요
- Adobe Creative Cloud와 통합
- 메타데이터 추가 또는 편집 방법
- 폴더 자산 및 컬렉션 검토
- Assets Insights 사용 및 구성
- 메타데이터 프로필
- 메타데이터 스키마
- 비디오 자산 관리
- MSM을 사용하여 자산 재사용
- 자산 다운로드
- 편집할 자산 체크인 및 체크아웃
- 비공개 폴더 생성 및 공유
- 자산용 Digital Rights Management
- 자산에 워터마크 추가
- Creative Cloud API를 사용하여 자산 처리
- 이미지용 색상 태그
- PDF 문서 관리
- Assets 구성, 관리 및 확장
- 자산 공유 및 배치
- 콘텐츠 조각
- Dynamic Media
- Dynamic Media 여정: 기본 사항
- Experience League의 Dynamic Media 뉴스레터 아카이브
- Dynamic Media 설정
- Dynamic Media를 사용하여 작업
- Dynamic Media 구성
- Dynamic Media Prime 및 Ultimate
- Dynamic Media Prime 및 Ultimate 활성화
- 옵션 - Dynamic Media, 일반 설정 구성
- 옵션 - Dynamic Media, 게시 설정 구성
- Dynamic Media 문제 해결
- Dynamic Media 별칭 계정 구성
- Dynamic Media에서의 접근성
- Dynamic Media 자산 관리
- 이미지 품질 최적화 모범 사례
- 이미지 프로필
- 비디오 프로필
- Dynamic Media 이미지 사전 설정 관리
- Dynamic Media 이미지 사전 설정 적용
- Dynamic Media 뷰어 사전 설정 관리
- Dynamic Media 뷰어 사전 설정 적용
- 일괄 처리 집합 사전 설정
- Dynamic Media의 방식으로 CDN 캐시 무효화
- Dynamic Media Classic의 방식으로 CDN 캐시 무효화
- 스마트 이미징
- 클라이언트측 디바이스 픽셀 비율을 활용한 스마트 이미징
- Dynamic Media 자산 전송
- Dynamic Media 템플릿
- Dynamic Media의 핫링크 보호 활성화
- 3D 지원
- Dynamic Media 제한 사항
- 이미지 세트
- 파노라마 이미지
- 혼합 미디어 세트
- 스핀 세트
- Dynamic Media의 비디오
- 슬라이드 배너
- 대화형 이미지
- 대화형 비디오
- 360 VR 비디오
- Dynamic Media 뷰어를 Adobe Analytics 및 Adobe Experience Platform 태그와 통합
- 빠른 보기를 사용하여 사용자 정의 팝업 만들기
- 반응형 사이트에 최적화된 이미지 게재
- Dynamic Media 자산 미리보기
- 페이지에 Dynamic Media 자산 추가
- 웹 페이지에 Dynamic Video 또는 Dynamic Image 뷰어 임베드
- 웹 애플리케이션에 URL 연결
- 규칙 세트를 사용하여 URL 변환
- Dynamic Media 자산 게시
- Dynamic Media의 선택적 게시를 사용하여 작업
- 선택기를 사용하여 작업
- 콘텐츠 FAQ의 HTTP2 게재
- Flash 뷰어 서비스 종료
- DHTML 뷰어 서비스 종료
- OpenAPI 기능이 포함된 Dynamic Media
- Assets 보기로 작업
- Content Hub
- 개요
- Content Hub 배포
- 브랜드 승인 자산을 Content Hub로 업로드 또는 가져오기
- Content Hub 사용자 인터페이스 구성
- Content Hub에 대한 자산 승인
- Content Hub에서 자산 검색
- 자산 속성
- Content Hub에서 자산 공유
- Content Hub를 사용하여 자산 다운로드
- Content Hub에서 라이선스가 부여된 자산 관리
- Content Hub에서 컬렉션 관리
- Content Hub에서 Adobe Express를 사용하여 이미지 편집
- Content Hub의 Asset Insights
- Content Hub에 대해 자주 묻는 질문
- 모범 사례
- Adobe Workfront와 통합
- Adobe Express와 통합
- Creative Cloud와 통합
- Forms
- 개요
- 설정 및 마이그레이션
- 통합
- 서비스
- Adobe Sign과 AEM Forms as a Cloud Service 통합
- DocuSign과 AEM Forms as a Cloud Service 통합
- Adobe Analytics에 적응형 양식 통합
- 적응형 양식 분석 보고서 보기 및 이해
- Adobe Workfront Fusion에 적응형 양식 제출
- Microsoft Power Automate와 적응형 양식 통합
- AEM Sites 페이지에 적응형 양식 임베드
- 외부 웹 페이지에 핵심 구성 요소 기반 적응형 양식 임베드
- 외부 웹 페이지에 기초 구성 요소 기반 적응형 양식 임베드
- Adobe Marketo Engage와 적응형 양식 통합
- Forms 데이터 모델
- 서비스
- 적응형 양식
- 적응형 양식 조각 만들기
- AEM Sites 페이지 또는 경험 조각에 적응형 양식 추가
- 핵심 구성 요소
- 적응형 양식 만들기
- 적응형 양식 만들기
- 핵심 구성 요소 기반 적응형 양식의 레이아웃 설정
- 적응형 양식 조각 만들기
- 적응형 양식의 테마 만들기 - 핵심 구성 요소
- 핵심 구성 요소 기반 적응형 템플릿 만들기
- XFA Forms 템플릿 기반 적응형 양식(핵심 구성 요소) 만들기
- 적응형 양식의 기록 문서 생성
- 기계 번역 또는 인간 번역을 사용하여 적응형 양식 번역
- 리디렉션 페이지 또는 감사 메시지 구성
- 반복 가능한 섹션으로 양식 만들기
- 적응형 양식에 대한 제출 액션 구성
- Azure Blob Storage에 적응형 양식 제출
- Microsoft에 적응형 양식 제출
- Microsoft® SharePoint에 적응형 양식 연결
- AEM 적응형 양식과 AEM Workflow 통합
- 적응형 양식의 REST 엔드포인트에 제출 액션 구성
- 적응형 양식의 이메일 보내기 제출 액션 구성
- 적응형 양식에서 Google reCAPTCHA 사용
- 적응형 양식 핵심 구성 요소의 hCaptcha 사용
- 적응형 양식 핵심 구성 요소의 Turnstile Captcha 사용
- 적응형 양식에서 사용자 정의 오류 핸들러 추가
- 핵심 구성 요소 기반 적응형 양식의 로케일 추가
- 적응형 양식에 대한 JSON 스키마 디자인 (핵심 구성 요소)
- 적응형 양식에 버전 관리, 댓글 및 주석 추가
- 적응형 양식 비교
- 사용자 정의 제출 액션 만들기
- Experience Manager Forms에서 게시 관리
- 핵심 구성 요소 기반 적응형 양식의 규칙 편집기 소개
- 핵심 구성 요소 기반 적응형 양식의 사용자 정의 함수 소개
- Forms 포털 및 해당 구성 요소 소개
- 적응형 양식 만들기
- 기초 구성 요소
- 적응형 양식 키워드
- 양식 미리보기
- 인터랙티브 커뮤니케이션
- Forms 중심 워크플로
- 커뮤니케이션 API
- 트랜잭션 보고서
- 개발자 API 참조
- 문제 해결
- Screens
- Content and Commerce
- Edge Delivery Services
- Edge Delivery Services 개요
- AEM과 함께 Edge Delivery Services 사용
- 작성 방법 선택
- WYSIWYG 작성
- 문서 기반 작성
- 애플리케이션 빌드
- 애플리케이션 실행
- Forms 빌드
- 개요
- WYSIWYG 작성
- Edge Delivery Services용 Forms Universal Editor 소개 - 전체 안내서
- 범용 편집기를 사용하여 작성을 시작하는 방법 - 단계별 자습서
- Universal Editor 인터페이스 안내서: 도구, 기능 및 탐색 설명
- 모바일 친화적인 Forms 만들기: 범용 편집기의 반응형 디자인
- 아름다운 Forms 디자인: 범용 편집기를 위한 스타일 및 테마 지정 가이드
- Forms에 동적 동작 추가: 규칙 편집기에 대한 전체 안내서
- 양식 제출 안내서: 양식 제출 작업 구성 및 사용자 지정
- 스팸으로부터 Forms 보호: reCAPTCHA 보안 추가
- Forms 게시 및 배포 방법: 범용 편집기 게시 안내서
- 사용자 지정 양식 구성 요소 빌드: 유니버설 편집기에 대한 개발자 안내서
- 문서 기반 작성
- 첫 번째 양식 작성: Google Sheets 및 Excel로 빠른 시작 안내서
- Google Sheets 또는 Excel을 사용하여 Forms을 만드는 방법: 단계별 안내서
- 적응형 양식 블록의 다양한 구성 요소
- 양식을 Google Sheets에 연결: 데이터 수집 설정 안내서
- 양식을 라이브로 만들기: 게시 및 데이터 수집 안내서
- 아름다운 Forms 디자인: 스타일 및 사용자 지정 안내서
- 성공 메시지 만들기: 양식의 감사 페이지 사용자 지정
- 양식 제출 안내서: Forms 제출 서비스 사용
- 동적 양식 필드: URL에서 옵션 로드
- 스마트 동작 추가: 양식 규칙 및 논리 안내서
- 동적 Forms 만들기: 반복 가능한 섹션 추가
- Forms 보호: reCAPTCHA 보안 추가
- Edge Delivery 리소스
- Headless
- 생성형 AI
- 구현
- AEM as a Cloud Service용 애플리케이션 구현
- Cloud Manager 사용
- AEM as a Cloud Service용 개발
- AEM 프로젝트 구조
- AEM 프로젝트 저장소 구조 패키지
- AEM as a Cloud Service SDK
- AEM 신속한 개발 환경
- AEM as a Cloud Service 개발 지침
- AEM as a Cloud Service Developer Console (Beta)
- 로깅
- 로그 전달
- 구성 및 구성 브라우저
- AEM 기술 기초
- API 참조 자료
- OpenAPI 기반 API
- 서버측 API용 액세스 토큰 생성
- 빠른 사이트 생성 및 프론트엔드 맞춤화
- 프론트엔드 파이프라인으로 Sites 개발
- 사이트 템플릿 및 테마 맞춤화
- AEM Headful 및 Headless
- Sling 모델 내보내기 도구를 통한 ResourceResolver 직렬화 비활성화
- 전체 스택 AEM 개발
- 범용 편집기
- Headless 경험 관리
- 하이브리드 및 SPA 개발
- 개발자 도구
- 개인화
- AEM as a Cloud Service 구성 및 확장
- AEM as a Cloud Service에 배포
- 작성자 계층
- 콘텐츠 게재 개요
- 커넥터
- 운영
- 규정 준수