본 포스팅은 책
코틀린 마이크로서비스 개발을 읽고 작성하였습니다.
gdsc 백엔드 스터디를 통해 작성한 게시물입니다.
Reactor가 제공하는 각 상황에 특화된 publisher 구현체입니다.
완료 시 onComplete, 에러 발생 시 onError를 이벤트를 반환합니다.
0~1개 결과 반환 시에는 Flux가 아닌 Mono를 사용해야합니다.
데이터 전송 완료까지 계속하여 stream이 생성됩니다.
마찬가지로 데이터 전송 모두 완료 시 onComplete, 에러 발생 시 onError를 이벤트를 반환합니다.
데이터 전달마다 onNext 이벤트를 발생시킵니다.
보통 생성 시에 flatMap, map을 이용하여 flux를 생성합니다.
Controller의 다른 방식입니다.
URI와 Verb를 정의하는 RouterClass와 실행할 로직을 정의하는 HandlerClass로 구성되어 사용됩니다.
RouterClass
@Component
class CustomerRouter(private val customerHandler: CustomerHandler) {
@Bean
fun customerRoutes() = router {
"/functional".nest {
"/customer".nest { // URI
GET("/{id}", customerHandler::get) // Verb
POST("", customerHandler::create)
}
"/customers".nest {
GET("", customerHandler::search)
}
}
}
}
HandlerClass
@Component
class CustomerHandler(val customerService: CustomerService) {
fun get(serverRequest: ServerRequest) =
customerService.getCustomer(serverRequest.pathVariable("id").toInt())
...
// queryParam
fun search(serverRequest: ServerRequest) =
ok().body(customerService.searchCustomers(serverRequest.queryParam("nameFilter").orElse("")),
Customer::class.java)
fun create(serverRequest: ServerRequest) =
customerService.createCustomer(serverRequest.bodyToMono())
...
.onErrorResume(Exception::class) { // 오류 처리 (처리 가능함을 모든 publisher에게 알림)
badRequest().body(fromValue(ErrorResponse("error creating customer",
it.message?:"error")))
}
}
pathvariable 받기 - serverRequest.pathVariable()
requestParam 받기 - serverRequest.queryParam()
스프링 표현 언어(Spring Expression Language)의 약자로 런타임에서 객체의 조작을 가능하게 합니다.
잘 정리된 좋은 글이 있어 링크로 대체합니다.
책에서는 fromObject()를 사용하지만 이는 현재 deprecated 되어 fromValue로 변경 되었습니다.
리액티브 서비스가 응답하는 경로와 메소드를 처리합니다.
구체적인 요청을 응답으로 변환하는 로직을 수행합니다.
도메인의 비즈니스 로직을 캡슐화 합니다.
해당 오류 처리 가능을 모든 퍼블리셔에게 알립니다.
해당 오류를 게시하고, 오류를 포함하는 Mono를 생성합니다.
[Webflux]💙Mono와 Flux > Reactor > Reactive Streams 이해"