상세 컨텐츠

본문 제목

[SpringBoot] 검색기능 구현, 몽고디비 쿼리 방법 정리

Framework/Spring | SpringBoot

by yooputer 2023. 3. 3. 09:49

본문

그렉 턴키스트, 『스프링 부트 실전 활용 마스터』의 2장 스프링부트 웹 애플리케이션 만들기를 요약한 내용입니다.

 

내용

스프링데이터 쿼리 메서드

쿼리 메서드를 활용해 검색기능 구현

커스텀 쿼리 작성

Example 쿼리

평문형 연산

쿼리 방법별 장단점 비교


스프링 데이터 쿼리 메서드

메소드 이름 규칙만 잘 지키면 쿼리문을 직접 작성할 필요 없이 스프링 데이터가 쿼리메서드를 자동으로 만들어준다.

 

쿼리 메서드관련 내용은 아래 링크에서 자세히 확인할 수 있다

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-methods

 

Spring Data JPA - Reference Documentation

Example 119. Using @Transactional at query methods @Transactional(readOnly = true) interface UserRepository extends JpaRepository { List findByLastname(String lastname); @Modifying @Transactional @Query("delete from User u where u.active = false") void del

docs.spring.io

 

리액터 기반 프로그래밍에서는 subscribe()메서드를 호출하기 위해 void 대신 Mono<Void>를 반환한다.


검색기능 구현

ItemRepository에 이름으로 검색하는 findByNameContaining() 메서드를 정의한다

Flux<Item> findByNameContaining(String partialName);

커스텀 쿼리 메서드

레파지토리 메소드만으로 처리하 수 없는 경우 커스텀 쿼리를 구현해야 한다.

@Query 어노테이션으로 개발자가 직접 작성한 쿼리문을 사용할 수 있다

 

커스텀 메서드 작성 예제는 다음과 같다

@Query("{'name' : ?0 , 'age' : ?1 ")
Flux<Item> findItemsForCustomerMonthlyReport(String name, int age);

@Query(sort = "{ 'age' : -1 }")
Flux<Item> findSortedStuffForWeeklyReport();

Example 쿼리

요구사항이 많아지면 메소드명은 점점 더 길어진다는 문제가 있다.

Example 쿼리는 단순한 조건들의 조합을 통해 원하는 결과를 얻어내는 쿼리 방식이다.

 

Example 쿼리를 사용하기 위해서는 ReactiveQueryByExampleExecutor을 상속받는 레파지토리를 정의해야 한다

public interface ItemByExampleRepository extends ReactiveQueryByExampleExecutor<Item> {
}

 

Example 쿼리는 다음과 같이 사용할 수 있다

Flux<Item> searchByExample(String name, double price, boolean useAnd){
    Item item = new Item(name, price);

    ExampleMatcher matcher = (useAnd
            ? ExampleMatcher.matchingAll()
            : ExampleMatcher.matchingAny())
                .withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING)
                .withIgnoreCase()
                .withIgnorePaths("id");
    
    Example<Item> probe = Example.of(item, matcher);
    
    return exampleRepository.findAll(probe);
    
}

 


평문형 연산

평문형 연산이란 여러 연산을 메소드를 사용해 문장처럼 작성하는 방식이다

스프링 데이터 몽고디비에서는 ReactiveFluent MongoOperations를 통해 평문형 연신 기능을 사용할 수 있다

평문형 API에서는 비어있는 필드나 부분일치 기능은 사용할 수 없다.


몽고디비 쿼리 방법 비교

쿼리 방법 장점 단점
쿼리 CRUD 메소드 미리 정의되어 있음
데이터 스토어간의 호환성
도메인 객체별로 인터페이스 작성 필요
메소드 이름 기반 쿼리 직관적
여러 데이터 스토어에서 모두 지원
도메인 객체마다 레파지토리 작성  필요
복잡한 쿼리는 메소드 이름이 매우 길어짐
Example 쿼리 모든 쿼리 조건을 미리 알 수 없을 때 유용 도메인 객체마다 레파지토리 작성 필요
MongoOperations 도메인 객체마다 별도의 인터페이스 작성 불필요 데이터 스토어에 종속적
@Query  몽고QL 사용 가능
긴 메소드 이름 불필요
데이터 스토어에 종속적
평문형 API 직관적
도메인 객체마다 별도의 인터페이스 작성 불필요
데이터 스토어에 종속적
JPA, 레디스와 호환 안됨

관련글 더보기