007 Query Method

Query method #

쿼리 메소드 (Query method) #

  • ReactiveMongoRepository를 상속한 repository interface에 메소드를 추가
  • 메소드의 이름을 기반으로 Query 생성
  • 조회, 삭제 지원
  • @Query, @Update, @Aggregation 어노테이션을 사용해서 복잡한 쿼리 실행 가능 img.png

쿼리 메소드 - find #

  • id 뿐만 아니라 다른 필드를 이용해서 조회 가능
  • first 등의 키워드를 사용해서 query에 limit 제공 가능
  • 기존의 Entity 뿐만 아니라 Projection을 사용하여 일부 필드만 조회 가능 img_1.png

사용예제

  • findFirstByNameOrderByAgeDesc
    • name이 “taewoo”인 row들을 찾고
    • age 내림차순으로 sort 하여
    • limit을 1로
    • 모든 field를 조회하여
    • PersonDocument class로 mapping img_2.png img_3.png

쿼리 메소드 - delete #

  • 다른 필드를 이용해서 삭제 가능
  • 여러 반환 타입 지원
    • Long: 영향을 받은 row 수 반환
    • Flux: 삭제된 document 반환 img_4.png

사용예제

  • deleteByAgeGreaterThan
    • age가 100 초과인 document를 찾고
    • 삭제한 후
    • 영향을 받은 document가 있다면 Flux 형태로 반환 img_5.png

쿼리 메소드 시작 키워드 #

  • find, read, get, query, search, stream
    • find 쿼리를 실행하고 결과를 Publisher으로 반환
  • exists
    • find exists 쿼리를 실행하고 결과를 Publisher으로 반환
  • count
    • find count 쿼리를 실행하고 결과를 Publisher으로 반환
  • delete, remove
    • delete 쿼리를 실행하고 Publisher 혹은 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를 수행 img_6.png

쿼리 메소드 - @Aggregate #

  • @Aggregate를 이용해서 mongo aggregate수행
    • pipeline들을 array 형태로 전달
    • 각각의 pipeline이 순차적으로 수행되고 인자로 넘긴 값들이 사용 img_7.png

사용예제

  • aggregateGroupByName
    • 2개의 aggregate pipeline 포함
    • name이 주어진 인자와 같은 document만 필터
    • name으로 group 하여 count img_8.png img_9.png

@Transactional #

  • @Transactional를 사용하여 여러 query를 묶어서 진행
  • 새로운 Entity를 만들어서 save하고 update한 후 findAll을 통해서 모든 document 반환 img_10.png img_11.png

TransactionalOperator #

  • transactional 메소드를 통해서 주어진 Flux 혹은 Mono를 transaction 안에서 실행 img_12.png

  • flux를 바로 반환하지 않고 transactionalOperator의 transactional로 wrapping 하여 전달

  • 혹은 execute를 통해서 TransactionCallback 형태로 실행 img_13.png img_14.png


  1. 강의 : Spring Webflux 완전 정복 : 코루틴부터 리액티브 MSA 프로젝트까지_