코틀린 마이크로 서비스 개발

chaejm55·2022년 12월 19일
0

GDSC-KNU-2nd-Backend

목록 보기
2/10

본 포스팅은 책 코틀린 마이크로서비스 개발을 읽고 작성하였습니다.
gdsc 백엔드 스터디를 통해 작성한 게시물입니다.

1. Mono, Flux

Reactor가 제공하는 각 상황에 특화된 publisher 구현체입니다.

1) Mono - 0~1개의 결과를 반환하는데 특화된 구현체

완료 시 onComplete, 에러 발생 시 onError를 이벤트를 반환합니다.
0~1개 결과 반환 시에는 Flux가 아닌 Mono를 사용해야합니다.

2) Flux- 0~N개의 결과를 반환하는데 특화된 구현체

데이터 전송 완료까지 계속하여 stream이 생성됩니다.
마찬가지로 데이터 전송 모두 완료 시 onComplete, 에러 발생 시 onError를 이벤트를 반환합니다.
데이터 전달마다 onNext 이벤트를 발생시킵니다.
보통 생성 시에 flatMap, map을 이용하여 flux를 생성합니다.

2. RouterFunction

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)
            }
        }
    }
}

  • 주 생성자로 Handler 의존성을 주입합니다.
  • .nest로 공통 URI를 정의합니다.
  • Verb("Path", Handler::method) 형태로 사용합니다.

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()


3. SpEL

스프링 표현 언어(Spring Expression Language)의 약자로 런타임에서 객체의 조작을 가능하게 합니다.
잘 정리된 좋은 글이 있어 링크로 대체합니다.

4. fromObject()

책에서는 fromObject()를 사용하지만 이는 현재 deprecated 되어 fromValue로 변경 되었습니다.

5. 마이크로 서비스 레이어

1) 라우터

리액티브 서비스가 응답하는 경로와 메소드를 처리합니다.

2) 핸들러

구체적인 요청을 응답으로 변환하는 로직을 수행합니다.

3) 서비스

도메인의 비즈니스 로직을 캡슐화 합니다.

6. 오류 처리/게시

1) onErrorResume()

해당 오류 처리 가능을 모든 퍼블리셔에게 알립니다.

2) Mono.error()

해당 오류를 게시하고, 오류를 포함하는 Mono를 생성합니다.

7. References

코틀린 마이크로 서비스 개발

[Webflux]💙Mono와 Flux > Reactor > Reactive Streams 이해"

Kotlin 에서 Validation 사용시 주의할 점

Spring Expression Language(SpEL) 에 대해

profile
여러가지를 시도하는 학생입니다

0개의 댓글