그렉 턴키스트, 『스프링 부트 실전 활용 마스터』의 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 쿼리를 사용하기 위해서는 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, 레디스와 호환 안됨 |
Ajax로 첨부파일 다운로드 구현 | 스프링 MVC (0) | 2024.03.08 |
---|---|
[SpringBoot] 리액티브 프로그래밍 | 간단한 이커머스 애플리케이션 예제 (0) | 2023.02.28 |
[SpringBoot] 리액티브 프로그래밍, 웹플럭스, 타임리프 간단한 예제 (0) | 2023.02.24 |
스프링부트 리액티브 프로그래밍 | 웹플럭스 (0) | 2023.02.22 |
JPA-style positional param was not an integral ordinal 오류 해결 (0) | 2022.07.28 |