Query method #
쿼리 메소드 (Query method) #
- ReactiveMongoRepository를 상속한 repository interface에 메소드를 추가
- 메소드의 이름을 기반으로 Query 생성
- 조회, 삭제 지원
- @Query, @Update, @Aggregation 어노테이션을 사용해서 복잡한 쿼리 실행 가능
쿼리 메소드 - find #
- id 뿐만 아니라 다른 필드를 이용해서 조회 가능
- first 등의 키워드를 사용해서 query에 limit 제공 가능
- 기존의 Entity 뿐만 아니라 Projection을 사용하여 일부 필드만 조회 가능
사용예제
- findFirstByNameOrderByAgeDesc
- name이 “taewoo”인 row들을 찾고
- age 내림차순으로 sort 하여
- limit을 1로
- 모든 field를 조회하여
- PersonDocument class로 mapping
쿼리 메소드 - delete #
- 다른 필드를 이용해서 삭제 가능
- 여러 반환 타입 지원
- Long: 영향을 받은 row 수 반환
- Flux: 삭제된 document 반환
사용예제
- deleteByAgeGreaterThan
- age가 100 초과인 document를 찾고
- 삭제한 후
- 영향을 받은 document가 있다면 Flux 형태로 반환
쿼리 메소드 시작 키워드 #
- find, read, get, query, search, stream
- find 쿼리를 실행하고 결과를 Publisher
으로 반환
- find 쿼리를 실행하고 결과를 Publisher
- exists
- find exists 쿼리를 실행하고 결과를 Publisher
으로 반환
- find exists 쿼리를 실행하고 결과를 Publisher
- count
- find count 쿼리를 실행하고 결과를 Publisher
으로 반환
- find count 쿼리를 실행하고 결과를 Publisher
- delete, remove
- delete 쿼리를 실행하고 Publisher
혹은 publisher 로 삭제된 개수 반환
- delete 쿼리를 실행하고 Publisher
- First
, Top - 쿼리의 limit을 N으로 설정. find와 By 사이 어디에든 등장 가능
- Distinct
- distinct 기능을 제공. find와 By 사이 어디에든 등장 가능
쿼리 메소드 지원 키워드 #
- And: $and
- Or: $or
- After: $gt
- Before: $lt
- Containing,:regex로 제공 (String), $in (Collection)
- Between, IsBetween: $gt, $lt
- EndingWith: regex로 제공
- Exists: $exists
- False, IsFalse: false와 비교
- GreaterThan: $gt
- GreaterThanEqual: $gte
- In: $in
- NotNull, IsNotNull: $ne:null
- Null, IsNull: null
- LessThan: $lt
- LessThanEqual: $lte
- Like: regex로 제공
- Near: $near
- Not: $not
- NotIn: $nin
- NotLike, IsNotLike: $not
- Regex,: $regex
- StartingWith: regex로 제공
- True, IsTrue: true와 비교
- Within, IsWithin: $geoWithin
- OrderBy: 주어진 property path와 direction에 따라서 쿼리에 Sort 제공
쿼리 메소드 - @Query #
- query가 메소드 이름으로 전부 표현이 되지 않는 경우
- 쿼리 메소드 예약어에서 지원되지 않는 문법을 사용하는 경우
- 복잡한 query문을 사용하는 경우
- @Update와 조합하여 update를 수행
쿼리 메소드 - @Aggregate #
- @Aggregate를 이용해서 mongo aggregate수행
- pipeline들을 array 형태로 전달
- 각각의 pipeline이 순차적으로 수행되고 인자로 넘긴 값들이 사용
사용예제
- aggregateGroupByName
- 2개의 aggregate pipeline 포함
- name이 주어진 인자와 같은 document만 필터
- name으로 group 하여 count
@Transactional #
- @Transactional를 사용하여 여러 query를 묶어서 진행
- 새로운 Entity를 만들어서 save하고 update한 후 findAll을 통해서 모든 document 반환
TransactionalOperator #
-
transactional 메소드를 통해서 주어진 Flux 혹은 Mono를 transaction 안에서 실행
-
flux를 바로 반환하지 않고 transactionalOperator의 transactional로 wrapping 하여 전달
-
혹은 execute를 통해서 TransactionCallback 형태로 실행
- 강의 : Spring Webflux 완전 정복 : 코루틴부터 리액티브 MSA 프로젝트까지_