Coroutine 조회와 cardinality
최신 안정판 Bluetape4k 1.11.0 릴리스 기준
여러 문서는 Flow
섹션 제목: “여러 문서는 Flow”findAsFlow<T>(query)와 findAllAsFlow<T>()는 Spring Data publisher에 asFlow()를 적용합니다. 함수 호출만으로 query 결과가 list에 적재되지는 않습니다. consumer가 수집할 때 subscription이 시작됩니다.
fun findAdults(city: String): Flow<User> { val query = queryOf( "age".criteria() gte 20, "city".criteria() eq city, ).sortAscBy("name")
return mongoOperations.findAsFlow(query)}0건은 빈 Flow입니다. 같은 Flow를 다시 수집하면 새 subscription과 query가 생길 수 있습니다.
Nullable 조회와 필수 조회
섹션 제목: “Nullable 조회와 필수 조회”| 기대 결과 | API | 0건 |
|---|---|---|
| 문서가 없어도 정상 | findOneOrNullSuspending<T>, findByIdOrNullSuspending<T> | null |
| 반드시 한 문서가 있어야 함 | findOneSuspending<T>, findByIdSuspending<T> | NoSuchElementException |
두 계열은 각각 awaitSingleOrNull()과 awaitSingle()을 사용합니다. connection이나 mapping 실패를 null로 바꾸는 API는 아닙니다.
suspend fun requireUser(id: String): User = mongoOperations.findByIdSuspending(id)
suspend fun findUser(id: String): User? = mongoOperations.findByIdOrNullSuspending(id)HTTP 404 같은 domain 의미는 repository 밖에서 null을 해석해 붙입니다. driver 장애까지 404로 바꾸면 운영에서 데이터 부재와 장애를 구분할 수 없습니다.
Count와 exists
섹션 제목: “Count와 exists”countSuspending<T>(query)는 Long, existsSuspending<T>(query)는 Boolean을 반환합니다. 존재 여부만 필요할 때 document를 읽어 list로 만들지 않습니다.
suspend fun emailExists(email: String): Boolean = mongoOperations.existsSuspending<User>( queryOf("email".criteria() eq email) )0건은 0L 또는 false이며 실패가 아닙니다.
Cancellation과 backpressure
섹션 제목: “Cancellation과 backpressure”Flow 수집 취소는 reactive subscription에 전달됩니다. 호출자가 취소한 작업을 catch { emit(...) }으로 정상 데이터처럼 바꾸지 않습니다. 결과가 매우 크면 limit와 정렬을 query에 명시하고 consumer 처리량, pool 점유 시간을 함께 관찰합니다.
Source와 tests
섹션 제목: “Source와 tests”ReactiveMongoOperationsCoroutines.ktReactiveMongoOperationsCoroutinesTest.ktQueryExtensionsTest.kt
다음 읽을 장
섹션 제목: “다음 읽을 장”쓰기와 원자적 연산에서 write API별 결과와 원자성 범위를 구분합니다.