JEE 공간에 있고 최신 데이터 관리 계층을 원하는 경우 NoSql 애플리케이션를 사용하면 금방 한계에 부딪힐 수 있습니다. 다음과 같은 흥미로운 프로젝트가 있습니다. 최대 절전 모드 OGM 또는 델타스파이크의 데이터 모듈을 사용하지만, 그 중 어느 것도 Couchbase를 지원하지 않으며 Spring Data만큼 고급스럽지 않습니다.
하지만 Spring 데이터 프로젝트에는 CDI 확장이 있기 때문에 모든 것이 괜찮습니다. 즉, JEE 컨테이너에서 사용할 수 있습니다. Spring과 같은 다른 DI 프레임워크를 가져오는 것은 CDI가 이미 여기에 있기 때문에 약간의 오버헤드가 발생하지만, Spring Data의 모든 장점을 활용하면 오버헤드를 감수할 만한 가치가 있습니다.
이제 어떻게 작동하는지 살펴봅시다. 야생화 빠른 시작 가이드에서 제공되는 hibernate5 예제를 사용하고 Hibernate Core를 다음과 같이 대체하겠습니다. Spring 데이터 카우치베이스. 원본 코드를 찾을 수 있습니다. 여기 및 최종 마이그레이션된 코드 여기.
CDI로 Couchbase에 연결
가장 먼저 설정해야 할 것은 Couchbase 클러스터에 대한 연결입니다. CDI를 사용 중이므로 @Producer를 만들 수 있습니다. IP 주소, 버킷 이름, 관리자 로그인 및 비밀번호에 대한 속성을 외부화할 수 있는 방법에 대해서는 자세히 설명하지 않겠습니다. 기본값을 사용하겠습니다. 주소나 버킷 이름을 제공하지 않으면 SDK는 기본값이라는 버킷이 있는 로컬 호스트에서 Couchbase Server가 실행되고 있다고 가정합니다.
|
1 2 3 4 5 6 7 8 |
@Produces public CouchbaseOperations createCouchbaseTemplate() throws UnknownHostException, CouchbaseException { CouchbaseCluster cluster = CouchbaseCluster.create(); Bucket bucket = cluster.openBucket(); ClusterInfo clusterInfo = cluster.clusterManager("default","").info(); return new CouchbaseTemplate(clusterInfo, bucket); } |
이렇게 하면 Couchbase 리포지토리를 작동시키는 데 필요한 모든 것을 얻을 수 있습니다. 최신 버전에는 버그가 있다는 점에 유의하세요. 용접. 따라서 문제가 발생할 수 있습니다. 빠른 해결 방법을 찾을 수 있습니다. 여기. 기본적으로 문제는 Weld가 한정자를 저장하는 방식을 변경하여 더 이상 Bean 조회 방법(한정자 기반)과 호환되지 않는다는 것입니다. 그래서 CDI 확장 프로그램에서 직접 어노테이션을 처리하는 방식을 변경하여 일시적으로 문제를 해결했습니다. 샘플 코드는 다음과 같습니다:
|
1 2 3 4 5 6 7 8 9 10 11 12 |
void processBean(@Observes ProcessBean processBean) { Bean bean = processBean.getBean(); for (Type type : bean.getTypes()) { if (type instanceof Class<?> && CouchbaseOperations.class.isAssignableFrom((Class<?>) type)) { Set qualifiers = bean.getQualifiers().stream() .sorted((e1, e2) -> Integer.compare(e1.hashCode(), e2.hashCode())).collect(Collectors.toSet()); couchbaseOperationsMap.put(qualifiers, ((Bean) bean)); } } } |
Wildfly 10 또는 Jboss EAP 7을 사용하는 경우 이 버그가 발생할 가능성이 가장 높습니다.
Spring 리포지토리 통합
CouchbaseOperations 클래스에 대한 프로듀서가 있으면 리포지토리 생성을 시작할 수 있습니다. 아무것도 구현할 필요가 없는데, 이것이 바로 Spring Data의 장점 중 하나입니다. 여러분은 단지 카우치베이스 페이징 및 정렬 저장소 인터페이스를 사용하여 관리하려는 Entity 클래스와 키 유형을 지정합니다. 이 예제에서는 . 즉, 리포지토리는 멤버 엔티티를 저장할 때 Long 를 키로 설정합니다.
findAll이라는 메서드를 추가하여 정렬 객체를 매개변수로 지정합니다.
|
1 2 3 4 |
public interface MemberRepository extends CouchbasePagingAndSortingRepository { Iterable findAll(Sort sort); } |
이를 위해서는 MemberListProducer 를 사용하여 특정 방법을 사용할 수 있습니다. A 정렬 객체를 사용하면 정렬 방향과 필드에 사용할 필드뿐만 아니라 정렬.
|
1 2 3 4 5 |
@PostConstruct public void retrieveAllMembersOrderedByName() { members = memberRepository.findAll(new Sort(Sort.Direction.ASC, "name")); } |
이제 해당 프로젝트를 JEE 컨테이너에 배포할 준비가 되었습니다. Wildfly와 이 코드의 코드를 사용하는 경우 깃허브 리포지토리를 실행할 수 있습니다. MVN WILDFLY:배포 를 클릭하고 다음 URL로 이동합니다: https://localhost:8080/wildfly-springdata.
문제가 발생하거나 제안 사항이 있으면 아래 댓글 섹션에 알려주세요!